11.3 JWT 아키텍처 기초
현대적인 REST API 서버에서는 서버의 확장성을 위해 세션(Session) 대신 JWT(JSON Web Token) 를 이용한 무상태(Stateless) 인증 방식을 주로 사용합니다.
1. JWT의 구조
JWT는 점(.)으로 구분된 세 부분으로 구성됩니다.
- Header: 토큰의 타입과 사용 중인 해싱 알고리즘(예: HS256) 정보
- Payload: 로그인한 사용자의 ID, 권한, 만료 시간 등 실질적인 데이터(Claim)
- Signature: 서버만 알고 있는 시크릿 키로 헤더와 페이로드를 조합하여 생성한 서명 부분
2. JWT 인증 흐름
- 사용자가 로그인 요청을 보냅니다.
- 서버는 자격 증명을 확인하고, JWT 토큰을 발급하여 응답합니다.
- 클라이언트는 이후 요청 시 HTTP Authorization Header 에
Bearer <token>형식을 포함하여 전달합니다. - 서버는 토큰의 서명을 검증하고 내부의 사용자 정보를 추출하여 인증된 사용자로 간주합니다.
3. 왜 JWT를 사용하는가?
- Stateless: 서버가 클라이언트의 상태(세션)를 유지하지 않아도 되므로 서버 확장이 용이합니다.
- Decoupled: 인증 서버와 자원 서버가 분리된 구조(마이크로서비스)에서 효율적입니다.
- Security: 서명(Signature)을 통해 데이터 위변조 여부를 신속하게 확인할 수 있습니다.
4. 스프링 시큐리티와 JWT 연동 로직
JWT 방식에서는 세션을 사용하지 않도록 설정하고, 직접 만든 JwtFilter를 체인에 추가해야 합니다.
// SecurityConfig 설정 일부
http
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.addFilterBefore(new JwtAuthenticationFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class);
🎯 핵심 요점
- JWT는 Header, Payload, Signature 로 구성되어 있습니다.
- 세션 기반 인증과 달리 서버가 상태를 저장하지 않는 Stateless 방식입니다.
- 스프링 시큐리티 설정에서 SessionCreationPolicy.STATELESS 설정이 필수입니다.