인터넷을 사용해봤다면 Session과 Cookie는 많이 들어봤을 것이다.
쿠키는 뭐 쿠키 삭제하는 경우에 많이 봤을 것이고,
세션은 보통 웹 사이트에서 로그인 해놓고 다른 사이트에서 작업하다가 다시 돌아오면 세션이 만료되어 또는 세션이 끊겼다는 메시지가 뜨면서 다시 로그인하게 만드는 경우에서 봤을 것이다.
HTTP Protocol의 특징
쿠키와 세션에 대해서 알아보기 전 HTTP의 특징을 먼저 알고 가면 이해하기 쉽다.
HTTP의 순서는
1. client가 server에 요청
2. server는 요청에 대해 처리 후 client에게 처리 결과 응답
3. 응답 후 연결 해제
순서로 작동한다.
응답 후에 연결을 해제하기 때문에 stateless 라는 특징을 가지고 있다.
지속적인 연결로 인한 자원 낭비를 줄이기 위해 연결을 해제한다.
그러나 로그인과 같이 계속해서 연결상태를 유지해야하는 상황이 생기는 경우에는 이러한 특성으로 인해 문제가 발생한다. 그래서 사용하게 된게 Session과 Cookie다. Session과 Cookie는 각 클라이언트 단위로 관리된다. (client마다 각기 다른 Session과 Cookie가 존재)
Session
javax.servlet.http.HttpSession
- 클라이언트가 웹 서버에 접속해있는 상태를 하나의 단위로 보고 그것을 세션이라고 한다.
- WAS(Web Application Server)에 Object 형태로 저장된다.
- 서버에 저장되기 때문에 용량이 허용하는 한 제한없이 저장이 가능하다.
예시
EX) 사용자의 로그인 유지, 장바구니 등
동작 순서
1. 클라이언트가 페이지 요청
2. 서버는 클라이언트의 Request-Header에 있는 Cookie필드를 확인하고, session-id를 보냈는지 확인.
3. 보냈다면, 서버는 새롭게 생성해서 session-id를 클라이언트에게 전송
4. 서버는 전송한 session-id를 쿠키를 사용해서 서버에 저장 (쿠키 이름 : JSESSIONID)
5. 클라이언트는 재접속시, 이 쿠키를 사용해서 session-id값을 서버에 전달.
특징
- 웹 서버에 저장되는 쿠키(쿠키를 사용함)
- 브라우저를 닫거나, 서버에서 세션을 삭제해야만 삭제가 되기 때문에 쿠키에 비해 비교적 보안이 좋다.
- 저장 데이터에 제한이 없다.
- 각 클라이언트 별로 고유 Session ID를 부여한다.
- 서버는 Session ID로 클라이언트를 구별하여, 각 사용자에 맞는 서비스 제공
Cookie
javax.servlet.http.Cookie
- 서버에서 사용자의 컴퓨터에 저장하는 파일
- 브라우저는 항상 request시 Request Header르 넣어 자동으로 서버에 전송
- key와 value로 구성, 둘 다 String 형태로 저장
- 브라우저마다 저장되는 쿠키가 다름.
예시
EX) 세션 관리(ID저장, 자동로그인 등), 개인화(일주일간 보지 않기 등), 트래킹(사용자의 행동과 패턴 분석 : 최근 검색한 상품들을 광고에 추천)
동작순서
1. 클라이언트가 페이지 요청
2. WAS는 쿠키 생성
3. HTTP Header에 쿠키를 넣어서 응답
4. 브라우저는 넘겨받은 쿠키를 PC에 저장하고, 다시 WAS가 요청하면 요청과 쿠키를 같이 전송
5. 쿠키의 만료기간을 보고 보관 여부를 결정
6. 동일 사이트 재방문시 클라이언트 PC에 해당 쿠키가 존재하면, 요청과 쿠기를 같이 전송
특징
- 이름, 값, 만료일, 경로정보로 구성
- 한 클라이언트에 저장할 수 있는 쿠키의 용량이 제한되어있음
- 도메인 당 쿠키 저장 용량이 제한되어있음.
=> 그렇다면 쿠키와 세션의 차이점은 뭘까? 지금까지만 보면 두 개가 비슷해보인다.
세션 | 쿠키 | |
저장위치 | 서버에 Object로 저장 | 클라이언트에 파일로 저장 |
보안 | 세션 Id를 사용하기 때문에 비교적 안전 | 로컬에 저장되기 때문에 보안 취약 |
유효기간 | 유효기간 설정 가능, 브라우저가 종료되면 바로 삭제 | 유효기간 설정 가능, 브라우저 종료에 상관없이 계속해서 유지 |
속도 | 클라이언트에 저장되어있기 때문에 속도가 빠름 | 서버에 저장되어있기 때문에 비교적 느림 |
사용 예시 | 로그인 등과 같은 보안이 중요시되는 경우에 사용 | 장바구니나 최근 본 상품들, 아이디 저장 등과 같은 기능 |