Jwt Token
๐ JWT Token
๐ ๋์ ์๋ฆฌ
ํด๋ผ์ด์ธํธ๊ฐ ๋ก๊ทธ์ธ์ ํ๋ฉด ์๋ฒ์์ Jwt Token์ ๋ฐ๊ธํด์ค๋ค.
ํด๋ผ์ด์ธํธ๋ ๋ฐ๊ธ ๋ฐ์ Jwt Token์ ์์ผ๋ก ์์ ๋ชจ๋ ์์ฒญ์ ํจ๊ป ๋ณด๋ธ๋ค.
์๋๋ฉด ์์ฒญ ๋ณด๋ด๋ ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๐ ๊ตฌ์กฐ
Header + Payload + Signature
Header
์ฐ์ Jwt Token์ Header๋ฅผ ๋ง๋ค์ด์ค๋ค.
๋ณดํต header์๋ ํ ํฐ ํ์ (JWT), ์ํธํ ์๊ณ ๋ฆฌ์ฆ(alg)์ด ๋ค์ด๊ฐ๋ค.
HashMap์ ์์๋ ๋ณด์ฅ์ด ์๋๋ค.
// JWT Header
private static Map<String, Object> createHeader() {
Map<String, Object> header = new HashMap<>();
header.put("alg","HS256");
header.put("typ","JWT");
return header;
}
Payload
ํ ํฐ์์ ์ฌ์ฉ์์ ๋ํ ์ ๋ณด์ ์กฐ๊ฐ์ธ Claim์ ์ ์ฅํ๋ค.
claim์๋ ๋ค์ํ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ ์ ์๋๋ฐ ํฌ๊ฒ ์ธ๊ฐ์ง๋ก ๋ถ๋ฅ๋๋ค.
๋ฑ๋ก๋ ํด๋ ์(Registered Claim)
๊ณต๊ฐ ํด๋ ์(Public Claim)
๋น๊ณต๊ฐ ํด๋ ์(Private Claim)
// JWT Claims
private static Map<String, Object> createClaims(LoginVo loginVo) {
Map<String, Object> claims = new HashMap<>();
claims.put("email",loginVo.getEmail());
claims.put("seq", loginVo.getUserSeq());
claims.put("authCode", loginVo.getAuthCode());
return claims;
}
Signature
๋ฉ์์ง๊ฐ ๋์ค์ ๋ณ๊ฒฝ๋์ง ์์๋์ง ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
Signature๋ Header์ Payload๋ฅผ BASE64๋ก ์ธ์ฝ๋ฉํ ๊ฐ์ ํฉ์น ํ,
์ฃผ์ด์ง SecretKey๋ก ํด์ฌ์์ฌ ์์ฑ๋ ๊ฐ์ ๋งํ๋ค.
์๋์ ์ฝ๋๋ secetKey๋ฅผ ๋ฐ์ดํธ๋ก ๋ฐ๊ฟ์คฌ๋ค.
์ถํ์ ํ ํฐ์ ์์ฑํ ๋ secetKey๋ฅผ ๋ฐ์ดํธ๋ก ๋ฃ์ด์ค์ผ ํด์ ๊ทธ๋ฐ๋ค๊ณ ํ๋ค.
public static Key createSigningKey() {
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(secretKey);
return new SecretKeySpec(apiKeySecretBytes,SignatureAlgorithm.HS256.getJcaName());
}
Generate Token
setSubject : ํ ํฐ ์ ๋ชฉ (ํ ํฐ์์ ์ฌ์ฉ์์ ๋ํ ์๋ณ๊ฐ์ด ๋๋ค.)
ํ ํฐ ๋ง๋ฃ ์๊ฐ ์ค์ ์ Calnedar ๋ชจ๋์ ์ฌ์ฉํ๋ค.
public static String generateJwtToken(LoginVo loginVo) {
String builder = Jwts.builder()
// header
.setHeader(createHeader())
// claim
.setSubject(loginVo.getEmail())
.setClaims(createClaims(loginVo))
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(createExpireDateForOneDay())
// signature (HS256๊ณผ Key๋ก Sign)
.signWith(SignatureAlgorithm.HS256, createSigningKey())
// ํ ํฐ ์์ฑ
.compact();
return builder;
}