Token 유효성 검사를 해보자
이전 게시글에서 작성한 JwtFilter
이다
@RequiredArgsConstructor
@Slf4j
public class JwtFilter extends OncePerRequestFilter { // 안 보내는 요청에 대해서도 허용하면 안되기 때문
private final UserService userService;
private final String secretKey;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
// header에서 authentication을 꺼냄
final String authorization = request.getHeader(HttpHeaders.AUTHORIZATION);
log.info("authorization: {}", authorization);
// token을 안 보내면 Block
if(authorization == null || !authorization.startsWith("Bearer ")) {
// authorization이 null 이면 권한부여 안함
// token 앞에 Bearer 붙여서 보냈는지 확인
log.error("authorization을 잘못 보냈습니다");
filterChain.doFilter(request, response);
return;
}
// 토큰 꺼내기
String token = authorization.split(" ")[1];
// Token Expired(만료) 되었는지 확인
if(JwtUtil.isExpired(token, secretKey)) {
log.error("token이 만료되었습니다");
filterChain.doFilter(request, response);
return;
}
// UserId 토큰에서 꺼내기
String userId = "";
// 권환부여
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(userId, null, List.of(new SimpleGrantedAuthority("USER")));
// Detail을 넣어줍니다
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
filterChain.doFilter(request, response);
}
}
// header에서 authentication을 꺼냄
final String authorization = request.getHeader(HttpHeaders.AUTHORIZATION);
log.info("authorization: {}", authorization);
// token을 안 보내면 Block
if(authorization == null || !authorization.startsWith("Bearer ")) {
// authorization이 null 이면 권한부여 안함
// token 앞에 Bearer 붙여서 보냈는지 확인
log.error("authorization을 잘못 보냈습니다");
filterChain.doFilter(request, response);
return;
}
// 토큰 꺼내기
String token = authorization.split(" ")[1];
// Token Expired(만료) 되었는지 확인
if(JwtUtil.isExpired(token, secretKey)) {
log.error("token이 만료되었습니다");
filterChain.doFilter(request, response);
return;
}
JwtUtil 클래스에 isExpired()
메서드를 만들어 만료여부를 확인한다
JwtUtil
@Component
public class JwtUtil {
// 만료되었는지 확인하는 메서드
public static boolean isExpired(String token, String secretKey) {
return Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(token)
.getBody()
.getExpiration()
.before(new Date()); // token이 expired 된 것이 지금보다 전이면 expired 된것이다
}
public static String createJwt(String id, String email, String secretKey, Long exprTime) {
Claims claims = Jwts.claims();
claims.put("id", id);
claims.put("email", email);
return Jwts
.builder()
.setClaims(claims)
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + exprTime))
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();
}
}
public static boolean isExpired(String token, String secretKey) {
return Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(token)
.getBody()
.getExpiration()
.before(new Date()); // token이 expired 된 것이 지금보다 전이면 expired 된것이다
}