Security 기본 필터 확인

2024. 2. 20. 12:15Programming/환경 설정 정리

@RequiredArgsConstructor
@Slf4j
public class JwtFilter extends OncePerRequestFilter {
	
	private final UserService userService;
	
	@Value("${jwt-secret}")
	private final String secretKey;
	
	private final JwtTokenProvider jwtTokenProvider;

	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
		
	exapmple(request, response , filterChain);
	}
	protected void exapmple (HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {
		final String authorization = request.getHeader(HttpHeaders.AUTHORIZATION);
		log.info("authentication: {}", authorization);
		
		//토큰 안보내면 block
		if(authorization == null || !authorization.startsWith("Bearer ")) {
			log.info("authentication이 없습니다.  ");
			filterChain.doFilter(request, response);
			return;
		}
		//Token 꺼내기
		String token = authorization.split(" ")[1];
		
		//Token Expired되었는지 여부
		if(JwtUtil.isExpired(token, secretKey)) {
			log.error("Token이 만료 되었습니다.");
			filterChain.doFilter(request, response);
			return ;
		}
		
		//UserName Token에서 꺼내기 
		String userName=JwtUtil.getUserName(token, secretKey);
		log.info("userName:{}: ", userName);
		
		//권한 부여
		UsernamePasswordAuthenticationToken authenticationToken
		= new UsernamePasswordAuthenticationToken(userName, null, List.of(new SimpleGrantedAuthority("USER")));
		
		//Detail을 넣어줍니다.
		authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
		SecurityContextHolder.getContext().setAuthentication(authenticationToken);
		filterChain.doFilter(request, response);
	
	}
	
}