스프링 시큐리티(Spring Security)는 다양한 필터로 구성된 필터 체인을 통해 보안 기능을 구현합니다. 각 필터는 인증(Authentication), 권한 부여(Authorization), 세션 관리 등 특정한 보안 기능을 수행합니다. Spring Security의 필터는 특정 순서에 따라 동작하며, 이로 인해 전체 보안 프로세스가 체계적으로 처리됩니다. 주요 필터와 그 역할을 정리하면 다음과 같습니다:
1. SecurityContextPersistenceFilter
- 역할: 요청이 들어오면 SecurityContext를 조회하고, 인증 정보를 유지합니다. 요청이 끝나면 SecurityContext를 세션에 저장하여 이후 요청에서도 인증 정보를 사용할 수 있게 합니다.
- 위치: 보안 체인의 가장 앞 부분에 위치하여, 모든 요청이 들어오고 나갈 때 인증 정보를 관리합니다.
- 특징: 세션을 사용하여 사용자 인증 상태를 유지하고 관리합니다.
2. UsernamePasswordAuthenticationFilter
- 역할: 폼 로그인을 처리하는 필터로, 로그인 요청을 처리하고 사용자 이름과 비밀번호를 기반으로 인증을 수행합니다.
- 위치: 인증 과정의 시작점에 위치하여 기본적으로 /login 경로로 들어오는 요청을 처리합니다.
- 특징: 폼 기반의 로그인 외에도 다른 인증 방식을 사용할 때 비활성화할 수 있습니다.
3. BasicAuthenticationFilter
- 역할: HTTP Basic 인증을 처리하는 필터로, HTTP 헤더에 포함된 Authorization 정보를 읽어 인증을 수행합니다.
- 위치: 폼 인증 대신 기본 인증(Basic Authentication)을 사용할 때 사용됩니다.
- 특징: API 보안에서 많이 사용되며, 간단한 기본 인증 방식을 통해 사용자 인증을 처리합니다.
4. BearerTokenAuthenticationFilter
- 역할: JWT와 같은 토큰 기반 인증을 처리하는 필터로, Authorization 헤더에 있는 Bearer 토큰을 읽어 인증을 수행합니다.
- 위치: OAuth 2.0 또는 JWT 인증 흐름을 사용할 때 주로 활용됩니다.
- 특징: 토큰을 통해 세션을 사용하지 않는 무상태 인증(stateless authentication)을 구현할 수 있습니다.
5. AnonymousAuthenticationFilter
- 역할: 인증되지 않은 사용자에게 익명 사용자 권한을 부여하여 리소스에 접근할 수 있게 합니다.
- 위치: 인증이 완료된 후에 실행되며, 인증되지 않은 사용자가 접근할 때 익명 권한을 설정합니다.
- 특징: 인증되지 않은 사용자도 특정 리소스에 접근할 수 있게 설정할 때 유용합니다.
6. ExceptionTranslationFilter
- 역할: 인증 및 인가 과정에서 발생하는 예외를 처리하고, 필요한 경우 로그인 페이지로 리다이렉트하거나 오류 메시지를 반환합니다.
- 위치: 필터 체인의 중간에 위치하여, 보안 예외 발생 시 이를 처리합니다.
- 특징: 접근 제한이나 인증 실패 시 발생하는 예외를 표준화하여 처리합니다.
7. FilterSecurityInterceptor
- 역할: 인가(Authorization) 처리를 담당하는 필터로, 사용자가 접근하려는 URL이나 리소스에 대해 필요한 권한이 있는지 확인합니다.
- 위치: 필터 체인의 마지막 단계에서 동작하며, 최종적으로 접근 권한을 확인하고 허용 또는 차단합니다.
- 특징: 접근이 허가되지 않은 경우 예외를 발생시켜 접근을 차단합니다.
8. CsrfFilter
- 역할: CSRF(Cross-Site Request Forgery) 공격을 방지하기 위한 필터로, CSRF 토큰이 없는 요청을 차단합니다.
- 위치: 체인에서 인증 필터 이후에 위치하여, 요청마다 CSRF 토큰이 유효한지 확인합니다.
- 특징: 기본적으로 활성화되어 있으며, 요청마다 CSRF 토큰을 확인하여 보안성을 강화합니다.
9. ConcurrentSessionFilter
- 역할: 한 사용자가 여러 세션을 유지하지 않도록 제한하고, 중복 로그인 방지를 위해 세션 수를 관리합니다.
- 위치: 인증이 완료된 후에 위치하며, 세션의 유효성을 검사합니다.
- 특징: 동시 세션 수 제한을 통해 보안을 강화할 수 있습니다.
10. LogoutFilter
- 역할: 사용자가 로그아웃을 요청할 때 이를 처리하는 필터로, 세션에서 사용자의 인증 정보를 제거합니다.
- 위치: 필터 체인의 마지막에 위치하여 로그아웃 요청을 처리하고 보안 컨텍스트를 정리합니다.
- 특징: 로그아웃 후 세션을 만료시키고 사용자가 더 이상 인증되지 않도록 합니다.
필터 체인 흐름
Spring Security는 이들 필터를 체인 형태로 연결하여 순서대로 처리합니다. 각 필터는 특정 조건에서만 동작하며, 인증이 완료되면 체인을 거치지 않고 직접 리소스에 접근할 수 있습니다. 요청이 들어오면 필터 체인을 통과하면서 보안 검사를 수행하고, 필터 체인을 통과한 후에는 인증된 사용자만이 보호된 리소스에 접근할 수 있습니다.
필터 체인의 구조와 동작 원리
- 입력된 요청이 필터 체인을 통과
- 클라이언트로부터 요청이 들어오면, 요청은 Spring Security의 필터 체인을 통해 검사를 시작합니다.
- 필터 체인은 여러 보안 필터들로 구성되어 있으며, 각 필터는 특정 보안 작업을 수행합니다.
- 필터의 순차적 실행
- 필터 체인 내 필터는 정의된 순서대로 실행됩니다.
- 예를 들어, SecurityContextPersistenceFilter는 요청의 첫 번째 단계에서 실행되어 기존 SecurityContext(보안 컨텍스트)를 조회하고, UsernamePasswordAuthenticationFilter는 사용자 로그인 시 자격 증명을 검증하는 등 각 필터는 자신의 역할에 맞는 검사를 수행합니다.
- 필터 역할과 제어 흐름
- 필터는 통과 여부를 결정하며, 통과할 경우 다음 필터로 제어가 넘어가고, 그렇지 않을 경우 체인은 종료됩니다.
- 필터가 인증이나 인가에 실패하면 바로 ExceptionTranslationFilter가 예외를 처리하여 로그인 페이지로 리다이렉트하거나 403 오류 메시지를 반환합니다.
- 인증 필터 (Authentication Filter)
- 필터 체인에서 UsernamePasswordAuthenticationFilter, BasicAuthenticationFilter, BearerTokenAuthenticationFilter 같은 필터들이 주로 인증 작업을 처리합니다.
- 예를 들어 UsernamePasswordAuthenticationFilter는 사용자 로그인 정보를 기반으로 인증을 수행하며, 인증 성공 시 보안 컨텍스트에 사용자 정보를 저장하여 다른 필터에서도 참조할 수 있도록 합니다.
- 인가 필터 (Authorization Filter)
- FilterSecurityInterceptor와 같은 필터는 인증이 완료된 후 사용자의 권한을 확인하는 필터입니다.
- 필터 체인의 마지막에 위치하여 사용자가 접근하려는 리소스에 필요한 권한이 있는지를 최종적으로 확인합니다.
- 예외 처리와 종료
- 인증이나 인가가 실패하거나 필터에서 문제가 발생하면 ExceptionTranslationFilter가 예외를 처리합니다.
- 모든 필터를 통과한 요청만이 애플리케이션의 실제 리소스에 접근할 수 있습니다.
필터 체인의 장점
- 확장 가능성: 스프링 시큐리티의 필터 체인은 유연하게 필터를 추가하거나 순서를 조정할 수 있습니다. 사용자 정의 필터를 만들어 기존 필터 체인에 추가함으로써 특정 보안 요구 사항에 맞출 수 있습니다.
- 단계적 보안 처리: 필터 체인은 인증, 인가, 예외 처리, 세션 관리 등 다양한 보안 작업을 단계적으로 수행하므로 보안 관리를 체계적으로 수행할 수 있습니다.
필터 체인에서 중요한 설정
- 필터 추가와 위치 지정: addFilterBefore, addFilterAfter, addFilterAt 등의 메서드를 통해 필터 체인의 특정 위치에 필터를 추가할 수 있습니다. 예를 들어, 사용자 정의 필터를 BasicAuthenticationFilter전에 실행되도록 추가할 수 있습니다.
- HTTP 보안 설정: http.authorizeRequests(), http.formLogin(), http.httpBasic() 등 다양한 설정을 통해 필터 체인의 구체적인 동작을 정의합니다.
필터 체인의 예시
다음은 인증과 인가가 처리되는 필터 체인 예시입니다:
- SecurityContextPersistenceFilter: 이전 세션의 인증 정보를 복원하여 요청에 사용
- UsernamePasswordAuthenticationFilter: 사용자 로그인 요청을 인증
- BasicAuthenticationFilter: 기본 인증 방식(Basic Auth) 사용
- AnonymousAuthenticationFilter: 인증되지 않은 요청에 대해 익명 사용자 권한 부여
- ExceptionTranslationFilter: 예외 발생 시 처리
- FilterSecurityInterceptor: 최종적으로 사용자의 리소스 접근 권한 확인
스프링 시큐리티는 이 필터 체인을 통해 웹 애플리케이션의 모든 요청을 보호하고 보안 정책을 관리합니다. 따라서, 필터 체인은 Spring Security의 중요한 보안 처리 매커니즘입니다.
'Springboot Study > Springboot Security' 카테고리의 다른 글
CORS(Cross-Origin Resource Sharing, 교차 출처 리소스 공유) (0) | 2024.11.01 |
---|---|
CSRF(Cross-Site Request Forgery) (0) | 2024.10.31 |
Spring Security에서 중요한 인터페이스들 (0) | 2024.10.30 |
스레드풀 (0) | 2024.10.29 |
세션(Session)과 제이슨웹토큰(JSON Web Token) (0) | 2024.10.29 |