본문으로 건너뛰기
Advertisement

11.3 JWT 아키텍처 기초

현대적인 REST API 서버에서는 서버의 확장성을 위해 세션(Session) 대신 JWT(JSON Web Token) 를 이용한 무상태(Stateless) 인증 방식을 주로 사용합니다.

1. JWT의 구조

JWT는 점(.)으로 구분된 세 부분으로 구성됩니다.

  1. Header: 토큰의 타입과 사용 중인 해싱 알고리즘(예: HS256) 정보
  2. Payload: 로그인한 사용자의 ID, 권한, 만료 시간 등 실질적인 데이터(Claim)
  3. Signature: 서버만 알고 있는 시크릿 키로 헤더와 페이로드를 조합하여 생성한 서명 부분

2. JWT 인증 흐름

  1. 사용자가 로그인 요청을 보냅니다.
  2. 서버는 자격 증명을 확인하고, JWT 토큰을 발급하여 응답합니다.
  3. 클라이언트는 이후 요청 시 HTTP Authorization HeaderBearer <token> 형식을 포함하여 전달합니다.
  4. 서버는 토큰의 서명을 검증하고 내부의 사용자 정보를 추출하여 인증된 사용자로 간주합니다.

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 설정이 필수입니다.
Advertisement