1. HTTP 프로토콜의 특징과 쿠키와 세션을 사용하는 이유
HTTP 프로토콜의 특성이자 약점을 보완하기 위해 쿠키와 세션을 사용한다.
HTTP 프로토콜의 특징은 Connectionless(비연결지향)과 Stateless(상태정보 유지 안 함)이 있다.
Connectionless
HTTP 프로토콜은 클라이언트에서 서버에 요청(Request)을 보내면 서버는 클라이언트에 응답(Response)을 하고 연결을 끊는 특징을 가지고 있다. 즉 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어 버리는 특징이다.
Stateless
HTTP 통신은 연결을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보를 유지하지 않는 특징이 있다. 즉, 클라이언트와 첫 번째 통신에서 데이터를 주고받았다고 해도, 두 번째 통신에서는 기록되어 이전 데이터가 유지되지 않는 것이다.
쿠키(Cookie)와 세션(Session)을 사용하는 이유
쿠키와 세션은 HTTP 프로토콜의 특징이자 약점을 보완하기 위해 사용한다.
HTTP 프로토콜의 특징을 살펴보았듯이 서버와 클라이언트가 통신을 할 때 통신이 연속적으로 이어지지 않고 한 번 통신 되면 끊어지게 된다.
따라서 로그인 같은 기능을 구현한다고 하였을 때 상태정보가 유지되지 않으면서 페이지 이동시 다시 로그인을 하거나, 상품 구매시 구매창으로 넘어갔는데 다시 로그인을 해야 하는 문제가 발생할 수 있다.
따라서 이를 해결하기 위한 방법으로 쿠키(Cookies)와 세션(Session)이 있다.
2. 쿠키(Cookie)와 세션 (Session)
🍪 쿠키(Cookie)
쿠키는 HTTP의 일종으로 사용자가 어떤 웹 사이트를 방문할 경우, 해당 사이트가 사용하고 있는 서버에서 사용자의 컴퓨터에 저장하는 작은 기록 정보 파일이다.
HTTP에서 클라이언트의 상태정보를 쿠키 형태로 클라이언트 PC에 저장했다가 필요 시 정보를 참조하거나 재사용할 수 있다.
쿠키의 특징
- key-value 쌍으로 구성되어 있는 데이터 파일이다.
- 쿠키 이름, 쿠키 값, 만료시간, 전송할 도메인명, 전송할 경로, 보안연결여부, HttpOnly여부로 구성되어 있다.
- 도메인 당 20개의 쿠키를 가질 수 있다.
- 하나의 쿠키는 4KB(= 4096byte)까지 저장이 가능하다.
쿠키의 작동 방식
- 클라이언트가 서버에 로그인 요청
- 서버는 클라이언트의 로그인 요청의 유효성을 확인하고 (아이디와 비밀번호 검사) 응답헤더에 set-cookies:를 통해 쿠키를 추가하여 응답
- 클라이언트는 이후 서버에 요청할 때 전달받은 쿠키를 자동으로 요청헤더에 추가하여 요청한다. 헤더 쿠키값을 자동으로 추가하여 주는데 이는 브라우저에서 처리해주는 작업이다.
쿠키 사용 목적
- 세션 관리 (Session Management)
- 로그인, 사용자 닉네임, 접속시간, 장바구니 등 서버가 알아야 할 정보 저장
- 개인화 (Personalization)
- 사용자마다 다르게 페이지를 보여줌
- 트래킹 (Tracking)
- 사용자의 행동과 패턴을 분석하고 기록
쿠키의 단점
쿠키는 클라이언트에서 수정할 수 있기 때문에 보안상으로 위험하다. 따라서 쿠키값(value)을 암호화해야 하고, 민감하거나 중요한 정보는 담지 않도록 해야 한다.
䷍ 세션(Session)
브라우저가 종료되기 전까지 클라이언트의 요청을 유지하게 해주는 기술이다.
세션의 특징
- 웹 서버에 웹 컨터이너의 상태를 유지하기 위한 정보를 저장한다.
- 웹 서버에 저장되는 쿠키(세션 쿠키 / session cookie)이다.
- 브라우저를 닫거나, 서버에서 세션을 삭제했을 때만 삭제되기 때문에 쿠키보다 비교적 보안적으로 우수하다.
- 서버 용량 허용 범위 내에서 저장 데이터에 제한이 없다.
- 각 클라이언트에 고유 세션 ID(Session ID)를 부여한다. 세션 ID를 통해 클라이언트를 구분하여 각 요구에 맞는 서비스를 제공한다.
세션의 작동 방식
- 클라이언트가 서버에 로그인 요청
- 서버는 클라이언트의 로그인 요청의 유효성을 확인하고(아이디와 비밀번호 검사) 유니크(unique)한 id를 sessionId로 저장한다.
- 서버가 응답할 때 응답헤더에 sessionId를 쿠키에 추가하여 응답한다.
- 클라이언트는 이후 서버에 요청할 때 전달받은 sessionId를 쿠키에 자동으로 요청 헤더에 추가하여 요청한다.
- 서버에서 요청 헤더의 sessionId 값이 저장된 session 저장소에서 찾아보고 유효한지 확인 후 요청을 처리하고 응답한다.
세션의 단점
세션의 내용은 서버에 저장되기 때문에 계속 늘어날 경우 서버에 과부하가 발생할 수 있다.
또한 세션에 대한 정보가 서버에 있어 과정이 쿠키에 비해 비교적 속도가 느리다.
3. 쿠키와 세션의 차이
- 쿠키와 세션은 비슷한 역할을 하며 동작원리도 비슷하다. 그 이유는 결국 세션도 쿠키를 사용하기 때문이다.
쿠키 | 세션 | |
저장 위치 | client | server |
보안 | 클라이언트 로컬에 저장되기 때문에 변질되거나 request에서 스니핑 당할 우려가 있어 취약함 | 쿠키를 이용하여 sessionId만 저장하고 그것을 구분하여 서버에서 처리하기 때문에 보안성 좋음 |
요청 속도 | 빠름 | 느림 |
라이프 사이클 | 만료기간이 있지만 파일로 저장되기 때문에 브라우저를 종료해도 계속 정보가 남아 있을 수 있다. | 만료시간을 정할 수 있지만 브라우저가 종료되면 만료시간에 상관없이 삭제된다. 예를 들어, 크롬에서 다른 탭을 사용해도 세션을 공유한다. |
4. 결론
세션이 쿠키에 비해 우수한 보안성을 가지고 있으나 쿠키를 사용하는 이유는 세션은 서버에 저장되고, 서버의 자원을 사용하기 때문에 한계가 있고 속도가 느려질 수 있다.
따라서 자원 관리 차원에서 쿠키와 세션을 적절한 요소 및 기능에 병행 사용하여 서버 자원의 낭비를 방지하며 웹사이트의 속도를 높여 효과적으로 사용할 수 있다.
세션은 사용자의 수가 많아지면 많아질수록 메모리를 차지하기 때문에 이런 문제들을 보완한 토큰 기반의 인증방식을 사용하는 추세이다.
그중 서버 메모리에 정보를 따로 저장해야 한다는 점을 보완하여 토큰 방식인 JWT(JSON Web Token)이 있다.
JWT 관련 포스팅을 기재할 예정이다.
'Etc' 카테고리의 다른 글
[Notion] 스터디 전용 노션 페이지를 만들고 싶은데.. (0) | 2024.05.31 |
---|---|
[Review] Hello World24 컨퍼런스 회고 (0) | 2024.04.01 |
[Etc] Kakao Maps 단일 오버레이 관리하기 (0) | 2024.03.29 |
[npm] ERROR : EACCES: permission denied, mkdir (0) | 2024.03.20 |
[Maps API] Kakao Maps API를 선택한 이유? (1) | 2024.03.12 |