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 μ¬μ© μμ
- λ‘κ·ΈμΈ μΈμ¦
- μ¬μ©μκ° λ‘κ·ΈμΈ
- μλ²κ° μ¬μ©μ μ 보λ₯Ό λ°νμΌλ‘ JWT λ°κΈ
- ν΄λΌμ΄μΈνΈλ μ΄ν μμ²λ§λ€ JWTλ₯Ό ν ν° ννλ‘ μ μ‘
- μλ²λ ν ν°μ κ²μ¦νμ¬ μΈμ¦ μ²λ¦¬
- SSO (Single Sign-On)
- μ¬λ¬ μλΉμ€κ° μλ μμ€ν μμ ν λ²μ λ‘κ·ΈμΈμΌλ‘ μ¬λ¬ μλΉμ€μ μ κ·Όν μ μλλ‘ JWTλ₯Ό μ¬μ©
- ex : νμ¬ ν¬νΈμμ λ‘κ·ΈμΈνλ©΄ λ©μΌ, μΈμ¬μμ€ν , νκ³μμ€ν λ± μλ λ‘κ·ΈμΈ
- λͺ¨λ°μΌ μ±κ³Ό μλ² κ° ν΅μ
- λͺ¨λ°μΌ μ±μ μΈμ λμ JWTλ₯Ό μ¬μ©νμ¬ μΈμ¦ λ° κΆν κ΄λ¦¬λ₯Ό μν
- μλ²κ° μνλ₯Ό μ μ₯νμ§ μκΈ° λλ¬Έμ νμ₯μ±μ΄ μ’μ
- API μΈμ¦ λ° κΆν μ²λ¦¬
- μ¬μ©μ κΆν (role: admin) λ±μ ν ν°μ λ΄μ API μ κ·Όμ μ μ΄
JWT ν ν° μ ν¨μ± 체ν¬
- μμ±ν ν ν°μ΄ μ ν¨νμ§ μλμ μ¬μ΄νΈμμ κ²μ¬ν μ μμ
- https://jwt.io/