2024-05-14 (104일차) - JWT, REST API

·2024년 5월 14일

📅 2024-05-14, 104일차


JWT

  • 토큰 중에서 유의미한 정보를 담는 토큰
  • JWT 를 쓰려면 secretKey가 있어야하고, secretKey는 길어야 한다.
  • JWT를 만드려면 라이브러리가 필요하다
    • build.gradle 에 dependencies추가해야함.
  • secretKey는 스프링에서 바로 쓸 수 없고 객체화 시켜야서 사용해야 한다.

t7()

  1. 토큰에 담길 내용을 맵에 담아준다
  2. 맵의 정보를 사용해서 토큰을 생성
  3. 토큰 유효성체크 (만료된 토큰인지 사용가능한 토큰인지)
  4. 다시 토큰의 정보를 가져오라며 provider한테 넘겨주면
  5. 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 주소체계

profile
hello world

0개의 댓글