🍪 쿠키 (Cookie)
정의: 클라이언트(브라우저) 측에 저장되는 데이터 조각이자 시스템 매개체입니다.
저장 위치: **클라이언트(웹 브라우저)**의 로컬 저장소.
주요 용도:
- 사용자 환경 설정 기억 (예: 언어 설정, 테마, 장바구니 정보).
- 사용자 추적 및 광고.
- 유효기간이 있어 정해진 기간 동안 유지됩니다.
특징:
- 요청 시마다 자동으로 서버로 전송됩니다.
- 네이티브 앱 환경에서는 일반적으로 사용되지 않습니다. (앱에서는 별도의 로컬 저장소를 사용).
🔑 세션 (Session)
정의: 사용자의 상태 정보를 서버에 저장하고 관리하는 방법입니다.
저장 위치: 서버의 메모리, 파일, 또는 데이터베이스(DB).
주요 용도: 로그인 상태 유지 등 민감하거나 중요한 상태 관리.
작동 방식:
- 사용자가 로그인하면, 서버는 고유한 세션 ID를 생성하고 이 ID와 사용자 정보를 매핑하여 서버에 저장합니다.
- 이 세션 ID를 쿠키에 담아 클라이언트에게 전송합니다.
- 클라이언트는 요청 시마다 이 세션 ID를 서버로 전송합니다.
- 서버는 전송받은 세션 ID로 DB나 저장소에서 사용자 정보를 찾고 인증합니다.
특징:
- 서버에 정보가 저장되므로 보안성이 비교적 높습니다.
- 서버에 저장된 세션 정보를 삭제하면 강제 로그아웃이 가능합니다. (DB를 거치기 때문에 임의 삭제 가능).
- 사용자가 많아지면 서버의 부담이 증가할 수 있습니다 (세션 저장 공간 및 DB 조회).
⭐ 토큰 (Token) 및 JWT (JSON Web Token)
🏷️ 토큰 (Token)의 개념
- 정의: 사용자를 인증하거나 특정 권한을 부여하기 위해 사용하는 텍스트 문자열입니다.
- 특징:
- 기본적으로 서버가 사용자의 상태를 기억할 필요가 없게 만듭니다 (무상태성, Stateless).
🪙 JWT (JSON Web Token)
정의: 정보를 담고 있는 자체 포함형(Self-contained) 토큰의 표준 방식입니다.
저장 위치: 클라이언트 (Local Storage, Session Storage, 또는 쿠키)에 저장됩니다.
작동 방식:
- 서버는 토큰을 생성할 때 **시크릿 키(Secret Key)**를 사용하여 토큰에 서명(Signature)합니다.
- 클라이언트는 이 토큰을 요청 시마다 헤더에 담아 전송합니다.
- 서버는 DB 조회 없이 시크릿 키를 이용해 **토큰의 유효성(서명 검증)**만 확인하고 인증합니다.
토큰 형식: Header.Payload.Signature 세 부분으로 구성된 스트링입니다.
핵심 특징:
- 암호화되어 있지 않습니다. (base64로 인코딩되어 있어 누구나 내용을 볼 수 있지만, 서명 덕분에 변조는 불가능합니다.) 민감한 정보는 Payload에 넣으면 안 됩니다.
- 무상태성(Stateless): 서버는 사용자의 세션 정보를 저장하지 않아도 됩니다.
- 강제 로그아웃 불가능: 토큰이 만료될 때까지는 서버 측에서 강제로 토큰을 무효화하기 어렵습니다. (DB를 거치지 않아 발생하는 특징)
- 서버 확장 용이: 여러 서버 간에 상태 공유가 필요 없어 대규모 서비스에서 서버 부하를 줄일 수 있습니다.
| 구분 | 쿠키 (Cookie) | 세션 (Session) | JWT (Token) |
| 정보 저장 위치 | 클라이언트 (브라우저) | 서버 (DB, 메모리) | 클라이언트 (토큰 자체) |
| 인증 정보 저장 | 세션 ID 또는 기타 데이터 | 세션 ID와 메핑된 사용자 정보 | 사용자 정보 (Payload) |
| 요청 시 서버 부하 | 낮음 (데이터가 작음) | 높음 (DB 조회 필요) | 낮음 (DB 조회 불필요, 서명 검증만) |
| 강제 로그아웃 | 불가능 | 가능 (서버 세션 삭제) | 불가능 (토큰 만료 대기) |
| 확장성 | 보통 | 낮음 (서버 간 세션 공유 필요) | 높음 (무상태성) |
| 용도 | 언어 설정, 장바구니, 추적 | 로그인 상태 유지 (보안성 높음) | 로그인 및 권한 부여 (확장성 높음) |