본문 바로가기
Web개발

Cookie & Session

by Tomining 2017. 1. 3.
HTTP에는 Connectless, Stateless 특징이 있다.
간략히 설명해 보면 기본적으로 서버와 클라이언트 간의 연결을 맺고 원하는 리소스를 다운로드 받으면 연결을 끊어버린다. 따라서 이전 연결 상태에 대한 정보를 유지할 수 없다.
이런 특징을 Connectless, Stateless라고 이야기 한다.

이를 보완하기 위해 Cookie(이하 쿠키)가 탄생했다.
예를 들어 로그인 후 다음 요청에서 로그인 정보를 확인할 수 있도록 해당 정보를 쿠키를 통해서 요청(Request)에 담아서 전송하게 된다.
쿠키가 어떻게 동작하고 어떤 내용을 담고 있는지 그리고 쿠키와 유사한 세션은 쿠키와 어떻게 다른지 정리해 본다.

쿠키(Cookie)

쿠키는 HTTP 쿠키, WEB 쿠키, 브라우저 쿠키 등으로 불리기도 한다. 쿠키는 웹 사이트를 방문할 때 서버로부터 전송받아 클라이언트에 파일로 저장하는 정보이며, 해당 웹 사이트를 다시 접속할 때 클라이언트의 이전 상태(State)를 알 수 있게 해 준다. 예를 들어 로그인 정보나 구매 정보 등이 있을 수 있다.

쿠키를 서버와 주고 받는 방식은 아래와 같다.


2번 응답(위 그림 참고)에서 서버는 유지가 필요한 상태 정보를 쿠키에 담아서 전달하게 되고 해당 사이트를 다시 방문할 때 받았던 쿠키를 전송하여 사용자가 이전에 어떤 행동을 했는지 알 수 있게 되는 것이다.

쿠키 종류

쿠키 종류
특징
세션 쿠키
메모리에만 저장
보통 만료시간(Expire date) 설정
브라우저 종료시 쿠키 삭제
Persistent 쿠키
장기간 유지되는 쿠키(예를 들어 Max-Age 1년)
파일로 저장되어 브라우저 종료와 관계없이 사용
Secure 쿠키
HTTPS에서만 사용
쿠키 정보가 암호화 되어 전송
HttpOnly 쿠키
HTTP 또는 HTTPS 요청시에만 사용 가능
Javascript에서 non-HTTP API로 호출할 때는 사용할 수 없음
  • document.cookie 으로 쿠키 접근 안 됨
  • XSS 공격 방지(완벽하진 않음)
Third-Party 쿠키
방문한 도메인과 다른 도메인의 쿠키
보통 광고 베너 등을 관리할 때 유입 경로를 추적하기 위해 사용
  • 개인 정보 이슈로 브라우저에서 Third-Party 쿠키를 막는 옵션 제공

쿠키의 구성요소

아래 쿠키는 네이버에서 로그인 후 응답에 담겨온 쿠키 정보이다.
Cookie: 
NNB=V4WH2ME3MIOFM; 
npic=ogpTgCngd3azcoNXhyIrbedDfn2LXmqaQ0UEkXxWpk3P9X6oN3if9OHJvzsL533+CA==; 
NFS=2; 
MmNiOTMwNWUtZjM2YS00YTVhLWExOTQtNjYyMWIyN2Y1Mzk3_kB0Wamni=true; 
ASID=0a0c2f5f00000158b42357950000005e; 
YjMzY2ZhNjItZWMxYS00ODY4LTg5NWItZTQyMGU3YzY3ZjE2_60lgAbZR=true; 
NM_THEMECAST_NEW=tcc_bty%2Ctcc_fod%2Ctcc_lif; 
7802DF01_0000000EA04D=1; 
nx_ssl=2; 
7802DF01_0000000EA06D=1; 
7802DF01_0000000EA051=1; 
_ga=GA1.2.879758913.1445585624; 
nid_iplevel=1; 
nid_inf=-192183453; 
NID_AUT=JMGqH8ObjcITQIjqNx9t62cFIcyVA79xkqMfCNLNQutQs4jN+4kDPxj7vRd6KkfF; 
page_uid=YpNRdsoiqylssM4VmSCssssssRK-083164; 
nrefreshx=0; NID_SES=AAABigMmG1l1fdyKKP2vhINn3GqUDCbLMUAUQ2MO721yKPxU49ywkOvMlagACyQzwsCHiY0gKLkGHET2kZ0vTZjFq10jq5nACEmqqS2yIVCkj20z7lANEHfX6kUklP+4ztMzaaMFJXPs5T8BZqwV/tCjJoGN2Q+0KVldcz5iclmQKfSs4pG1aQu2F21ke8Z7BDdki1rDTo1TWOcFLc/BUj9BXOGr93sOmW7KwKJWGEVHdiYfZVONY4Q8j+mHAWakYwHLs1mnp2rMnpUX5nnW9xhCk8+1o/21SFYRuyu3Bz4ISWwkmpkr2XgUY09gn7B2o1cHxGbkLQxBgbw2TN9X08Kgsyd2EpXEWyctA7e4ORT6/TY1e0FVEBJSdX/oes19gLXy0/ouS4zXnhEWhOBoPKIUWjux366CK9rrwk2NxDnkFeBIba2U7ZCDP3DXR9rqN5JZEXBjb26gILCjuCTIZe4rIWPykB0+6mnMdK74AiasAoQsg+BFTA5voyh99iwxHKBXaDNfmd+KQGd1BefJVT5PzZg=
* 로그아웃 이후에도 몇몇 쿠키는 유지되는 것으로 봐서는 Persistent 쿠키인 듯 하다.

