Q1. 세션 기반 인증에 대해 설명해 주세요.
개념
세션 기반 인증이란, 서버가 사용자의 로그인 상태를 세션(session)이라는 형태로 서버 메모리나 DB(i.e. Redis)에 저장하고, 클라이언트는 세션을 식별하는 세션 ID를 쿠키로 받아 요청마다 서버에 보낸다.
서버는 이 세션 ID를 확인해 사용자를 식별하는 인증 방식이다.
흐름
- 사용자가 ID/PW로 로그인
- 서버는 세션 저장소에 사용자 정보를 기록하고, 세션 ID를 생성
- 세션 ID를 클라이언트에게 쿠키로 전달
- 클라이언트는 이후 요청마다 이 쿠키를 서버로 전송
- 서버는 세션 저장소에서 세션 ID를 확인하고 사용자 인증 처리
장점
- 구현이 간단하고 오래된 웹 프레임워크에서 기본 지원
- 서버가 상태를 관리하므로 유저 정보 저장이 용이
단점
- 서버가 모든 세션을 기억해야 하므로 확장성 문제 발생 (특히 서버가 여러 대일 경우 세션 공유 필요)
- 모바일 앱이나 외부 API 연동에는 부적합
- 쿠키 기반이라 CSRF 취약 가능성 있음
Q2. 토큰 기반 인증에 대해 설명해 주세요.
개념
서버가 인증 성공 시 토큰을 발급하고, 클라이언트는 이후 요청마다 이 토큰을 Authorization Bearer 헤더에 담아 전송한다.
서버는 토큰 자체를 검증하여 사용자를 식별하고, 서버에 별도의 상태 저장이 필요 없다.
흐름
- 사용자가 로그인 요청
- 서버가 사용자 검증 후 JWT 같은 토큰 생성
- 클라이언트는 토큰을 저장 (쿠키, localStorage 등)
- 이후 요청 시 Authorization 헤더에 토큰 첨부
- 서버는 토큰의 유효성을 검증 (서명/만료 시간 확인) 후 요청 처리
장점
- Stateless: 서버가 세션 상태를 저장하지 않아도 됨 (확장성과 분산 환경에서 유리)
- 모바일 앱, SPA, API 인증에 적합
- 인증 + 권한 부여까지 쉽게 처리 가능
단점
- 토큰이 탈취되면 만료될 때까지 무조건 유효 (서버가 강제로 무효화하기 어려움)
- 토큰이 길어질 수 있어 네트워크 트래픽 증가
- 구현 난이도가 세션보다 살짝 높음