Dev./Spring

[Spring]왜 Security 의존성을 추가하면 API 호출시 401이 뜰까

limitation01 2025. 12. 6. 19:37

기존에 잘 돌아가던 demo 프로젝트에 Security 의존성을 추가하니 모든 API 호출시 401에러가 떴다. 왜 의존성 추가 하나만으로 잘 돌아가던 서버가 에러를 뱉는걸까?

Security의 기본 보안 정책 자동 활성화

Spring Security는 의존성 추가만으로도 다음 설정을 자동 적용

 

  • 모든 요청은 인증 필요
  • 인증되지 않은 요청은 → 401 Unauthorized
  • Form 로그인 페이지가 자동 생성됨
  • 기본 사용자 계정이 자동 생성됨 (username=user, password=콘솔에 출력)

즉 security가 추가되며 모든 요청을 가로막은 것이다.


Security를 추가한 후의 동작 흐름

왜 401일까?

Spring Security가 요청을 Controller로 보내기 전에 차단하기 때문 , 컨트롤러에 도달하지도 않았다.


해결 방법 - 허용할 요청 명시

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
            .csrf(AbstractHttpConfigurer::disable)  // .csrf().disable() 방식은 더 이상 사용 안함.
            .httpBasic(AbstractHttpConfigurer::disable) // BasicAuthenticationFilter 비활성화
            .formLogin(AbstractHttpConfigurer::disable) // UsernamePasswordAuthenticationFilter, DefaultLoginPageGeneratingFilter 비활성화
            .addFilterBefore(jwtFilter, SecurityContextHolderAwareRequestFilter.class)
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/api/login").permitAll()
                .anyRequest().authenticated()
            )
            .build();
    }
  • csrf : JWT 기반 인증에서는 필요하지 않으니 CSRF 보호를 비활성화
  • httpBasic : HTTP Basic 인증 방식 비활성화
  • formLogin : 기본 로그인 폼과 관련된 필터 비활성화
  • addFilterBefore : 필터의 순서를 지정해주는 역할
    • .addFilterBefore(jwtFilter, SecurityContextHolderAwareRequestFilter.class) = jwtFilter 뒤에 SecurityContextHolderAwareRequestFilter 를 위치 시킬 것
  • authorizeHttpRequests : 어디에 어떻게 권한 검사를 할 것인지에 대한 구체적인 내용
.authorizeHttpRequests(auth -> auth
                .requestMatchers("/api/login").permitAll()
                .requestMatchers("/api/admin/**").hasRole("ADMIN")
                .requestMatchers("/api/user/**").hasRole("USER")