JWT signature does not match locally computed signature.
에러발생할 때 테스트 코드는 아래와 같다.
@SpringBootTest
class TokenProviderTest {
@Autowired
private TokenProvider tokenProvider;
private Long userId;
@Value("${jwt.secret}")
private String secretKey;
@BeforeEach
void setUp() {
userId = 1L;
}
/**
* 생성한 토큰의 유효기간이 현재 시점 이후임을 보장한다.
*/
@Test
@DisplayName("토큰 생성 기능 테스트 ")
void createToken() {
String token = tokenProvider.createToken(userId);
Jws<Claims> claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token);
assertThat(claims.getBody().getExpiration()).isAfter(new Date());
}
}
검색을 해보니 토큰 생성할 때 secretKey와 파싱할 때 secretKey가 달라서 발생하는 문제라고 한다.
디버깅 해보니 Jws<Claims> claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token);
파싱하는 이 부분에서 setSigningKey()의 인자가 바이트로 인코딩된 key를 넣었어야 했는데 그냥 문자열을 넣어서 발생한 것이였다.
인자를 secretKey.getBytes()
로 변경하니 테스트가 잘 통과한다.
하루에 한문제씩 ㅎㅇㅌ