
이 포스트는 데어 프로그래밍님의 유튜브 강의를 듣고 나서 정리한 글입니다.
로그인 요청이 오면 사용자 인증 후 JWT 토큰을 생성하여 클라이언트에게 응답해줬습니다.
이제 사용자는 매번 로그인을 하는 것이 아니라, 이전에 발급 받은 JWT 토큰을 들고 서버로 요청을 하면
서버는 해당 JWT 토큰을 검증하여 유효한 토큰인지 확인 후 클라이언트 요청을 처리해주면 됩니다.
이번 시간에는 JWT 토큰을 검증할 수 있는 Filter를 생성해보도록 하겠습니다.
BasicAuthenticationFilter 상속

헤더에 Authorization : Basic *** 방식으로 인증을 시도하면 BasicAuthenticationFilter에서 해당 토큰을 검증하여 인증을 처리하는데,
우리는 Basic 방식이 아닌, JWT를 사용할 것이기 때문에 해당 메소드를 오버라이딩 해주도록 하겠습니다.
doFilterInternal
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
String jwt_Header = request.getHeader("Authorization");
// 토큰 값이 올바르게 들어있는지 체크!
if(jwt_Header != null && jwt_Header.startsWith("Bearer")) {
// JWT 추출
String jwtToken = jwt_Header.replace("Bearer", "").trim();
// JWT Verify (검증) -> 검증 실패 시 exception 발생
String username = JWT.require(Algorithm.HMAC256("secret")).build().verify(jwtToken).getClaim("username").asString();
// Verify 통과? -> 서명이 완료되었다는 뜻.
// username이 비어있진 않은지 체크
if (username != null && !username.equals("")) {
UserDetails userDetails = accountService.loadUserByUsername(username);
// AuthenticationManager로 인증을 하면 실제 로그인을 할때에 필요한 작업이나,
// Authentication authenticate = getAuthenticationManager().authenticate(new UsernamePasswordAuthenticationToken(userDetails.getUsername(), userDetails.getPassword(), userDetails.getAuthorities()));
// 현재 우리는 Token 서명으로 무결성을 검증하였기 때문에 username을 가지고 강제로 Authentication 을 만들어 securityContextHolder에 넣어주면 됩니다.
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails.getUsername(), userDetails.getPassword(), userDetails.getAuthorities());
// 세션 저장 (권한 관리를 위해서)
SecurityContextHolder.getContext().setAuthentication(authentication);
}
}
doFilter(request, response, chain);
}
- 먼저 헤더에 Authorization 값을 뽑아 옵니다.
- 해당 값이 있는지, Bearer 방식의 토큰인지 확인을 합니다.
- JWT 토큰 값을 추출하여 verify를 시도합니다.
- 토큰 검증에 성공하였다면, user 정보를 가지고 Authentication 객체를 생성합니다.
- SecurityContextHolder에 담습니다. (이때, 권한 관리를 위해 세션을 저장하는 것입니다.)

이 포스트는 데어 프로그래밍님의 유튜브 강의를 듣고 나서 정리한 글입니다.
로그인 요청이 오면 사용자 인증 후 JWT 토큰을 생성하여 클라이언트에게 응답해줬습니다.
이제 사용자는 매번 로그인을 하는 것이 아니라, 이전에 발급 받은 JWT 토큰을 들고 서버로 요청을 하면
서버는 해당 JWT 토큰을 검증하여 유효한 토큰인지 확인 후 클라이언트 요청을 처리해주면 됩니다.
이번 시간에는 JWT 토큰을 검증할 수 있는 Filter를 생성해보도록 하겠습니다.
BasicAuthenticationFilter 상속

헤더에 Authorization : Basic *** 방식으로 인증을 시도하면 BasicAuthenticationFilter에서 해당 토큰을 검증하여 인증을 처리하는데,
우리는 Basic 방식이 아닌, JWT를 사용할 것이기 때문에 해당 메소드를 오버라이딩 해주도록 하겠습니다.
doFilterInternal
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
String jwt_Header = request.getHeader("Authorization");
// 토큰 값이 올바르게 들어있는지 체크!
if(jwt_Header != null && jwt_Header.startsWith("Bearer")) {
// JWT 추출
String jwtToken = jwt_Header.replace("Bearer", "").trim();
// JWT Verify (검증) -> 검증 실패 시 exception 발생
String username = JWT.require(Algorithm.HMAC256("secret")).build().verify(jwtToken).getClaim("username").asString();
// Verify 통과? -> 서명이 완료되었다는 뜻.
// username이 비어있진 않은지 체크
if (username != null && !username.equals("")) {
UserDetails userDetails = accountService.loadUserByUsername(username);
// AuthenticationManager로 인증을 하면 실제 로그인을 할때에 필요한 작업이나,
// Authentication authenticate = getAuthenticationManager().authenticate(new UsernamePasswordAuthenticationToken(userDetails.getUsername(), userDetails.getPassword(), userDetails.getAuthorities()));
// 현재 우리는 Token 서명으로 무결성을 검증하였기 때문에 username을 가지고 강제로 Authentication 을 만들어 securityContextHolder에 넣어주면 됩니다.
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails.getUsername(), userDetails.getPassword(), userDetails.getAuthorities());
// 세션 저장 (권한 관리를 위해서)
SecurityContextHolder.getContext().setAuthentication(authentication);
}
}
doFilter(request, response, chain);
}
- 먼저 헤더에 Authorization 값을 뽑아 옵니다.
- 해당 값이 있는지, Bearer 방식의 토큰인지 확인을 합니다.
- JWT 토큰 값을 추출하여 verify를 시도합니다.
- 토큰 검증에 성공하였다면, user 정보를 가지고 Authentication 객체를 생성합니다.
- SecurityContextHolder에 담습니다. (이때, 권한 관리를 위해 세션을 저장하는 것입니다.)