카테고리 없음
JWT RS256 Public key 인증 에러
retrogem
2022. 11. 16. 22:53
에러 메세지는 아래와 같음
failed to validate access token as jwt signature does not match locally computed signature. jwt validity cannot be asserted and should not be trusted.
마이크로 서비스로 Back-End API 서버를 구현하다가
기존에 HS256로 되어있던 토큰 인증 알고리즘을 RS256 으로 변경해야 되었음.
편의상 서비스1, 2 라고 설명함.
서비스1 에서 private key 와 public key 를 사용함에는 문제가 없었음.
서비스2 에서 서비스1 에서 발급한 토큰을 인증하려고 할 때 위 에러가 발생함.
private key 와 public key 는 아래 사이트에서 생성하여
String 으로 잘 담아놨음
https://dinochiesa.github.io/jwt/
Online JWT tool
dinochiesa.github.io
에러 해결 방법은 간단하게도,
토큰을 생성해서 Signing 할 때, 토큰을 verify 할 때
ISSUER 를 추가해주니 해결됨.
ISSUER 는 서비스1, 2 에서 동일한 String 이면 아무거나 됨
ex) String ISSUER = "abc123"
Signing
String token = Jwts.builder()
.setSubject(TOKEN_SUBJECT)
.setClaims(claims)
.setIssuer(ISSUER)
.setExpiration(expiration)
.signWith(privateKey, SignatureAlgorithm.RS256)
.base64UrlEncodeWith(base64Coder)
.compact();
Verify (parseClaims)
private Claims parseClaims(String accessToken) {
try {
return Jwts.parserBuilder()
.setSigningKey(getKeyByToken(accessToken))
.requireIssuer(ISSUER)
.base64UrlDecodeWith(base64Coder)
.build()
.parseClaimsJws(accessToken).getBody();
} catch (ExpiredJwtException e) {
return e.getClaims();
}
}