📅 2024-05-14, 104일차
JWT
- 토큰 중에서 유의미한 정보를 담는 토큰
- JWT 를 쓰려면 secretKey가 있어야하고, secretKey는 길어야 한다.
- JWT를 만드려면 라이브러리가 필요하다
- build.gradle 에 dependencies추가해야함.
- secretKey는 스프링에서 바로 쓸 수 없고 객체화 시켜야서 사용해야 한다.
t7()
- 토큰에 담길 내용을 맵에 담아준다
- 맵의 정보를 사용해서 토큰을 생성
- 토큰 유효성체크 (만료된 토큰인지 사용가능한 토큰인지)
- 다시 토큰의 정보를 가져오라며 provider한테 넘겨주면
- decoding하여 맵안의 내용을 보여준다
@SpringBootTest
class JwtTests {
@Test
@DisplayName("accessToken을 통해서 claims를 얻을 수 있다.")
void t7() {
Map<String, Object> claims = new HashMap<>();
claims.put("id", 1L);
claims.put("username", "admin");
String accessToken = jwtProvider.genToken(claims, 60 * 60 * 5);
System.out.println("accessToken: " + accessToken);
assertThat(jwtProvider.verify(accessToken)).isTrue();
Map<String, Object> claimsFromToken = jwtProvider.getClaims(accessToken);
System.out.println("claimsFromToken: " + claimsFromToken);
}
}
@Component
public class JwtProvider {
private SecretKey cachedSecretKey;
@Value("${custom.jwt.secretKey}")
private String secretKeyPlain;
private SecretKey _getSecretKey() {
String keyBase64Encoded = Base64.getEncoder().encodeToString(secretKeyPlain.getBytes());
return Keys.hmacShaKeyFor(keyBase64Encoded.getBytes());
}
public SecretKey getSecretKey() {
if (cachedSecretKey == null) cachedSecretKey = _getSecretKey();
return cachedSecretKey;
}
public String genToken(Map<String, Object> claims, int seconds) {
long now = new Date().getTime();
Date accessTokenExpiresIn = new Date(now + 1000L * seconds);
return Jwts.builder()
.claim("body", Ut.json.toStr(claims))
.setExpiration(accessTokenExpiresIn)
.signWith(getSecretKey(), SignatureAlgorithm.HS512)
.compact();
}
@SpringBootTest
class JwtTests {
public boolean verify(String token) {
try {
Jwts.parserBuilder()
.setSigningKey(getSecretKey())
.build()
.parseClaimsJws(token);
} catch (Exception e) {
return false;
}
return true;
}
public Map<String, Object> getClaims(String token) {
String body = Jwts.parserBuilder()
.setSigningKey(getSecretKey())
.build()
.parseClaimsJws(token)
.getBody()
.get("body", String.class);
return Ut.json.toMap(body);
}
}
}
일반사이트 주소체계
REST API 주소체계