Spring Security :: Token 유효성

hyunjoon park·2024년 1월 18일
1

Spring Security

목록 보기
5/12

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 된것이다
}
profile
Backend Developer

0개의 댓글