권한 인증이 필요한 주소 요청이 있을 때, jwt토큰을 검증해 정상적인 사용자인지 체크하는 필터를 추가로 만들었다.
-> BasicAuthenticationFilter를 확장하여 JWT 토큰을 검증하고, 토큰이 유효한 경우 사용자 정보를 SecurityContext에 설정
// 시큐리티가 filter를 가지고 있는데 그 필터 중에서 BasicAuthenticationfilter라는 것이 있음.
// 권한이나 인증이 필요한 특정 주소를 요청했을 때 위 필터를 무조건 타게 되어있음
// 만약 권한 인증이 필요한 주소가 아니라면 해당 필터를 타지 않음
public class JwtAuthorizationFilter extends BasicAuthenticationFilter {
private final JwtUtil jwtUtil;
public JwtAuthorizationFilter(AuthenticationManager authenticationManager, JwtUtil jwtUtil) {
super(authenticationManager);
this.jwtUtil = jwtUtil;
}
// 인증이나 권한이 필요한 주소 요청이 있을 때 해당 필터를 타게 됨 -> 인증이나 권한이 필요한 요청이 들어올 때마다 실행
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("인증이나 권한이 필요한 주소 요청이 됨");
String jwtHeader = request.getHeader("Authorization");
System.out.println("jwtHeader = " + jwtHeader);
// header가 있는지 확인
if(jwtHeader == null || !jwtHeader.startsWith("Bearer")){ // 헤더가 없거나 Bearer가 아닌 경우
chain.doFilter(request, response);
return;
}
// JWT 토큰을 검증해서 정상적인 사용자인지 확인
String jwtToken = jwtHeader.replace("Bearer ", "");
System.out.println("jwtToken = " + jwtToken);
String username = jwtUtil.getUsername(jwtToken);
System.out.println("username = " + username);
// 서명이 정상적으로 됨
if(username != null){ // 사용자 이름이 존재하면, JWT 토큰이 유효하다고 간주
User userEntity = new User();
userEntity.setUsername(username);
userEntity.setRoles(UserRole.ROLE_ADMIN.toString()); // 임시 지정
PrincipalDetails principalDetails = new PrincipalDetails(userEntity);
// jwt 토큰 서명을 통해 서명이 정상이면 Authentication 객체를 만들어준다.
Authentication authentication =
new UsernamePasswordAuthenticationToken(principalDetails, null, principalDetails.getAuthorities());
// 강제로 시큐리티의 세션에 접근하여 Authentication 객체를 저장
SecurityContextHolder.getContext().setAuthentication(authentication);
}
chain.doFilter(request, response);
}
}
내일부터는 jwt + OAuth2.0 적용하는거 찾아서 해봐야겠다,,이후 강의가 없어서 좀 속상함🤯