개발자 준비/네트워크

세션-쿠키 보안문제 해결

osul_world 2021. 11. 17. 09:18
728x90

세션


브라우저 쿠키 저장소에 쿠키 정보그대로 노출하여 저장하거나 HTTP 헤더에 그대로 담아 통신을 주고받는건 여러가지 보안상 문제가 있었다.

 

이를 해결하기 위해서는 결국 주요 정보의 실제 값은 서버에서 저장 및 관리 되어야한다.

 

쿠키의 실제 값은 서버에 추정 불가능한 임의의 식별값(세션ID)과 맵핑해두고 쿠키 실제값 대신 부여한 임의의 식별값(세션ID)을 통신에 이용하면 어떨까?

 

 

image

서버는 클라이언트에 mySessionId 라는 이름으로 세션ID 만 쿠키에 담아서 전달한다.

클라이언트는 쿠키 저장소에 mySessionId 쿠키를 보관한다.

이후 요청마다 mySessionId ="식별값" 을 HTTP HEADER 쿠키에 담아 전송하게 된다.

서버는 요청 HTTP 헤더쿠키에서 식별값을 추출해 서버에 존재하는 세션 저장소를 탐색한다.

해당 식별값과 맵핑된 원래 데이터를 꺼내 활용한다.

로그인 상태 유지를 예제로 들어보자

웹 브라우저(클라이언트)로 부터 입력한 id&pw 데이터가 서버에 도착하면 서버는 DB를 조회하여 가입한 회원인지 검사한다.

 

만약 가입회원이라면 회원정보를 쿠키로 생성하여 브라우저에게 응답해주고 브라우저는 쿠키에 회원정보를 저장해둔다.

 

바로 여기 "회원정보를 쿠키로 생성하여 브라우저에게 응답" 하는 상황에서

 

회원정보를 그대로 담는아 통신에 사용하는게 아니라 서버에서 관리되는 세션 저장소를 생성 임의의 추정불가능한 식별값과 쿠키데이터를 매핑해두고 실제 통신에는 이 식별값만 주고받는다.

 

요청시 서버에서는 이 식별값을 가지고 세션 저장소를 찾아 맵핑된 쿠키데이터를 활용한다.

 

세션의 장점

클라이언트와 서버는 서로 실제 데이터를 쿠키로 직접 전달하지 않고 추정불가능한 임의의 값을 대신 이용하게 된다.

 

이후 요청시 임의의 값이 쿠키헤더에 담겨 넘어오게 되면 서버는 세션저장소를 조회해서 보관한 실제 데이터를 활용하여 로직을 처리한다.

 

정리

세션 생성

sessionId 생성 (임의의 추정 불가능한 랜덤 값)

세션 저장소에 sessionId와 보관할 실제 값 매핑하여 저장

sessionId로 응답 쿠키를 생성해서 클라이언트에 전달

 

세션 조회

클라이언트가 요청한 sessionId 쿠키의 값으로, 세션 저장소에 보관한 값 조회

 

세션 만료

클라이언트가 요청한 sessionId 쿠키의 값으로, 세션 저장소에 보관한 sessionId와 값 제거

스프링에서의 세션

세션을 직접만들어 봄으로써 동작 로직을 이해할수있다.

하지만 세션이라는 개념은 모든 웹에서 필수적이기 때문에 기본적으로 기능을 제공한다.

스프링도 httpSession이라는 api를 제공한다.

세션 타임아웃

이전 포스트에서 쿠키의 만료시간을 짧게해서 보안문제를 어느정도 해결한다고 했었다.

세션을 무한정 보관하면 다음과 같은 문제가 발생할 수 있다.

세션과 맵핑되는 쿠키를 탈취 당했을 경우 오랜 시간이 지나도 해당 쿠키로 악의적인 요청을 할 수 있다

 

세션은 서버사이드 메모리에 저장되기 때문에 계속 생성하거나 사용하면 메모리 효율이 떨어진다.

 

세션의 종료시점을 어떻게 설정해야할까?

가장 최근 요청시점을 기준으로 30분동안 유지하다가 종료시키면 된다.

웹에서 표준으로 사용하는 방식이며 스프링에서 제공하는 httpSession은 기본적으로 이 방식으로 동작한다.

 

728x90