HTTP의 특징은 다음과 같다.
connectionless : 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어버린다.
HTTP1.1에서는 keep-alive옵션등이 있다.
stateless : 통신이 끝나면 상태를 유지하지 않는다.
HTTP의 위와 같은 특성을 보완하기 위해서 세션과 쿠키가 나왔다. (대표적으로 로그인을 위해서)
쿠키
특징
클라이언트(브라우저, 로컬)에 저장되는 key-value 데이터이다.
하나의 도메인당 20개, 클라이언트에서 300개까지 저장 가능하다. (하나의 쿠키는 최대 4KB이다.)
Response Header에 Set-Cookie 속성을 사용해 쿠키를 만들 수 있다.
동작
클라이언트 서버 요청
서버에서 쿠키 생성
HTTP Header에 쿠키 포함 시켜서 응답
브라우저가 종료되어도 쿠키 만료 시간 전까지 클라이언트에서 보관
서버에 같은 요청을 보낼 경우 쿠키를 같이 보냄
서버에서 쿠키를 확인 하고 업데이트 함.
ex) 아이디 비밀번호 저장, 쇼핑몰 장바구니 등
세션
특징
쿠키와 비슷한 방식이지만 클라이언트가 아니라 서버에 저장한다.
일정시간 응답 없으면 서버에서 세션을 지운다.
클라이언트별로 고유한 세션 ID를 부여하여 구분한다.
동접자가 많을 수록 메모리 사용량이 많아져 성능이 저하된다.
동작
클라이언트가 서버 접속시 고유한 세션 ID발급 받음.
클라이언트는 세션 ID를 쿠키에 저장
클라이언트는 서버 요청마다 세션 ID를 서버에 같이 전달.
서버는 세션 ID를 통해 클라이언트 정보 가져와 응답
결론
현대 많은 웹사이트의 로그인 처리 등에 사용되는 쿠키와 세션이다. 하지만 동접자가 많아지면 메모리를 많이 먹는다는 문제가 있고 또한 MSA(Micro Service Architecture)와 같은 멀티 서버 환경에서는 설계가 어렵다는 단점이 있다.
MSA등 환경에서 세션은 Redis, Memcached등으로 세션 저장용 DB를 만들어야 하지만 이것또한 서버 처리라 로드가 발생한다.
그래서 유저 정보를 서버에서 저장하지 않고 온전히 클라이언트 사이드에서 저장하도록 하는 JWT 방식이 등장하게 된다.