본문 바로가기

프로젝트

[ 프로젝트 ] JWT 라이브러리 검증 메서드 이름

JJWT의 검증 메서드에 대한 의문

Java Spring에 적용한 JWT에 대해서 친구와 이야기하게 되었다. 거기서 토큰 검정 로직에 대해서 이야기 하면서 코드를 보는데 JJWT가 제공하는 토큰 확인하는 메서드 이름이 어울리지 않다는 생각이 들었다. parseClaimJws 메서드는 token을 Claim으로 파싱하는 메서드로 보인다. 하지만 실제로는 token의 검증과 파싱된 Claim을 반환 두 가지 역할을 가진다.

 

 public static boolean validateToken(String token) {
     try {
        Jwts.parserBuilder().setSigningKey(SIGNING_KEY).build().parseClaimsJws(token);
        return true;
     } catch (io.jsonwebtoken.security.SecurityException | MalformedJwtException e) {
        System.out.println("Invalid JWT Token");
     } catch (ExpiredJwtException e) {
        System.out.println("Expired JWT Token");
     } catch (UnsupportedJwtException e) {
        System.out.println("Unsupported JWT Token");
     } catch (IllegalArgumentException e) {
        System.out.println("JWT claims string is empty.");
     }
     return false;
 }
Jws<Claims> parseClaimsJws(String claimsJws)
            throws ExpiredJwtException, UnsupportedJwtException, 
                   MalformedJwtException, SignatureException, IllegalArgumentException;

Java JWT 라이브러리 검증 메서드

JJWT와 같이 가장 많이 쓰이는 라이브러리 Java JWT의 메서드는 어떻게 되어있는지 확인해보기로 했다. 메서드 이름만 verify로 되어있지 JJWT의 메서드와 같은 기능을 하는 것으로 보였다. parseClaimJws와 달리 verify에 이름이 토큰을 검증하는 메서드 이름으로  더 적합해보이긴 한다. 하지만 두가지 역할을 한 곳에 몰아넣는 게 맞는걸까라는 의문은 게속 남는 것 같다. 

 

try {
    Algorithm algorithm = Algorithm.RSA256(rsaPublicKey, rsaPrivateKey);
    DecodedJWT decodedJWT = JWT.require(algorithm).withIssuer("auth0").build().verify(token);
} catch (JWTVerificationException exception){
    // Invalid signature/claims
}

결론

가장 많이 쓰이는 2개의 라이브러리에서 검증과 파싱을 하나의 메서드로 처리하고 있다. 하지만 이것이 꼭 옳다는 생각이 들지 않는다. 그래서 쓰여야만 하는 이유가 있는지 더 찾아봐야할 것 같다. 그게 아니면 내가 두 개의 역할을 분리한 메서드를 만들어 볼 수 있지 않을까? 이후 블로그 글에 더 다뤄야겠다.