쿠키는 다음 6가지로 구성된다.
  1. 쿠키의 이름(name)
  2. 쿠키의 값(value)
  3. 쿠키의 만료시간(Expires)
  4. 쿠키를 전송할 도메인 이름(Domain)
  5. 쿠키를 전송할 패스(Path)
  6. 보안 연결 여부(Secure)
  7. HttpOnly 여부(HttpOnly)

1, 2는 필수 값이며 나머지는 옵션이다.(네이버 로그인 쿠키에서는 필수 값만 포함하고 있다.)

도메인과 패스

Set-Cookie: LSID=DQAAAK…Eaem_vYg; Domain=docs.foo.com; Path=/accounts; Expires=Wed, 13 Jan 2021 22:23:01 GMT; Secure; HttpOnly 
Set-Cookie: HSID=AYQEVn….DKrdst; Domain=docs.foo.com; Path=/; Expires=Wed, 13 Jan 2021 22:23:01 GMT; HttpOnly 
Set-Cookie: SSID=Ap4P….GTEq; Domain=.foo.com; Path=/; Expires=Wed, 13 Jan 2021 22:23:01 GMT; Secure; HttpOnly

Expires와 Max-Age

Set-Cookie: lu=Rg3vHJZnehYLjVg7qi3bZjzg; Expires=Sun, 15 Jan 2017 10:00:00 GMT; Path=/; Domain=.example.com; HttpOnly 
Set-Cookie: made_write_conn=1295214458; Path=/; Domain=.example.com 
Set-Cookie: reg_fb_gate=deleted; Expires=Thu, 01 Jan 1970 00:00:01 GMT; Path=/; Domain=.example.com; HttpOnly
  • lu 쿠키는 만료일이 Sun, 15 Jan 2017 10:00:00
  • made_write_conn 쿠키는 만료일이 없음. 세션 쿠키로 브라우저 종료시 삭제
  • reg_fb_gate 쿠키는 만료일이 과거로 삭제
쿠키는 일반적으로 삭제할 순 없으나, 만료시간을 설정하여 브라우저가 삭제할 수 있도록 할 수 있다.

제약조건

RFC 2109(http://www.faqs.org/rfcs/rfc2109.html)에서는 브라우저(User-Agent) 별로 정의할 수 있다고 되어 있다.
6.3  Implementation Limits

   Practical user agent implementations have limits on the number and
   size of cookies that they can store.  In general, user agents' cookie
   support should have no fixed limits.  They should strive to store as
   many frequently-used cookies as possible.  Furthermore, general-use
   user agents should provide each of the following minimum capabilities
   individually, although not necessarily simultaneously

IE의 경우는 RFC 2109를 준수하여 다음과 같은 기준을 따른다고 공지하고 있습니다.(https://support.microsoft.com/ko-kr/kb/306070)
  • 적어도 300개 쿠키: 300개 이하로 쿠키를 사용할 수 있다.
  • 쿠키 당 4096Byte: 쿠키 하나 당 4096바이트를 넘을 수 없다.
  • 도메인 당 20개 쿠키: 하나의 도메인에 20개 이하로 쿠키를 사용할 수 있다.

세션(Session)

쿠키는 클라이언트에 저장되는 정보라고 소개했다. 아무래도 클라이언트에 저장하다 보니 보안상 취약한 부분이 있을 수 밖에 없다. 만약 로그인이나 결재정보 등을 쿠키로 저장하게 되었을 때 해당 쿠키가 유출되면 문제가 될 수 있다. 이 때 세션을 사용할 수 있다.
세션이란 쿠키와 다르게 서버에 정보를 저장하는 방식이다. session-id라는 값을 통해 사용자를 식별하게 되며 session-id는 세션 쿠키로 전달된다.(브라우저 종료시 삭제)



세션 동작 순서

  1. 클라이언트가 서버로 요청(Request)
  2. 서버는 요청(Request) 헤더에 session-id를 체크
  3. 만약 session-id가 없다면 신규로 생성하여 응답(response) 헤더에 넣어 전송

세션 소멸?

세션 정보가 삭제 되려면 2가지가 있다.
  • invalidate()가 호출 된 경우
    로그인 정보가 세션에 저장되어 있을 때, 로그아웃을 하는 경우 세션 정보가 invalid 된다.
  • 타임아웃
    web.xml에 session-timeout으로 설정

세션 활성화(activate), 비활성화(passivate)

보통 웹 애플리케이션 서버를 병렬로 구성하게 된다.(분산환경) 이를 로드 밸러싱을 통해 여러 서버로 요청이 분산되게 되는데, 세션의 경우 서버에 저장되므로 여러 서버 중 특정 서버에만 저장될 수 있다. 즉 병렬로 구성된 여러 서버들이 동일한 세션 정보를 참조할 수 있도록 동기화 과정이 필요한데, 이 과정을 활성화, 비활성화라고 한다.
HttpSessionActivationListener가 세션 객체를 동기화하는 역할을 하는 것 같다.(자세한 것은 좀 더 공부를…)


참고

'Web개발' 카테고리의 다른 글

HTTP/2란 무엇인가?  (0) 2017.01.09
HTTP 프로토콜  (0) 2017.01.02