쿠키와 세션을 사용하는 이유
HTTP 프로토콜의 약점을 보완하기 위해서 사용한다.
HTTP 프로토콜은 다음과 같은 과정을 거친다
- client가 server에 요청을 보낸다.
- server는 요청에 대한 처리 후에 client에 응답을 보낸다
- 응답 후 연결을 해제한다
여기서 문제가 생기는데 응답 후 연결을 해제한다는 것은 stateless 하다는 것이고 연결을 유지해야 하는 상태에서 문제가 발생한다. 예시로는 로그인 정보로 로그인을 유지해야 하는 경우이다. 만약 쿠키와 세션을 사용하지 않는다면 쇼핑몰에서 무언가를 구매하기 위해 로그인을 했음에도 페이지를 이동할 때마다 로그인을 해야 하는 문제가 생긴다. 이를 보완하기 위해 쿠키와 세션을 사용한다.
쿠키(Cookie)
쿠키란?
- 서버에서 사용자의 컴퓨터(클라이언트 브라우저)에 저장하는 정보 파일
- 쿠키는 사용자가 별도로 요청하지 않아도 브라우저가 request시에 Request Header를 넣어 자동으로 서버에 전송한다.
- key, value로 구성되고 String 형태로 이루어져 있다.
- 브라우저마다 저장되는 쿠키가 다르다. → 서버에서 브라우저가 다르면 다른 사용자로 인식한다.
쿠키 사용 목적
- 세션 관리 : 사용자 아이디, 접속시간, 장바구니 정보 등의 서버가 알아야 할 정보를 저장한다.
- 개인화 : 사용자마다 다르게 그 사람에게 적절한 페이지를 보여줄 수 있다.
- 트레킹 : 사용자의 행동과 패턴을 분석하고 기록할 수 있다.
쿠키 구성 요소
- 이름 : 쿠키의 구별을 위해 사용되는 이름
- 값 : 쿠키 이름과 관련된 값
- 유효시간 : 쿠키 유지시간
- 도메인 : 쿠키를 전송할 도메인
- 경로 : 쿠키를 전송할 요청 경로
쿠키 동작 방식
- 클라이언트가 서버에 페이지를 요청한다.
- 서버에서 쿠키를 생성하고 HTTP Header에 쿠키를 포함하여 응답한다.
- 브라우저가 종료되어도 쿠키의 만료 시간이 남아 있다면 클라이언트에서 보관하고 있는다.
- 같은 요청을 할 경우 HTTP Header에 쿠키가 자동으로 넣어져서 함께 보낸다.
- 서버에서 쿠키를 읽어 이전 상태 정보를 변경할 필요가 있을 때 (장바구니 수정, 접속시간 수정 등)쿠키를 업데이트하고 변경된 쿠키를 HTTP Header에 포함하여 응답한다.
세션(Session)
세션이란?
- 방문자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보고 이것을 세션이라고 한다.
- 쿠키를 기반으로 하고 있지만 클라이언트측에 저장하는 쿠키와 달리 서버 측에서 관리하는 것이 세션이다.
- WAS(Web Application Server)의 메모리에 Object형태로 저장된다.
- 서버에서 각 클라이언트를 구분하기 위해 세션객체에 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증 상태를 유지한다. 물론 접속 시간을 설정하여 일정 시간 응답이 없다면 세션 객체가 유지되지 않게 설정이 가능하다.
- 사용자의 정보를 서버에 저장하기 때문에 민감한 정보를 관리하기에 좋다. 그래서 쿠키보다 보안이 좋으며 메모리가 허용하는 용량까지는 제한 없이 저장이 가능하다. 하지만 사용자가 많아질수록 저장할 세션 객체가 증가하고 이는 서버에 부담이 되어 트래픽이 많은 웹사이트의 경우 서버 과부하가 일어날 수 있다.
- 클라이언트가 요청을 보내면 해당 서버의 엔진이 클라이언트에게 유일한 ID를 부여하는데 이게 세션 ID이다.
세션 동작 방식
- 클라이언트가 서버에 접속하면 고유한 세션 ID를 발급받는다.
- 클라이언트는 세션 ID에 대해 쿠키를 사용해서 저장하고 가지고 있는다.
- 클라이언트는 서버에 요청할 때 이 쿠키의 세션 ID를 같이 서버에 전달해서 요청을 보낸다.
- 서버는 세션 ID를 보고 해당 ID에 해당하는 클라이언트 정보를 가져와서 사용할 수 있다.
- 클라이언트 정보를 가지고 요청에 대한 처리 후 클라이언트에 응답한다.
클라이언트 정보를 저장하고 ID로 가져와서 사용하니 로그인을 계속 유지할 수 있게 되는 것이다.
쿠키와 세션의 차이
- 쿠키와 세션은 정보를 저장한다는 비슷한 역할을 하는데 세션이 쿠키 기술을 기반으로 하기 때문이다.
- 저장되는 위치가 다르다. 쿠키는 클라이언트 측에, 세션은 서버측에 저장되는 정보다.
- 요청 속도는 쿠키가 세션보다 빠르다. 세션은 서버의 처리가 필요하기 때문에 비교적 느리다.
- 쿠키는 클라이언트측에 노출이 되는 만큼 스니핑 당할 우려가 있어 보안에 취약하지만 세션은 쿠키를 이용해서 세션 ID만 저장하고 ID로 구분해서 필요한 작업을 하기 때문에 비교적 보안성이 좋다.
- 쿠키의 경우 세션과 마찬가지로 만료시간이 있지만 파일로 저장되기 때문에 브라우저를 종료해도 계속 정보가 남아있을 수 있다. 하지만 세션은 브라우저를 종료하면 정보가 사라진다.
캐시(cache)와 다른점?
캐시
캐시는 웹 페이지 요소를 저장하기 위한 임시 저장소로 이미지, css, js파일 등을 브라우저나 서버 앞 단에 저장해 놓고 사용하는 것이다.
저장 공간이 작고 비용이 비싸지만 빠른 성능을 제공한다. 같은 웹 페이지에 접속할 때 사용자 PC에서 로드하기 때문에 서버를 거치지 않아 빠른 것이다. 이전 데이터가 다시 사용될 가능성이 많으면 캐시 서버에 있는 데이터를 사용해서 빠르게 접근하여 페이지의 로딩 속도가 빠른 것이다.
위처럼 용도와 사용 목적이 완전 다른 것을 볼 수 있다.
이렇게 보니 세션/쿠키 방식이 JWT와 같은 토큰 사용 방식과 크게 달라 보이지 않는다. 사용자 인증을 하고 해당 정보를 쿠키로 넘겨주거나 JWT로 넘겨주거나 비슷해 보인다.
하지만 JWT를 사용하는 큰 이유가 있었는데 서버를 다중화했을 때 유리하다고 한다. 만약 내가 무언가를 주문하다가 해당 서버에 문제가 생겨 서버가 종료되어도 토큰을 사용하면 토큰에 정보가 모두 있기 때문에 다른 서버에서도 동일하게 처리가 가능할 것이다. 세션/쿠키의 경우 세션에 중요한 정보를 넣기 때문에 중간에 서버에 문제가 생겨 종료된다면 해당 정보도 같이 사라지니 문제가 생길 것이다.
또 이런 문제 때문에 세션 클러스터링으로 분산되어 있는 세션을 공유하여 한 서버가 꺼져도 다른 서버의 WAS에 동일한 세션이 관리될 수 있게 하는 방법이 있긴 하다.
'Network' 카테고리의 다른 글
소켓 프로그래밍을 하다가 발생한 의문점(왜 내 서버 소켓은 브라우저의 요청 클릭 한 번에 두 개의 커넥션을 생성하나요..?) (0) | 2024.07.08 |
---|---|
로드밸런싱(Load Balancing)과 Nginx (0) | 2023.04.18 |
REST? REST API? Restful API? (0) | 2023.04.18 |