사용 중인 spring security 버전 확인 방법

  1. build.gradle 확인
  2. Project Structure > Libraries 에서 spring-security 관련 라이브러리들의 버전 확인

spring security 동작 원리

모든 http 요청 -> spring security filter chain -> 인가 규칙에 맞는 요청에 대해서만 controller 로 요청이 전달

소스코드 예시

public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        // 1. CORS(교차 출처 리소스 공유) 설정을 활성화하고, 커스텀 cors 설정을 주입합니다.
        .cors(cors -> cors.configurationSource(corsConfigurationSource))

        // 2. HTTP Basic 인증(브라우저 팝업 아이디/비밀번호 방식) 비활성화
        .httpBasic(httpBasic -> httpBasic.disable())

        // 3. CSRF(사이트 간 요청 위조) 방어기능 비활성화
        .csrf(csrf -> csrf.disable())

        // 4. 폼 로그인(기본 로그인 페이지) 비활성화
        .formLogin(formLogin -> formLogin.disable())

        // 5. 세션 사용 정책을 'STATELESS'(무상태)로 설정 (세션 저장 X, JWT처럼 토큰 인증을 쓸 때)
        .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))

        // 6. 경로(URL) 별 인가(Authorization) 정책
        .authorizeHttpRequests(auth -> auth
            // 6-1. 아래 경로는 인증 없이 누구나 접근 허용
            .requestMatchers(
                "/api/v1/auth/login", 
                "/api/v1/chatbot/process-log", 
                "/api/v1/auth/change-password",
                "/api/v1/auth/reset-password", 
                "/api/v1/term",
                "/swagger-ui/**", 
                "/v3/api-docs/**"
            ).permitAll()
            // 6-2. 아래 경로는 로그인 인증한 사용자만 접근 허용
            .requestMatchers("/api/v1/auth/user-info").authenticated()
            // 6-3. 아래 경로는 ADMIN 역할을 가진 사용자만 접근 허용
            .requestMatchers("/api/v1/admin/**").hasRole("ADMIN")
            // 6-4. 그 외 나머지 모든 요청도 인증 필요(로그인 필요)
            .anyRequest().authenticated()
        );
    // 7. 커스텀 필터를 UsernamePasswordAuthenticationFilter 이전에 등록
    http.addFilterBefore(loggingApiKeyFilter, UsernamePasswordAuthenticationFilter.class);
    http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
    // 8. 최종적으로 SecurityFilterChain을 build해서 빈으로 등록
    return http.build();
}

SecurityFilterChain

  .authorizeHttpRequests((auth) -> auth
    .requestMatchers("/public/**").permitAll() // 1. 누구나 접근
    .requestMatchers("/admin/**").hasRole("ADMIN") // 2. ADMIN만 접근
    .anyRequest().authenticated() // 3. 그 외는 로그인 필요
  );
  • authorizeHttpRequests → 인가 설정의 시작점, 체이닝 방식으로 여러 규칙 설정
  • spring6부터 authorizeReuqests 대신 authorizeHttpRequests 사용
// 1. 공개 경로 설정
.requestMatchers("/", "/login", "/signup").permitAll()


// 2. 특정 API 경로는 관리자만  
.requestMatchers("/admin/\*\*").hasRole("ADMIN")

// 3. 나머지는 로그인한 사용자만  
.anyRequest().authenticated()
  • requestMatchers : 어떤 url 패턴에 대해 규칙을 적용할지 지정
  • 괄호 안에 url 패턴(경로, 와일드카드 지정 가능)을 적으면, 그 url에 대한 권한을 바로 뒤에서 설정 (permitAll, hasRole 등)
  • 예전에는 antMatchers, 최신은 requestMatchers. 동작 방식은 비슷
  • 동작 순서: 요청 URL → 설정된 패턴과 매칭 → 허용/차단 결정
http.addFilterBefore(loggingApiKeyFilter, UsernamePasswordAuthenticationFilter.class);  
http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
  • addFilterBefore, addFilterAfter, addFilter: security filter chain에 커스텀 필터를 삽입하기 위한 HttpSecurity 객체의 메서드
  • 필터 순서 중요성: 인증(JWT, 세션 등) 필터가 인가(권한) 검사보다 먼저 실행되어야 함
  • 예외 처리, 로그 남기기 등은 시점에 따라 적절한 위치에 삽입 필요

정리

  • 설정 코드는 위에서 아래로 순서대로 적용
  • 필터 실행은 addFilter/체인 기준 순서로 동작
  • 경로별 인가(permitAll, authenticated, hasRole)는 필터 실행 이후 판단됨
  • 애플리케이션이 구동될 때 설정코드 및 필터 순서에 대한 필터 체인 구성
  • HTTP 요청이 들어올 때 마다 미리 정해진 필터 순서에 따라 필터 실행

'#개발 > spring' 카테고리의 다른 글

java.lang.NoClassDefFoundError  (0) 2025.10.17
spring-boot-devtools  (0) 2025.10.08
H2 Database  (0) 2025.10.08
Thymeleaf  (0) 2025.10.08
프랙티스 가이드  (0) 2025.10.08

+ Recent posts