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 저장
흐름
- 로그인 시 두 토큰 모두 발급
- Access Token 만료 시 → Refresh Token으로 재발급
- 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 |