Cookie와 Session 개념 & 등장 배경
14 Nov 2020 | HTTP 상태 유지 기술 Web 쿠키 세션Index
- 등장배경
- 만약, 상태가 유지되지 않는다면 어떻게 될까?
- 쿠키와 세션
- 동작 방식
등장배경
현대 웹 사이트들은 개인화된 서비스를 제공하고 싶어한다. 사이트를 사용하는 유저에 대해 더 많이 알고자 유저들의 행동을 추적하고 탐색 습관들을 기록한다. 이렇게 유명한 온라인 쇼핑 사이트들은 여러 가지 방식으로 개인화시켜 사용자들에게 서비스를 제공한다.
- 개인화 / 사용자 맞춤 추천
- 온라인 쇼핑이 개인에게 맞춰져 있는 것처럼 느끼게 하려고 사용자에게 특화된 환영 메시지나 페이지 내용을 만든다.
- 온라인 상점은 고객의 흥미가 무엇인지 학습해서 고객이 좋아할 것이라 예상되는 제품들을 추천할 수 있다. 고객 생일이 다가오면 특별한 제품을 제시하기도 한다.
- 저장된 사용자 정보
- 온라인 쇼핑 고객은 배송지 정보와 신용카드 정보를 매번 입력하는 걸 싫어한다. 이런 정보를 디비에 저장해서 온라인 쇼핑이 유저를 한번 식별하고 나면, 쇼핑을 더 편하게 할 수 있게 저장된 사용자 정보를 사용한다.
- 세션 추적
- 새로 고침해도 장바구니에 담은 상품이 사라지지 않는다. 로그인하지 않은 상태에서 장바구니를 담은 후 로그인을 해도 장바구니 정보가 유지된다.
이런 서비스를 제공하기 위해서는 각 HTTP 요청들이 어느 유저로부터 온 건지 식별할 수 있어야 한다. 어떤 경우엔 여러 요청(여러 페이지)에 걸쳐 이전 상태를 모두 기억하고 있어야 하는 경우도 있다.
하지만, 웹 서비스에서 사용하는 HTTP는 상태가 없는 프로토콜이고(Stateless), 어떤 정보도 기억하지 않는다. 요청들은 일회성이고 독립적으로 처리된다. 따라서 요청을 보낸 사용자를 식별하고, 일련의 연속된 요청들의 정보들을 기억하기 위해 나온 기술이 바로 쿠키와 세션이다.
만약, 상태가 유지되지 않는다면 어떻게 될까?
- 장바구니에 상품을 담은 후, 다른 페이지로 이동하거나 새로고침하면 담았던 상품 정보가 사라진다.
- www.site.com/page1 요청 후 www.site.com/page2 요청하는 경우 page1에서 만들어진 데이터는 page2를 요청할 때 유지되지 않는다.
쿠키와 세션
쿠키와 세션은 HTTP의 stateless를 stateful하게 만들어주는 상태 유지 기술이다.
쿠키란 키와 값으로 이루어진 작은 데이터 파일이다.
이 쿠키는 사용자 정보를 클라이언트 로컬에 저장하고 매 요청 마다 헤더에 쿠키를 넣어 서버로 전달한다. 서버는 쿠키 정보를 읽어서 사용자를 식별하고, 그에 맞는 응답을 내려준다. 하지만, 클라이언트에 저장할 수 있는 용량에는 한계가 있고, Id, password같은 사용자 민감 정보가 로컬에 저장될 경우, 누구나 쉽게 접근할 수 있다는 보안상의 문제가 생긴다. 따라서 유저 식별값 즉, Session ID - 클라이언트 정보, 요청 시간 정보등을 조합한 - 만 쿠키에 넣어 양쪽에서 저장하고, 유저에 대한 정보는 세션이라는 객체에 담아 서버(메모리)에서 관리한다. 이게 세션이다.
결국, 사용자 인증 정보를 클라이언트 쪽에서 관리하느냐, 서버쪽에서 관리하느냐의 차이이며, 쿠키에 담긴 정보로 요청의 주체를 식별한다. 세션도 쿠키 기반이고 둘의 동작 원리는 비슷하다.
- 톰캣에서 발급한 세션 ID 키명은 JSESSIONID (WAS마다 이름이 다르다)
- 쿠키에는 사용자 정보만 들어갈 필요는 없다.
- 쿠키 만료 시간, 유효 도메인 등의 속성과 함께 유저 방문 기록, 장바구니 담은 상품 ID 등 상태 유지에 필요한 데이터들을 모두 저장가능하다.
- 그리고 각 요청마다 필요한 데이터만 헤더 쿠키에 넣어서 서버로 보내주면 된다.
-
만료시간
- 쿠키 대부분은 브라우저를 나가기 전까지만 유지되며, 설정된 만료 시간이 있다면 그 시간까지만 디스크에 저장된다.
- 세션은 서버에서 설정한 만료시간에 따라 달라진다. 서블릿 세션의 경우 30분이 기본값
-
과거엔, 쿠키가 데이터를 클라이언트 측에 저장할 수 있는 유일한 방법이었으나 지금은 성능상의 이유로 웹 스토리지 API(localStorage와 sessionStorage)와 IndexedDB를 많이 사용한다.
- 세션 ID가 담긴 쿠키 자체를 훔쳐 세션에 접근하면 중요한 정보를 빼낼 수 있는데, 이를 막기 위해 세션에 유효시간을 넣거나 HTTPS를 이용해 요청 정보를 보기 힘들게 한다.
-
CORS(Cross-Origin Resource Sharing)
- 쿠키는 단일 도메인 및 서브 도메인에서만 작동하도록 설계되어 여러 도메인에서 관리가 번거롭다.
- 세션의 또 다른 정의: 일정 시간 동안 같은 클라이언트에서 들어오는 일련의 요청들을 하나의 상태로 보고 그 상태를 유지시키는 기술
동작 방식
쿠키
- 클라이언트가 서버에 요청
- 서버에서 쿠키 생성한 후 HTTP 헤더에 쿠키를 넣어 응답(set-cookie)
- 브라우저는 쿠키를 로컬에 저장하고 이후 요청부터는 헤더에 쿠키(유저ID, 패스워드)를 넣어 서버로 전달
- 서버는 쿠키를 읽어 사용자를 식별하고, 그에 맞는 응답을 해줌
세션
- 클라이언트가 서버에 접속
- 서버는 session id가 저장된 쿠키를 생성해서 클라이언트에 전달
- 브라우저는 session id가 담긴 쿠키를 로컬에 저장하고, 그 이후 요청부터 session id 쿠키를 헤더에 넣어 서버로 전송
- 서버는 쿠키에 있는 session id를 이용해 클라이언트를 식별
[출처] https://cscie12.dce.harvard.edu/lecture_notes/2007-08/20080423/slide51.html
References
HTTP 완벽 가이드
https://dooopark.tistory.com/6
https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies
https://dololak.tistory.com/535