Hamutaro - Hamtaro 4

Backend/Spring

[Spring] JWT (JSON Web Token)

carsumin 2025. 2. 18. 22:34
JWT λž€?
  • JSON Web Token, JSON 객체λ₯Ό μ•ˆμ „ν•˜κ²Œ μ „μ†‘ν•˜κΈ° μœ„ν•œ 토큰 기반 인증 방식
  • 자기 포함 (Self-contained) : ν† ν°μ•ˆμ— μœ μ € μ •λ³΄λ‚˜ κΆŒν•œ 같은 ν•„μš”ν•œ 정보λ₯Ό 직접 λ‹΄κ³  μžˆμ–΄μ„œ λ³„λ„μ˜ μ„Έμ…˜ μ €μž₯μ†Œκ°€ ν•„μš”μ—†μŒ
  • μ„œλͺ… (Signature) : 토큰은 μ„œλͺ…λ˜μ–΄ μžˆμ–΄μ„œ λ‚΄μš©μ΄ μœ„μ‘°λ˜μ§€ μ•Šμ•˜λŠ”μ§€ 검증이 κ°€λŠ₯함
  • Stateless : μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœλ₯Ό μœ μ§€ν•  ν•„μš”μ—†μ΄ ν† ν°λ§Œ ν™•μΈν•˜λ©΄ 됨

 

JWT ꡬ쑰
  • Header : ν† ν°μ˜ νƒ€μž…κ³Ό ν•΄μ‹± μ•Œκ³ λ¦¬μ¦˜ (ex : HS256)
  • Payload : μœ μ € 정보 및 ν΄λ ˆμž„(claims)이 ν¬ν•¨λ˜λŠ” 데이터 (ex : sub, name, exp λ“±)
  • Signature : 헀더와 νŽ˜μ΄λ‘œλ“œλ₯Ό λΉ„λ°€ν‚€λ‘œ ν•΄μ‹±ν•œ μ„œλͺ…

 

JWT util class 예제
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.util.Date;

public class JwtTokenUtil {
    // λΉ„λ°€ν‚€ (μ‹€μ œλ‘œλŠ” ν™˜κ²½λ³€μˆ˜λ‚˜ config에 보관)
    private final SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);

    // JWT μœ νš¨μ‹œκ°„ (예: 1μ‹œκ°„)
    private final long expirationMs = 1000 * 60 * 60;

    // JWT 생성
    public String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username) // μ‚¬μš©μž μ‹λ³„μž
                .setIssuedAt(new Date()) // λ°œν–‰ μ‹œκ°„
                .setExpiration(new Date(System.currentTimeMillis() + expirationMs)) // 만료 μ‹œκ°„
                .signWith(secretKey) // μ„œλͺ…
                .compact();
    }

    // JWT 검증 및 νŒŒμ‹±
    public Claims getClaims(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(secretKey)
                .build()
                .parseClaimsJws(token)
                .getBody();
    }

    // 토큰 만료 μ—¬λΆ€ 확인
    public boolean isTokenExpired(String token) {
        Date expiration = getClaims(token).getExpiration();
        return expiration.before(new Date());
    }

    // μ‚¬μš©μž 이름 μΆ”μΆœ
    public String getUsername(String token) {
        return getClaims(token).getSubject();
    }
}

 

 

JWT μ‚¬μš© μ˜ˆμ‹œ
  1. 둜그인 인증
    1. μ‚¬μš©μžκ°€ 둜그인
    2. μ„œλ²„κ°€ μ‚¬μš©μž 정보λ₯Ό λ°”νƒ•μœΌλ‘œ JWT λ°œκΈ‰
    3. ν΄λΌμ΄μ–ΈνŠΈλŠ” 이후 μš”μ²­λ§ˆλ‹€ JWTλ₯Ό 토큰 ν˜•νƒœλ‘œ 전솑
    4. μ„œλ²„λŠ” 토큰을 κ²€μ¦ν•˜μ—¬ 인증 처리
  2. SSO (Single Sign-On)
    • μ—¬λŸ¬ μ„œλΉ„μŠ€κ°€ μžˆλŠ” μ‹œμŠ€ν…œμ—μ„œ ν•œ 번의 둜그인으둜 μ—¬λŸ¬ μ„œλΉ„μŠ€μ— μ ‘κ·Όν•  수 μžˆλ„λ‘ JWTλ₯Ό μ‚¬μš©
    • ex : νšŒμ‚¬ ν¬ν„Έμ—μ„œ λ‘œκ·ΈμΈν•˜λ©΄ 메일, μΈμ‚¬μ‹œμŠ€ν…œ, νšŒκ³„μ‹œμŠ€ν…œ λ“± μžλ™ 둜그인
  3. λͺ¨λ°”일 μ•±κ³Ό μ„œλ²„ κ°„ 톡신
    • λͺ¨λ°”일 앱은 μ„Έμ…˜ λŒ€μ‹  JWTλ₯Ό μ‚¬μš©ν•˜μ—¬ 인증 및 κΆŒν•œ 관리λ₯Ό μˆ˜ν–‰
    • μ„œλ²„κ°€ μƒνƒœλ₯Ό μ €μž₯ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— ν™•μž₯성이 μ’‹μŒ
  4. API 인증 및 κΆŒν•œ 처리
    • μ‚¬μš©μž κΆŒν•œ (role: admin) 등을 토큰에 λ‹΄μ•„ API 접근을 μ œμ–΄

 

JWT 토큰 μœ νš¨μ„± 체크
  • μƒμ„±ν•œ 토큰이 μœ νš¨ν•œμ§€ μ•„λž˜μ˜ μ‚¬μ΄νŠΈμ—μ„œ 검사할 수 있음
  • https://jwt.io/