카테고리 없음

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();
        }
    }