[참고]
쿠키와 세션을 사용하는 이유
HTTP 프로토콜의 특징이자 약점을 보완하기 위해서 사용된다. 클라이언트와 정보유지를 하기 위해서 사용.
1. Connectionless 프로토콜 (비연결지향)
- 클라이언트가 서버에 요청(Request)을 했을 때,그 요청에 맞는 응답(Response)을 보낸 후 연결을 끊는 처리방식이다.
- HTTP 1.1 버전에서 연결을 유지하고, 재활용 하는 기능이 Default 로 추가되었다.(keep-alive 값으로 변경 가능)
2. Stateless 프로토콜 (상태정보 유지 안함)
- 클라이언트의 상태 정보를 가지지 않는 서버 처리 방식이다.클라이언트와 첫번째 통신에서 데이터를 주고 받았다 해도,두번째 통신에서 이전 데이터를 유지하지 않는다.
- But, 실제로는 데이터 유지가 필요한 경우가 많다.정보가 유지되지 않으면, 매번 페이지를 이동할 때마다 로그인을 다시 하거나,상품을 선택했는데 구매 페이지에서 선택한 상품의 정보가 없거나 하는 등의 일이 발생할 수 있다.
- 따라서, Stateful 경우를 대처하기 위해서 쿠키와 세션을 사용한다. 쿠키와 세션의 차이점은 크게 상태 정보의 저장 위치이다. 쿠키는 '클라이언트(=로컬PC)'에 저장하고, 세션은 '서버' 에 저장한다.
세션을 쓰면되는데 굳이 쿠키를 사용하는 이유?
- 세션이 쿠키에 비해 보안도 높은 편이나 쿠키를 사용하는 이유는세션은 서버에 저장되고, 서버자원을 사용하기 때문에 사용자가 많을 경우 소모되는 자원이 상당하다.이러한 자원관리 차원에서 쿠키와 세션을 적절한 요소 및 기능에 병행 사용하여,서버 자원의 낭비를 방지하며 웹사이트의 속도를 높일 수 있다.
쿠키
HTTP의 일종으로 사용자가 어떠한 웹 사이트를 방문할 경우, 그 사이트가 사용하고 있는 서버에서 사용자의 컴퓨터에 저장하라고 보내주는 작은 기록정보 파일
HTTP에서 클라이언트의 상태 정보를 클라이언트의 PC에 저장하였다가 필요 시 정보를 참조하거나 재사용 할 수 있음
쿠키는 Http header에 담겨서 전송됨
쿠키의 동작 순서
- 클라이언트가 페이지 요청
- 웹 서버가 쿠키를 생성
- 생성한 쿠키에 정보를 담아 HTTP로 화면을 돌려줄 때, 쿠키를 같이 돌려줌(Http Header Set-Cookie에 값을 넣어서 보내면 브라우저에게 그 쿠키를 저장하라는 말인 것임)
- 받은 쿠키를 클라이언트가 가지고 있다가(로컬 PC에 저장) 다시 서버에 요청할 때 요청과 함께 쿠키를 전송함
- 동일 사이트 재 방문시 클라이언트의 pc에 해당 쿠키가 있는 경우, 요청 페이지와 함께 쿠키를 전송함
세션 ( 서버 메모리를 사용하여 저장함)
일정 시간 동안 같은 사용자로부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 유지시키는 기술
여기서 일정 시간은 방문자가 웹 브라우저를 통해 웹 서버에 접속한 시점부터 웹 브라우저를 종료하여 연결을 끝내는 시점을 말함
특징
- 웹 서버에 웹 컨테이너의 상태를 유지하기 위한 정보를 저장한다.
- 세션쿠키를 이용하여 세션의 ID를 브라우저에게 알려줌. 세션 쿠키는 세션을 위해 사용하는 쿠키임
- 브라우저를 닫거나, 서버에서 세션을 삭제했을 때만 삭제가 되므로, 쿠키보다 비교적 보안이 좋다.
- 저장 데이터에 제한이 없다. (서버 용량이 허용하는 한에서)
- 각 클라이언트에 고유 Session ID(이것을 세션 쿠키로)를 부여한다. Session ID로 클라이언트를 구분해 각 요구에 맞는 서비스를 제공
세션의 동작 순서
- 클라이언트가 페이지에 요청을 함
- 서버는 접근한 클라이언트의 Request-Header 필드인 Cookie를 확인하여 클라이언트가 해당 session-id를 보냈는지 확인함
- session-id가 존재하지 않는다면 서버는 session-id를 생성해 클라이언트에게 돌려줌
- 서버에서 클라이언트로 돌려준 session-id를 쿠키를 사용해 클라이언트에 저장한다.
- 클라이언트는 재접속 시, 이 쿠키를 이용해 session-id 값을 서버에 전달
예시
Spring Security로 만든 예시
- localhost:8080에 접속 시, 자동으로 세션 ID 쿠키가 생성됨

- RememberMe 를 체크하고 로그인을 진행함

- 서버는 변경된 sessionId와 remember-me 쿠키를 내려줌
- 이 상황에서 JSESSIONID를 삭제할 시 remember-me 쿠키를 통해서 인증을 하고 세션을 새로 받아옴
- remember-me 쿠키를 삭제하면 세션을 통해서 알아서 인증이 되고, 세션이 만료된다면 로그인을 다시 해야함

