보통 쿠키와 세션에 대해 얘기해달라고 하면

쿠키는 클라이언트 브라우저에 저장, 세션은 서버에 저장한다.

라고 말을한다.

쿠키와 세션이 도입된 배경은
클라이언트 사용자에 대한 연속적인 구분을 위해 필요에 의해 도입되었다.

HTTP는 stateless 이기 때문에 서버에서 클라이언트 요청에 대해 같은 사용자의 요청인지 구분을 하기 위해서는 매번 요청시마다 사용자에 대한 구분값을 넘겨줘야 한다.

매 요청시 마다 구분값으로 쓰기 위해 쿠키가 요청마다 전달되는데.
이 쿠키는 서버에의해 응답으로 브라우저에 저장될수있다.

예를 들어 사용자가 로그인페이지에서 로그인을 하면
서버는 응답에 set cookie 를 특정 쿠키네임으로 사용자 정보를 담아 준다.

그 다음 사용자의 요청부터는 이 쿠키정보가 담겨 요청되는데.
사용자 정보가 있기 때문에 , 서버는 HttpRequest 정보로 이 요청이 로그인 한 A 라는 사용자의 요청이라는 것을 알 수 있다.

하지만, 로그인이후에 사용자 정보를 쿠키에 담아놓고 사용한다면, 클라이언트의 쿠키정보는 쉽게 변조,탈취가 가능하기 때문에 보안적인 문제가 발생할수 있다.

때문에 서버에서 세션에 사용자정보를 저장하도록 하여 이러한 문제를 해결할수 있다.

그렇다면 세션기반으로 한다는것은 쿠키를 사용 하지 않는것일까?

서버의 세션정보는 일반적으로 플랫폼의 세션관리 유틸을 통해 세션키로 구분되어 key:value 형식으로 관리된다.

매 HTTP 요청마다 서버에 저장된세션을 알기 위해 session key 를 전달해야만 한다.

이 세션키는 보통 브라우저에 쿠키로 관리되어진다.

일반적으로 세션키와 세션정보는 브라우저가 서버에 접근만해도 생성된다.

톰켓의 경우서버에 접근하는 HTTP 요청에 cookie 정보를 확인하여 session cookie name (tomcat default : JSESSIONID)이 없거나 유효하지 않다면 HTTP response 를 통해 새로운 session cookie 를 전달한다.

어플리케이션 마다 다르겠지만 보통 세션은 웹서버 접근시 매번 생성된다고 보면 될것같다.

또한 서버는 로그인시나 특정한 이벤트 시마다 보안( 세션하이재킹 … )을 위해 새로운 세션을 열어 새로운 세션키를 발급하기도 한다.

아래와 같은 흐름으로 Http Request 에 의한 session생성 및 Response 의 session cookie 전달 이 이루어지고
그 다음부터 이루어지는 Request 부터는 같이 전달되는 session cookie 를 이용하여 서버에서 사용자 세션을 구분할수 있다.

Image for post
Image for post

session cookie 는 쿠키이기 때문에 쿠키에 대해 알아보자

Http Cooke 참조 : MDN

쿠키를 생성하기 위한 규격을 보게 되면
Http 응답에 아래와 같이 작성함으로써 클라이언트에 쿠키 셋팅을 요청한다.

Set-Cookie: <cookie-name>=<cookie-value>

위와 같은 쿠키는 일반적으로 세션쿠키(브라우저 세션)로써 브라우저가 닫히면 지워지는 쿠키이고
명시적으로 Expires와 Max-Age를 사용하여 영속적으로 관리될수 있다.

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;

보안을 위한 쿠키 설정도 있다.
Sercure의 경우 HTTPS 통신에만 참가할게 된다.
HttpOnly의 경우 XSS 공격 방지를 위해 존재한다.
(xss : 크로스 사이트 스크립트 공격을 이용해 해커는 관리자나 사용자의 세션쿠키 정보를 탈취할수 있다. = 세션하이재킹)

HttpOnly 속성을 적용하면 Document.cookie, XMLHttpRequest, Request API 등 자바스크립트를 통한 쿠키정보의 접근을 막는다.
하지만 Http 통신에는 참여한다.

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly

보안적인 측면에 대해서는 참고 사이트를 참조하자.

세션에 대해 정리해보자

Java Sevlet 에서는 다음과 같은 HttpSession객체를 사용한다.
https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/HttpSession.html

여러 프레임워크에서는 RDB 나 Redis 등을 이용하는 세션저장소를 지원한다.

이렇게 공유된 세션 저장소를 이용하는 것이 세션클러스터링이다.

다음은 Load Balancer — multiple Web Server 환경에서 여러대의 WAS 에 대한 세션 클러스터링에 대해 정리해보자.

Written by

엘디는 사랑입니다.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store