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/