SpringSecurity - JWT 로그인 구현

hsso_o·2024년 7월 25일
0

스터디

목록 보기
33/44

권한 인증이 필요한 주소 요청이 있을 때, 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 적용하는거 찾아서 해봐야겠다,,이후 강의가 없어서 좀 속상함🤯

profile
아뇨 소혠데요-

0개의 댓글