인프런 커뮤니티 질문&답변

hangs0908님의 프로필 이미지
hangs0908

작성한 질문수

스프링 시큐리티 OAuth2

RSA 검증 기능 구현 - JwtAuthorizationRsaFilter

JWT Verify에 대한 질문이 있습니다.

작성

·

457

0

protected String getJwtTokenInternal(JWSSigner jws, UserDetails user, JWK jwk) throws JOSEException {
    // JWT token 을 만들기 위해 3가지가 필요함(header, payload, sig)
    JWSHeader header = new JWSHeader.Builder((JWSAlgorithm) jwk.getAlgorithm()).keyID(jwk.getKeyID()).build();

    List<String> authorities = user.getAuthorities().stream().map(author -> author.getAuthority()).collect(Collectors.toList());
    JWTClaimsSet payload = new JWTClaimsSet.Builder()
            .subject("user")
            .issuer("http://localhost:8080")
            .claim("username", user.getUsername())
            .claim("authority", authorities)
            .expirationTime(new Date(new Date().getTime() + 1000)) //1초
            .build();
    SignedJWT signedJWT = new SignedJWT(header, payload);

    // 서명
    signedJWT.sign(jws);

    //토큰 발행
    String jwtToken = signedJWT.serialize();

    return jwtToken;
}

 

 

expiration Time 말고는 강사님 코드랑 동일합니다.

토큰 만료되는 걸 체크하고 싶어서 테스트 코드를 작성했습니다. 만료시간을 1초로 만들었습니다.

 

@Test
@DisplayName("test")
void test() throws JOSEException, InterruptedException, ParseException {
    UserDetails user = userDetailsService.loadUserByUsername("user");
    System.out.println(user);
    String jwtToken = securitySigner.getJwtToken(user, jwk);
    System.out.println("jwtToken = " + jwtToken);

    Thread.sleep(7000);

    SignedJWT signedJWT = SignedJWT.parse(jwtToken);
    boolean verify = signedJWT.verify(new RSASSAVerifier(jwk));
    System.out.println("verify = " + verify);
}

 

근데 위의 테스트 코드를 실행한 결과

7초라는 지연을 주었는데도 불구하고

verify가 참으로 뜨네요. 어떤게 문제일까요?

 

 

답변 2

0

정수원님의 프로필 이미지
정수원
지식공유자

JWTClaimsSet 에서 만료시간을 지정한 부분은 테스트를 해 보지 않았는데요..

해당 검증이 만료 시간을 체크하는 것인지에 대한 부분은 저도 내부 소스를 들여다 봐도 정확하게 확인을 할 수가 없네요..

만약 검증 시 만료시간을 체크하지 않는다면 SignedJWT 에 저장된 만료시간을 가지고 와서 현재시간과 직접 비교해야 할 수도 있습니다.

이 부분은 공식 가이드나 문서를 참고 해야 할 것 같습니다.

0

안녕하세요, 인프런 AI 인턴입니다.

JWT 토큰의 유효성 검사를 할 때, verify 메소드는 JWT 서명을 확인하는 역할을 하며, 토큰의 exp 만료 시간 필드는 검증하지 않습니다. 서명이 유효하다면 verify 메소드는 true를 반환할 것입니다. JWT 토큰의 만료 시간을 확인하려면, JWTClaimsSet에 대한 처리를 따로 구현해야 합니다.

예를 들어, SignedJWT 객체에서 getJWTClaimsSet 메소드를 호출하여 JWTClaimsSet을 가져온 다음, 현재 시간과 expirationTime 필드를 비교하여 토큰의 만료 여부를 확인할 수 있습니다. 만약 현재 시간이 expirationTime보다 이후라면 토큰이 만료된 것으로 처리해야 합니다.

다음은 만료 시간을 검사하는 예시 코드입니다:

Date expirationTime = signedJWT.getJWTClaimsSet().getExpirationTime();
boolean isTokenExpired = new Date().after(expirationTime);

이렇게 isTokenExpired 변수를 통해 토큰이 만료되었는지를 체크할 수 있습니다.

JWT 토큰의 만료 여부와 서명을 모두 검증하는 데에 대해 Spring Boot의 Spring Security OAuth2 설정이 궁금하시다면, Spring Boot Reference Documentation의 OAuth2 Resource Server 섹션을 참조하시면 도움이 될 것입니다. JWT와 관련된 추가적인 설정이 필요할 수 있으며, 아래 링크에서 자세한 정보를 찾아보실 수 있습니다.
- Spring Security OAuth2 Resource Server documentation

버그나 문제를 해결하는 과정에서 추가적인 설명이 필요하시면, 언제든지 질문주시기 바랍니다.

hangs0908님의 프로필 이미지
hangs0908

작성한 질문수

질문하기