SPRING

[SPRING] JWT

도원좀비 2025. 4. 1. 14:15

1️⃣ JWT란?

JWT는 JSON 형식의 데이터를 암호화된 토큰 형태로 표현하여 사용자의 인증 정보를 안전하게 주고받기 위한 방식

 

🧩 구조

  • Header: 토큰 타입과 서명 알고리즘
  • Payload: 사용자 정보, 권한, 만료 시간 등
  • Signature: 토큰 위조 방지를 위한 서명

2️⃣ 세션 인증 vs JWT 인증

항목 세션 인증 JWT 인증
상태 관리 서버가 세션 저장 서버는 무상태 (Stateless
확장성 낮음 (세션 동기화 필요) 높은 (토큰만으로 인증 가능)
로그아웃 처리 세션 제거 블랙리스트 처리 필요
보안 서버제어 쉬움 토큰 탈취 시 위험(짧은 수명 + Refresh Token으로 보완)

3️⃣ JWT 직접 생성 / 검증

String token = Jwts.builder()
    .setSubject("user123")
    .setIssuedAt(new Date())
    .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 10))
    .signWith(secretKey)
    .compact();
    
Claims claims = Jwts.parserBuilder()
    .setSigningKey(secretKey)
    .build()
    .parseClaimsJws(token)
    .getBody();

 


4️⃣ Refresh Token 전략

구조

  • Access Token: 인증용, 수명 짧음 (5~30분)
  • Refresh Token: 재발급용, 수명 김 (7일~30일)
  • Redis 등 서버 저장소에 Refresh Token 저장

흐름

  1. 로그인 시 두 토큰 모두 발급
  2. Access Token 만료 시 → Refresh Token으로 재발급
  3. Refresh Token도 만료되면 재로그인

5️⃣ Spring Security + JWT 통합 구조

전체 흐름

[로그인 요청] → [JWT 발급] → [요청 시 JWT 검증] → [인증 성공 시 SecurityContext 저장]

 

핵심 클래스

클래스 역할
SecurityConfig 전체 보안 정책 구성
JwtTokenProvider 토큰 발급 및 검증 유틸
JwtAuthenticationFilter 매 요청마다 JWT 검증
UserDetailsService 사용자 정보 조회
AuthController 로그인, 토큰 재발급 처

 

필터 설정

.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)

6️⃣ Redis를 활용한 보안 강화

Refresh Token 저장소

key: refresh:<userId>
value: <refresh_token>

Access Token 블랙리스트

key: blacklist:<accessToken>
value: "logout"
TTL: accessToken의 남은 유효시간

7️⃣ 정리 : JWT 인증 시스템 흐름

[로그인]
 → Access Token + Refresh Token 발급
 → Refresh Token은 Redis에 저장

[API 요청]
 → Access Token 검증
 → 블랙리스트 조회

[토큰 재발급 요청]
 → Refresh Token 검증
 → Redis에 저장된 토큰과 비교

[로그아웃]
 → Access Token을 블랙리스트에 등록

'SPRING' 카테고리의 다른 글

[Spring] N+1  (1) 2025.04.09
[SPRING] Spring Security + JWT 인증 예외 처리 흐름  (1) 2025.04.01
[SPRING] JPAQueryFactory  (0) 2025.03.30
[SPRING] QueryDSL  (1) 2025.03.30
[SPRING] 동적 쿼리  (1) 2025.03.30