스프링 - Spring Security

박종현·2025년 6월 1일

스프링 프로젝트

목록 보기
14/14

스프링을 이용해서 개발하는 과정에 Security를 계속 적용해왔다. 처음엔 기본 시큐리티를 적용해보기도 하고, JWT를 적용해서 개발해보기도 하고, 다음 개발에서는 핸들러를 직접 관리하고 추가하는 등을 경험해보면서, 계속 똑같이 새롭게 공부하는 기분이라서 새로운 개인 프로젝트를 진행하는 과정에서, 계속 보면서 기억을 상기하기위해 나만의 정보글이 필요하다고 생각해서 작성하려고 한다.

Spring Security란?

Spring Security는 강력하고 매우 유연하게 커스터마이징할 수 있는 인증 및 접근 제어 프레임워크입니다. 이는 Spring 기반 애플리케이션을 보호하기 위한 사실상의 표준(de-facto standard)입니다.
Spring Security는 Java 애플리케이션에 인증(Authentication)과 인가(Authorization)를 모두 제공하는 데 중점을 둔 프레임워크입니다. 모든 Spring 프로젝트와 마찬가지로, Spring Security의 진정한 강점은 사용자 요구 사항에 맞게 쉽게 확장할 수 있다는 점에 있습니다.

공식문서 설명을 보면 다음과 같이 설명한다. 중요하다고 생각하는 포인트는 인증, 인가라고 생각한다.

  • 인증이란
    - 사용자가 누구인지 확인하는 과정 예) ID/Password
  • 인가란?
    - 무엇을 할 수 있는지 결정하는 과정. 예) 관리자, 사용자

작동 과정

https://javadevjournal.com/spring-security/spring-security-authentication/
이미지 링크

1. 유저가 아이디와 비밀번호를 기입하면, Security Filer Chains를 거칩니다. (각각의 필터 존재)

  • 기본적인 아이디와 비밀번호를 이용하는 등의 요청.
    - 각각의 요청마다 다른 필터를 거칩니다. 예) UsernamePasswordAuthenticationFiler

2. 사용자의 정보를 기반으로 인증 토큰을 생성합니다.

  • 요청을 통한 토큰 생성

3. Authentication Manager에서 인증 수행 방법을 정의합니다.

  • 필터들이 인증을 수행하는지 정의하게 됩니다.

4. AuthenticationProviders에서 실제로 인증을 처리합니다.

  • 실제 처리 담당
    - DaoAuthenticationProvider
    - JAAS Authentication
    - OpenID Authentication
    - OAuth 2.0 등이 존재

5~9. 커스텀 AuthenticationProvider 구현

  • 만약 입력형식이 다르다던지, JWT를 사용한다던지 필요에 의해 Provider를 구현하게 됩니다.
    - 5번은 Provider 작성
    - 일부 몇 Provider는 인터페이스를 구현하는 과정에서 User객체, UserDetail, UserDetailService 인터페이스 또한 구현해서 사용해야합니다. (그냥 사용이 가능하긴한데, 기본적으로 제공되는 구조와 일치해야만해서 웬만해선 구현했었습니다.

10~11. 완성된 Provider를 통해 인증하게 하는 필터를 작성해서 구동.

  • 작성한 Provider를 필터 체인에 적재해서 새로운 단계를 만들어줍니다.

12. SecurityContext에 Authentication 설정

  • 인증이 통과된다면 SecurityContext에 저장하게 되어 실행합니다.

https://gngsn.tistory.com/160
원본 사진 링크

완전 좋은 이미지가 있어서 가져왔습니다. 필터들을 되게 상세하게 설명해준 좋은 자료라서 가져왔습니다. 기본적으로 수행되는 필터들을 정리합니다.

Spring Security 기본 필터 목록 및 역할

순서필터명하는 일
1ChannelProcessingFilter요청이 HTTPS인지 HTTP인지 강제(리다이렉트 가능)
2WebAsyncManagerIntegrationFilterSpring MVC의 AsyncManager와 연동
3SecurityContextPersistenceFilter요청 시작 시 SecurityContext 로드 / 요청 끝날 때 저장
4HeaderWriterFilter보안 관련 HTTP 헤더 추가 (ex. CSP, XSS-Protect)
5CorsFilterCORS (Cross-Origin Resource Sharing) 처리
6CsrfFilterCSRF 토큰 검사
7LogoutFilter로그아웃 처리 (로그아웃 URL 호출 시 SecurityContext 비움)
8OAuth2AuthorizationRequestRedirectFilterOAuth2 로그인 요청 시 인가 서버로 리다이렉트
9OAuth2LoginAuthenticationFilterOAuth2 로그인 성공 후 사용자 인증 처리
10UsernamePasswordAuthenticationFilterForm 기반 로그인 (아이디/비밀번호) 인증 처리
11ConcurrentSessionFilter동시 세션 제어 (ex. 중복 로그인 방지)
12BearerTokenAuthenticationFilterBearer 토큰 (ex. JWT) 인증 처리
13BasicAuthenticationFilterHTTP Basic 인증 처리 (Authorization: Basic 헤더)
14RequestCacheAwareFilter인증 후 원래 요청으로 리다이렉트 지원
15SecurityContextHolderAwareRequestFilterRequest에 isUserInRole, getUserPrincipal 지원 추가
16AnonymousAuthenticationFilter인증되지 않은 사용자에게 "익명(Anonymous)" 권한 부여
17SessionManagementFilter세션 고정 공격 방어 / 세션 관련 정책 적용
18ExceptionTranslationFilter인증/인가 에러 처리 → 적절한 응답(403/401/리다이렉트) 전환
19FilterSecurityInterceptor실제 인가(Authorization) 처리: URL 권한 확인

이제 이러한 필터들은 모두 다 사용하는 것이 아닌 필터를 비활성화하거나, OAuth2.0을 사용하지 않는 등 필요한 필터만 키게 되면 한 10~15개 정도가 켜집니다. (나중에 개인프로젝트에서 디버그찍어서 사용한 필터 기입예정)

참고
https://spring.io/projects/spring-security
https://javadevjournal.com/spring-security/spring-security-authentication/

0개의 댓글