작성
·
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
버그나 문제를 해결하는 과정에서 추가적인 설명이 필요하시면, 언제든지 질문주시기 바랍니다.