사용 중인 spring security 버전 확인 방법
- build.gradle 확인
- 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 |