세션(Session)

곽태욱·2021년 6월 28일
0

등장 배경

HTTP는 클라이언트가 서버와의 연결을 생성하고 요청을 한 다음 응답을 받을 때까지 대기하는 고전적인 클라이언트-서버 모델을 따르고 있어요. 하지만 HTTP는 기본적으로 클라이언트-서버 사이의 연결을 유지하지 않는 상태 비저장(stateless) 프로토콜입니다. 즉, 서버가 동일한 클라이언트가 보낸 요청이라도 그 사이에 데이터(상태)를 유지하지 않아요.

하지만 우리는 여러 클라이언트를 식별할 수 있는 기술이 필요한 순간이 있어요. 쇼핑몰에서 로그인하고 주문을 하는 과정에선 주문 요청이 어떤 사용자가 보낸 요청인지 구분할 필요가 있는데요. 그래서 사용자 요청에 대한 정보를 서버에서 관리하는 세션(Session)이라는 기술이 등장했어요.

세션

웹 서버는 클라이언트(브라우저)의 요청 정보를 저장하기 위해 웹 서버 메모리나 데이터베이스 등에 세션 테이블을 생성합니다. 이 테이블은 세션 id, 세션 데이터를 매핑하는 테이블입니다.

그리고 브라우저가 웹 서버에 첫 요청을 보내면 웹 서버에 있는 세션 테이블에 임의의 문자열로 새로운 세션 id를 생성하고 이를 브라우저 응답에 같이 보내줘요. 일반적으로 웹 서버는 HTTP 응답 헤더에 Set-cookie 필드를 넣어서 세션 id를 브라우저 쿠키에 저장하도록 해요. 그럼 나중에 브라우저가 웹 서버로 요청을 보낼 때 세션 id를 쿠키에 담아서 같이 보낼 수 있고, 웹 서버는 브라우저로부터 받은 쿠키로 브라우저를 식별할 수 있어요. 만약 브라우저 요청에 세션 id가 없으면 웹 서버는 해당 브라우저에 새로운 세션 id를 부여해요.

일반적으로 세션 id를 테이블에 유지하는 시간의 기본값은 30분입니다.

단점

하지만 웹 서버는 브라우저 식별을 위해 계속 세션 테이블을 메모리에 유지해야 하기 때문에 웹 서버의 메모리 부담이 증가할 수 있어요.

공격

무차별 대입 공격을 통해 다른 사용자의 세션 id를 추측하거나 항상 새로운 세션 id를 발급받아 웹 서버 메모리 부족을 유도할 수 있기 때문에, 보통 세션 id는 무차별 대입 공격이 어렵도록 무작위 긴 문자열을 사용하고 각 세션 id 별로 유효 기간을 설정해 기간이 만료되면 세션 id를 삭제하고 있어요.

HTTP persistent connection

HTTP 헤더에도 클라이언트-서버 연결을 일정 시간동안 유지시킬 수 있는 Connection 필드가 있어요. 이 필드를 Keep-Alive로 설정하면 HTTP 연결 시 사용했던 소켓을 닫지 않고 일정시간 동안 유지시켜 이후 요청을 동일한 소켓으로 처리할 수 있어요.

하지만 HTTP persistent connection는 요청 간격이 보통 몇 초 사이일 때 HTTP 연결을 유지해서 불필요한 소켓 생성을 방지하기 위해 사용되는 기술이고, 세션은 이보다 클라이언트의 요청 간격이 길 때 클라이언트가 누구인지 식별하고 클라이언트의 정보를 유지하기 위해 사용되는 기술이에요.

https://en.wikipedia.org/wiki/HTTP_persistent_connection

profile
이유와 방법을 알려주는 메모장 겸 블로그. 블로그 내용에 대한 토의나 질문은 언제나 환영합니다.

0개의 댓글