세션 기반 인증 vs 토큰 기반 인증
Updated: 2025-04-17
weekly
세션 기반 인증 vs 토큰 기반 인증
인증이란?
인증(Authentication)은 사용자가 자신이 주장하는 사람이 맞는지 확인하는 과정입니다. 웹 애플리케이션에서는 주로 사용자명과 비밀번호를 통해 이루어지며, 인증이 성공하면 해당 사용자는 시스템에 접근할 수 있는 권한을 얻게 됩니다.
1. 세션 기반 인증
세션 기반 인증은 서버 측에서 사용자의 인증 상태를 관리합니다.
1.1 작동 원리
- 사용자가 로그인 정보(ID/PW)를 서버에 전송합니다.
- 서버는 정보를 검증한 후, 고유한 세션 ID를 생성합니다.
- 이 세션 ID는 서버의 메모리나 데이터베이스에 저장됩니다.
- 서버는 세션 ID를 쿠키에 담아 클라이언트에게 전송합니다.
- 이후 클라이언트의 모든 요청에는 이 쿠키가 자동으로 포함됩니다.
- 서버는 쿠키의 세션 ID를 확인하여 사용자를 식별합니다.
1.2 장점
- 보안성: 실제 인증 정보는 서버에만 저장되므로 상대적으로 안전합니다.
- 제어 용이성: 서버에서 세션을 쉽게 무효화할 수 있어 로그아웃 처리가 간단합니다.
- 구현 편의성: 대부분의 웹 프레임워크가 세션 관리 기능을 내장하고 있습니다.
1.3 단점
- 서버 부하: 사용자가 많아질수록 서버 메모리 부담이 커집니다.
- 확장성 문제: 여러 서버를 사용하는 경우, 세션 정보를 공유해야 하는 복잡성이 있습니다.
- CSRF 취약성: Cross-Site Request Forgery 공격에 취약할 수 있습니다.
1.4 사용 예시
- 단일 도메인 웹사이트: 전통적인 서버 렌더링 웹사이트
- 높은 보안이 필요한 경우: 금융, 의료 등 민감한 데이터 처리
- 사용자 활동 세밀한 제어가 필요한 경우: 사용자 행동 추적이 중요한 서비스
- 서버 규모가 작은 경우: 소규모 애플리케이션에서는 세션 관리가 간단
2. 토큰 기반 인증
토큰 기반 인증은 클라이언트 측에서 인증 상태를 관리하는 방식으로, 특히 JWT(JSON Web Token)가 널리 사용됩니다.
2.1 작동 원리
- 사용자가 로그인 정보를 서버에 전송합니다.
- 서버는 정보를 검증한 후, 서명된 토큰을 생성합니다.
- 이 토큰은 클라이언트에게 반환되며, 클라이언트는 이를 저장합니다(로컬 스토리지, 쿠키 등).
- 이후 요청 시 클라이언트는 토큰을 HTTP 헤더(주로 Authorization)에 포함하여 전송합니다.
- 서버는 토큰의 유효성을 검증하여 사용자를 식별합니다.
2.2 JWT 구조
JWT는 세 부분으로 구성됩니다:
- 헤더(Header): 토큰 유형과 사용된 알고리즘 정보
- 페이로드(Payload): 사용자 ID, 역할, 만료 시간 등의 클레임(claim) 정보
- 서명(Signature): 토큰의 무결성을 보장하기 위한 서명
2.3 장점
- 무상태(Stateless): 서버가 상태를 저장하지 않아 확장성이 좋습니다.
- 범용성: 다양한 도메인과 플랫폼 간에 사용할 수 있습니다.
- 모바일 친화적: 쿠키 관련 문제 없이 모바일 앱에서도 쉽게 사용 가능합니다.
- 자원 효율성: 서버 메모리를 사용하지 않습니다.
2.4 단점
- 토큰 크기: 세션 ID보다 크기가 커서 네트워크 오버헤드가 발생할 수 있습니다.
- 보안 관리: 토큰이 탈취되면 만료 전까지 대응이 어렵습니다.
- 저장소 노출: 클라이언트 측 저장소가 XSS 공격에 취약할 수 있습니다.
2.5 사용 예시
- 분산 시스템: 마이크로서비스 아키텍처
- 다양한 클라이언트: 웹, 모바일 앱, IoT 디바이스 등 다양한 플랫폼 지원
- 서버리스 아키텍처: AWS Lambda 같은 서버리스 환경
- SPA(Single Page Application): React, Vue, Angular 등의 프레임워크 기반 앱
- 제3자 API 제공: 외부에 API를 제공하는 서비스
