이 문서는 Spring Security와 JWT를 사용하여 로그인 요청이 처리되는 흐름을 설명합니다. 각 인증 단계 및 필터의 역할을 통해 전체 시스템에서 어떻게 인증이 이루어지는지 살펴봅니다.
https://drive.google.com/file/d/1hLsT6SeDwVKhI8o2CNuwd6cABkex85LP/view?usp=sharing
/v1/auth/login
으로 로그인 요청POST
요청으로 /v1/auth/login
에 ID와 비밀번호를 전송합니다.WebSecurityConfig
: Spring Security 설정을 담당하며, 요청에 대한 접근 권한과 필터 순서를 정의합니다. 이 설정을 통해 어떤 엔드포인트가 인증을 필요로 하는지와 필터 체인이 어떻게 구성되는지를 결정합니다.CorsFilter
: 외부 도메인에서의 접근을 허용하거나 차단하는 역할을 수행하며, 보안 설정에서 CORS 정책을 제어합니다. UsernamePasswordAuthenticationFilter
전에 실행되므로 인증 전에 CORS 규칙이 적용됩니다.
.addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class)
JWT 예외 처리 필터:
JwtAuthenticationEntryPoint
: 인증되지 않은 사용자가 보호된 리소스에 접근할 경우, 401 Unauthorized 응답을 반환합니다.JwtAccessDeniedHandler
: 권한이 부족한 사용자가 보호된 리소스에 접근할 경우, 403 Forbidden 응답을 반환합니다..exceptionHandling(exceptionHandling -> exceptionHandling
.accessDeniedHandler(jwtAccessDeniedHandler)
.authenticationEntryPoint(jwtAuthenticationEntryPoint)
)
JWT 필터 추가:
JwtSecurityConfig
: JwtFilter
를 포함하여 JWT를 통해 인증과 인가를 처리하는 설정입니다. 해당 필터는 UsernamePasswordAuthenticationFilter
앞에서 실행되어, JWT를 통한 인증이 다른 인증 필터보다 우선하여 적용됩니다..with(new JwtSecurityConfig(tokenProvider), JwtSecurityConfig::getClass);
---------------------------------------------------------------------------
//JwtSecurityConfig.java
@Override
public void configure(HttpSecurity httpSecurity) {
httpSecurity.addFilterBefore(
new JwtFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class
);
}
SessionCreationPolicy.STATELESS
: 세션을 사용하지 않으며 모든 요청을 무상태로 처리하도록 설정합니다. 따라서 인증은 세션 대신 JWT를 사용하여 매 요청마다 토큰으로 인증 정보를 검증합니다.
.sessionManagement(sessionManagement ->
sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)
로그인 및 회원가입 엔드포인트는 인증 없이 접근할 수 있도록 허용합니다.
.authorizeHttpRequests(authorize -> authorize
.requestMatchers(new MvcRequestMatcher(introspector, "/v1/auth/login")).permitAll()
.requestMatchers(new MvcRequestMatcher(introspector, "/v1/user/signUp")).permitAll()
.anyRequest().authenticated()
)