Spring Security에 관한 정리를 해두었지만 실제적으로
프로젝트에서 구현한 것과 차이가 있어 프로젝트용으로 다시 정리해보려 한다.
- WebSecurityConfig(SecurityFilterChain)
- JwtAuthFilter
- JwtTokenProvider
- UserDetails
- UserDetailsService
SecurityFilterChain
을 직접 Bean으로 등록해서 사용(직관적인 의존성 주입 가능)JwtAuthFilter
는 Request에 포함된 쿠키에서 토큰을 추출하고, 토큰의 payload 정보로 인증에 필요한 토큰을 생성Authentication 객체
를 SecurityContext
에 저장JwtTokenProvider
는 인증 간 필요한 token 관련 유틸 메소드를 제공하고, UserDetails 객체
넘겨 받음UserDetails
는 실제 데이터베이스에 매핑되는 데이터를 포함, Domain Entity와도 다름 (Authentication
은 인증/인가에만 필요한 정보 담고있음)UserDetailsService
는 loadUserByUsername(username) 메소드로로 유저정보를 불러와 UserDetails
객체를 반환
JwtTokenProvider
에서 createAuth() 메소드로UserDetailsService
로UserDetails 객체
반환
-> 인증된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);
}
}
JWT를 통한 인증/인가 수행하기 - https://ppaksang.tistory.com/12
멋집니다!