SecretKey파싱 오류 (JWT validity cannot be asserted and should not be trusted.)

Sol's·2022년 12월 7일
0

오류

목록 보기
3/18

JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not be trusted.

JWT signature가 맞지 않는다는 오류가 나서 yml설정과 환경설정을 확인했더니 이상이 없었다.
혹시나 해서 코드까지 확인해 봤지만 오류가 날만한 것은 보이지 않았다

그래서 구글 검색을 했다.

답은 너무 간단했는데 토큰 생성할 때 secretKey와 파싱할 때 secretKey가 달라서 발생하는 문제라고 한다.

setSigningKey()의 인자에 바이트로 인코딩된 key를 넣었야 하는데 그냥 문자열을 넣어서 발생한 것이였다.

아래는 오류가 났던 코드이다.

public class JwtUtil {

    public static String getUserName(String token, String secretKey) {
        return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token)
                .getBody().get("userName", String.class);
    }

    public static boolean isExpired(String token, String secretKey) {
        return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token)
                .getBody().getExpiration().before(new Date());
    }
    public static String createToken(String userName, String secretKey, long expiredTimeMs){
        Claims claims = Jwts.claims(); //일종의 Map이다 Claims로 정보를 담을 수 있다.
        claims.put("userName", userName); //userName을 claims에 담는다

        return Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(new Date(System.currentTimeMillis())) //시작시간
                .setExpiration(new Date(System.currentTimeMillis() + expiredTimeMs)) //만료시간
                .signWith(SignatureAlgorithm.HS256,secretKey) //어떤 알고리즘을 사용할지
                .compact();
    }
}

모든 secretKey에 .getBytes()를 붙였더니 오류가 해결되었다.
변경코드

public class JwtUtil {

    public static String getUserName(String token, String secretKey) {
        return Jwts.parser().setSigningKey(secretKey.getBytes()).parseClaimsJws(token)
                .getBody().get("userName", String.class);
    }

    public static boolean isExpired(String token, String secretKey) {
        return Jwts.parser().setSigningKey(secretKey.getBytes()).parseClaimsJws(token)
                .getBody().getExpiration().before(new Date());
    }
    public static String createToken(String userName, String secretKey, long expiredTimeMs){
        Claims claims = Jwts.claims(); //일종의 Map이다 Claims로 정보를 담을 수 있다.
        claims.put("userName", userName); //userName을 claims에 담는다

        return Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(new Date(System.currentTimeMillis())) //시작시간
                .setExpiration(new Date(System.currentTimeMillis() + expiredTimeMs)) //만료시간
                .signWith(SignatureAlgorithm.HS256,secretKey.getBytes()) //어떤 알고리즘을 사용할지
                .compact();
    }
}

언제봐도 기분좋은 Http 상태코드 200!

참고자료
https://velog.io/@yeon/TIL-8%EC%9B%94-11%EC%9D%BC

profile
배우고, 생각하고, 행동해라

0개의 댓글