SpringSecurity + JWT

호호빵·2023년 5월 3일
1

sunflowerProject

목록 보기
10/10

Spring Security에 관한 정리를 해두었지만 실제적으로
프로젝트에서 구현한 것과 차이가 있어 프로젝트용으로 다시 정리해보려 한다.

기본 동작 방식

  • 스프링 시큐리티는 어플리케이션에서 인증/인가에 대하 설정을 편리하게 도와주는 역할
  • Controller에서 수행할 수도 있지만 관심사의 분리 측면에서 역할 구분됨
    - Controller에서는 사용자의 요청에 대한 서비스의 응답을 구성한다.
    - 인증과 인가는 Controller까지 요청이 오지 않고도 충분히 수행할 수 있다.
    -> 따라서 Dispatcher Servlet에 요청이 들어오기 전에 인증/인가를 수행하는 레이어를 스프링 시큐리티가 담당한다고 볼 수 있음



실제 동작

- WebSecurityConfig(SecurityFilterChain)
- JwtAuthFilter
- JwtTokenProvider
- UserDetails
- UserDetailsService
  • SecurityFilterChain을 직접 Bean으로 등록해서 사용(직관적인 의존성 주입 가능)
  • JwtAuthFilter는 Request에 포함된 쿠키에서 토큰을 추출하고, 토큰의 payload 정보로 인증에 필요한 토큰을 생성
    - 인증이 완료되고 권한이 부여된 Authentication 객체SecurityContext에 저장
  • JwtTokenProvider는 인증 간 필요한 token 관련 유틸 메소드를 제공하고, UserDetails 객체 넘겨 받음
  • UserDetails는 실제 데이터베이스에 매핑되는 데이터를 포함, Domain Entity와도 다름 (Authentication은 인증/인가에만 필요한 정보 담고있음)
  • UserDetailsServiceloadUserByUsername(username) 메소드로로 유저정보를 불러와 UserDetails 객체를 반환

JwtTokenProvider에서 createAuth() 메소드로 UserDetailsServiceUserDetails 객체 반환
-> 인증된 Authentication 객체 생성
-> JwtAuthFilter로 전달 후 SecurityContext에 저장 (필터 수행 작업 종료)

@Slf4j
@Component
@RequiredArgsConstructor
public class JwtTokenProvider {

    private final UserDetailsServiceImpl userDetailsService;

    // 인증 객체 생성
    public Authentication createAuthentication(String username) {
        UserDetails userDetails = userDetailsService.loadUserByUsername(username);
        return new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
    }
}
@Slf4j
@RequiredArgsConstructor
public class JwtAuthFilter extends OncePerRequestFilter {

    private final JwtTokenProvider jwtTokenProvider;

	public void setAuthentication(String emailId) {
        SecurityContext context = SecurityContextHolder.createEmptyContext();
        Authentication authentication = jwtTokenProvider.createAuthentication(emailId);
        context.setAuthentication(authentication);

        SecurityContextHolder.setContext(context);
    }
}




Reference

JWT를 통한 인증/인가 수행하기 - https://ppaksang.tistory.com/12

profile
하루에 한 개념씩

1개의 댓글

comment-user-thumbnail
2023년 6월 9일

멋집니다!

답글 달기