JWT (JSON Web Token)
JWT는 서버와 클라이언트 간에 정보를 안전하게 전달하기 위한 토큰 기반 인증 방식입니다. 토큰은 보통 Base64로 인코딩된 JSON 형식의 데이터를 포함하며, 세 부분(헤더, 페이로드, 서명)으로 구성된다.
특징:
- 서버리스 인증 : JWT는 서버에서 상태 정보를 유지하지 않는다. 모든 인증 정보는 토큰 자체에 포함되므로 서버는 토큰을 검증하기 위한 키만 있으면 된다.
- 확장성 : 분산된 시스템에서 적합하며, 중앙 서버 없이 각 서비스가 독립적으로 토큰을 검증할 수 있다.
- Self-contained : 인증 정보 및 사용자 정보가 토큰에 포함되므로 추가 요청 없이 필요한 정보를 얻을 수 있다.
장점:
- 서버 부하 감소 : 세션 저장소가 필요 없으므로 서버 리소스를 절약할 수 있음.
- 클라이언트 서버 간 독립성 : 여러 도메인에서 쉽게 활용 가능.
- 탈중앙화 : 별도의 중앙 세션 관리가 없이도 인증이 가능.
단점:
- 보안 위험 : 토큰이 탈취되면 만료될 때까지 사용할 수 있음.
- 관리의 어려움 : 토큰을 상제로 무효화하려면 별도의 로직이 필요.
Session
Session은 서버가 클라이언트의 인증 상태를 서버에 저장하는 방식이다. 클라이언트는 서버로부터 발급받은 세션 ID를 쿠키로 저장하고, 이후 요청마다 이를 서버에 전송해 인증을 진행한다.
특징:
- 상태 저장 : 서버가 세션 상태를 관리하며, 클라이언트는 세션 ID만 전달한다.
- 중앙 집중식 관리 : 모든 인증 상태가 서버에 저장되므로 상태를 제어하기 용이하다.
장점:
- 높은 보안성 : 세션 ID는 서버에서만 검증 가능하며, 필요 시 세션 무효화가 간단.
- 사용자 상태 관리 용이 : 로그인, 로그아웃 등 상태 변경 시 바로 반영 가능.
- 토큰 탈취 위험 감소 : 세션 ID는 서버 내부에서만 유효하므로 외부 유출 가능성이 적음.
단점:
- 서버 부하 : 많은 사용자가 접속하는 경우, 서버 메모리에 세션 정보를 저장해야 하므로 리소스 부담이 큼.
- 확장성 문제 : 서버 간 상태 동기화가 필요하며, 분산 환경에서 구현이 복잡.
언제 어떤 것을 선택할까?
- JWT는 분산 시스템, 모바일 앱, API 기반 서비스에서 적합하다. 서버의 부담을 줄이고 확장성을 중요시하는 경우 유리하다.
- Session은 보안이 더 중요하거나, 상태 관리를 간단하게 구현하고 싶은 경우 적합하다.