[SpringBoot] Spring Security (1) - SecurityConfig.java

김민주·2025년 2월 8일

BackEnd

목록 보기
4/7
post-thumbnail

UsernamePasswordAuthenticationFilter

✅ Spring Security에서 기본으로 동작하는 필터 체인
Spring Security는 여러 개의 필터를 체인 형태로 실행해.
그중 UsernamePasswordAuthenticationFilter는 기본적으로 로그인 요청을 처리하는 필터야.

📌 UsernamePasswordAuthenticationFilter의 역할

원래는 form-login을 할 때 username과 password를 받아서 인증을 처리하는 필터야.
기본적으로 POST /login 요청을 가로채서 사용자의 인증을 수행해.
그런데 우리는 JWT를 사용해서 로그인하고 인증하기 때문에 이 필터를 안 써!
-> 그래서 이 필터보다 앞에서 JWT 필터를 실행하도록 설정하는 거야.

.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class)

Spring Security의 필터 체인에서 JwtRequestFilter를 UsernamePasswordAuthenticationFilter보다 먼저 실행되도록 설정
즉, JWT 기반 인증을 먼저 처리하고 Spring Security 기본 로그인 방식을 안 쓰게 하는 거야.


AuthenticationManager

@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
    return authenticationConfiguration.getAuthenticationManager();
}

📌 AuthenticationManager의 역할

: 사용자가 로그인하면 사용자 정보를 검증하고, 인증된 객체를 생성하는 역할
Spring Security에서 로그인 & 인증을 담당하는 핵심 컴포넌트야.
만약 ID/PW 로그인을 사용한다면, UsernamePasswordAuthenticationFilter가 내부적으로 이 AuthenticationManager를 호출해서 검증을 진행해.

✅ 이거 꼭 필요할까?

만약 ID/PW 로그인(/login API)도 사용할 거라면 → AuthenticationManager 필요함!
Spring Security의 기본 로그인 방식은 AuthenticationManager를 통해 사용자 정보를 인증하기 때문.
ex) UserDetailsService를 구현해서 데이터베이스에서 사용자 정보를 가져오는 경우 필수

만약 ID/PW 로그인 없이 JWT만 사용할 거라면 → AuthenticationManager 없어도 됨!
Spring Security의 인증 과정을 완전히 JWT로만 처리할 경우 필요 없음
너가 만든 JwtRequestFilter에서 토큰을 직접 검증하고, SecurityContextHolder에 인증 정보를 넣어주기 때문!

💡 결론

ID/PW 로그인도 지원할 거면 유지하고, JWT만 사용할 거면 제거해도 됨!
하지만 Spring Security가 내부적으로 AuthenticationManager를 사용할 수도 있으니까, 유지하는 게 안전해!


WebMvcConfigurer

 @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedOrigins("http://localhost:8080" ) // Swagger UI 실행 URL
                        .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                        .allowedHeaders("*")
                        .allowCredentials(true);
            }
        };
    }

📌 WebMvcConfigurer의 역할

: CORS(Cross-Origin Resource Sharing)를 허용하는 역할
즉, 프론트엔드(웹, 앱 등)에서 백엔드 API를 호출할 수 있도록 허용하는 설정이야.

📌 CORS란?
기본적으로 웹 브라우저 보안 정책(Same-Origin Policy) 때문에,
프론트엔드(ex. http://localhost:3000)가 백엔드(ex. http://localhost:8080)에 요청을 보내면 차단됨.
그래서 백엔드에서 CORS 설정을 해줘야 프론트에서 요청을 보낼 수 있어.

✅ 이 설정이 꼭 필요한가?

✔ [필요한 경우]
프론트엔드 (React, Vue, Android, iOS 등)에서 API를 호출할 경우

ex) http://localhost:3000에서 백엔드 API(http://localhost:8080/api/**) 호출 시
CORS 오류( Access to XMLHttpRequest at 'http://localhost:5001/api/users' from origin 'http://localhost:3000' has been blocked by CORS policy. )가 발생할 수 있음

✔ [필요 없는 경우]
API가 완전히 같은 도메인(Same-Origin) 내에서 동작할 때

ex1) 프론트엔드와 백엔드가 같은 서버에서 운영될 때
http://example.com에서 모든 요청이 처리됨

ex2) 모바일 앱(Android, iOS)이 백엔드를 호출하는 경우
Same-Origin Policy 영향을 받지 않음

💡 결론

✅ 프론트엔드가 다른 도메인(포트)에서 API를 호출한다면 → 꼭 필요함!
🚫 프론트엔드와 백엔드가 같은 도메인에서 동작한다면 → 삭제해도 됨!

📌 만약 CORS 설정을 더 간단하게 하고 싶다면?

Spring Security 6부터는 CORS 설정을 SecurityConfig에서 SecurityFilterChain에 직접 할 수도 있어!
.cors(withDefaults())을 설정하면 별도의 WebMvcConfigurer 없이도 CORS가 활성화됨.

profile
낭비하지마 네 시간은 은행🐰

0개의 댓글