Spring Security - SecurityFilterChain

TopOfTheHead·2025년 11월 18일

Spring Security

목록 보기
19/21

SecurityFilterChain :
import org.springframework.security.web.SecurityFilterChain;

Spring Security에서 제공하는 보안 filter 모음 역할의 Interface.
( Authentication Filter , Authorization Filter , CORS Filter , CSRF Filter , ExceptionTranslation Filter 등)

Web Security Configuration를 정의하는 @Configuration Class를 통해 Spring Bean으로 등록 시 Delegating Filter Proxy를 통해 Servlet Filter Chain 사이에서 Filter로서 의존성 주입되어 기능

Spring Security의 핵심이 되는 기능을 제공하여 사용자에게 적절한 AuthenticationAuthorization이 부여

SecurityFilterChain구현체로서 HttpSecurity가 존재
FilterChain을 통해 설정 후 HttpSecurity객체.build()로 생성된 HttpSecurity instance를 반환하여 SecurityFilterChain으로서 Spring Bean으로 등록
▶ 이후 @EnableWebSecurity에 의해 해당 Spring Bean이 활성화

Filter Chain의 경우 Filter에 따른 검증이 순차적으로 적용.
1. CORS , CSRF 등의 Filter :
。기본필터

2. Authentication Filter :
。적절한 자격증명 보유 여부 Filtering

3. Authorization Filter :
。접근하려는 자원에 적절한 접근권한이 있는지 Filtering

  • Security Filter Chain 핵심적인 기능
    。기본적으로 ControllerMapping된 모든 URL을 대상으로 보호를 수행
    ▶ 해당 URL에 대해 요청 시 사용자에게 인증정보를 요구

    。 승인되지 않은 요청에 대해서는 로그인 양식이 표현
    URLHttp Request가 전송되었을때, SecurityFilterChain필터를 통해 사용자가 인증( Authenticate )되지 않은 경우, Login Form을 표시

HttpSecurity
특정 HTTP Request에 대한 웹보안Configuration을 설정하는 역할의 SecurityFilterChain 인터페이스 구현체
Default로서 모든 Http Request에 대해 적용

Resource(URL)의 접근 권한을 설정
▶ 특정 Resource접근 권한 또는 특정 권한을 가진 사용자접근 권한을 설정

Spring Security의 각종 Configuration을 수행.
@Configuration Class@Bean Method에서 HttpSecurity객체에서 Filter Chain을 구현 후 HttpSecurity객체.build()HttpSecurity객체를 생성 및 SecurityFilterChain객체로서 return하여 Spring Bean으로서 Spring Security의 설정을 반영.

Spring Security 6.x 부터는 람다기반 설정방식 권장

httpsecurity객체.authorizeHttpRequest(람다식) :
HttpRequest에 대한 접근권한을 설정하는 Method.
HttpRequest을 특정 패턴에 따라서 filtering하고 접근권한을 부여

。특정 HttpSecurity객체에 대하여 input된 인증이 된 모든 HttpRequest에 대하여 승인처리 설정.
구현하지 않는 경우, 모든 HTTP Request에 대해서 거절하면서 Authentication비활성화

。콜백함수의 매개변수로 auth를 전달하며, 해당 변수를 통해 Application의 API호출에 따른 모든 HttpRequest에 대한 접근권한 설정이 가능.

HTTP Request의 접근권한설정 Method ( Global Security )
HttpSecurity.authorizeHttpRequests(람다식)에서 람다식이 전달하는 인자( = auth)를 통해 설정.
▶ 구현하지 않는 경우, 모든 HTTP Request에 대해서 거절하면서 Authentication을 비활성화

  • auth.requestMatchers( HTTPMethod.메소드명 , "/URL Pattern")
    HTTP Request의 특정 URL patternHTTP Method에 대해서 접근 권한을 설정
    ▶ 나머지 HTTP Request에 대해서는 auth.anyRequest()에서 정의

    ex) auth.requestMatchers(HttpMethod.OPTIONS, "/**").permitAll() :
    ▶ 모든 URL PatternOPTIONS HTTP Method방식의 HTTP Request는 모두 허용.

  • auth.hasRole("ROLE역할명")
    。특정 Role을 가진 사용자만 접근할 수 있도록 제한.
http.authorizeHttpRequests(auth -> auth
            .requestMatchers("/admin/**").hasRole("ADMIN")
               )

/admin/** URL Pattern은 "ROLE_ADMIN"을 가진 사용자만 접근 가능.

  • auth.anyRequest() :
    。따로 접근권한을 설정한 특정 HTTP Request 이외의 모든 HTTP Request에 대한 접근권한을 정의
http.authorizeHttpRequests(
                auth->auth.requestMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                        .anyRequest().authenticated()
        )

auth.requestMatchers에서 정의한 HTTP Request 이외의 모든 HTTP Request에 대해 인증된 사용자만 접근가능하도록 설정.

  • auth.anyRequest().authenticated()
    。모든 HTTP Request에 대해 Authenticated 된 Client만 접근가능하도록 설정.

  • auth.anyRequest().permitAll()
    。모든 HTTP Request에 대해 허용.
    ▶ 따로 접근권한을 설정한 특정 HTTP Request가 없는 경우 보안없이 개방하는것과 같음.

  • auth.anyRequest().denyAll()
    。모든 HTTP Request에 대해 차단.

httpsecurity객체.formLogin(Customizer.withDefaults())
HttpRequest에 대한 Spring Security의 기본 Web Login Form( HTML Login Page )을 활성화하는 method.
▶ Cilient가 Application에 접근할 때 로그인 페이지를 제공하고, 로그인 요청을 처리하는 기능 수행.

Customizer.withDefaults() : formLogin()에 관련된 기본값 사용설정.
withDefaults()는 Customizer class의 static method로서 정의됨.

JWT을 인증방식으로 사용하면서 Session 비활성화 된 경우 Session 기반 인증을 수행하여 Session을 통해 로그인 상태를 유지하는 formLogin()을 사용할 필요가 없으므로 비활성화.

HttpSecurity객체.httpBasic(Customizer.withDefaults())
。Spring Security에서 HTTP Basic Authentication을 활성화하는 Method.
▶ Clent의 ID와 PW를 HTTP RequestAuthorization Header에 포함하여 인증하는 방식.

Authorization Header 요구 시 Basic Authentication 도출.
Basic Authentication : 웹브라우저의 인증 팝업으로 Authorization HeaderID/PW 입력 기능 제공.

HTTP Basic : Header에 ID와 PW를 포함 및 Base64로 인코딩하여 HTTP Authorization Header에 포함하여 Server로 전송.

httpsecurity객체.csrf(콜백함수)
HttpRequest에 대한 CSRF Protection을 설정하는 method.
Spring SecurityCSRF Protection이 기본적으로 활성화되어있으므로, 해당 method를 이용해 비활성화 설정이 가능.

。람다식의 매개변수로서 CSRF instance가 input.

http.csrf(csrf->csrf.disable());

▶ 다음 코드는 다음처럼 메서드참조로 축약이 가능

.csrf(AbstractHttpConfigurer::disable)

。특정 HttpSecurity객체에 대하여 CSRF Protection이 비활성화.
Session이 존재하지 않는 경우( Stateless )에만 비활성화하며, Session이 존재하는 경우, 반드시 CSRF protection을 활성화해야한다.
▶ Spring Security에서는 default로 CSRF protection 활성화로 설정되어있음.

HttpSecurity객체.headers(콜백함수)
HttpRequest에 대한 Http Response Header를 설정하는 method.
Spring Security는 보안 관련 HTTP Header를 자동으로 추가하지만,
필요에 따라 추가하거나 비활성화 설정 가능.

람다식의 매개변수로서 Http header객체가 전달

http.headers(header -> header.frameOptions(frameOptions->frameOptions.disable()));
  • header객체.frameOptions(람다식) :
    HTTP Header을 통해 Web Applicationiframe 보안정책을 설정하는 기능.
    ▶ 주로 Clickjacking 공격을 방지하는 역할을 수행.

    frameOption객체람다식 인자로 전달됨

    <iframe> : inline frame
    。HTML에서 다른 웹페이지나 문서를 현재 페이지 내에 삽입할 때 사용하는 태그.
    ▶ 외부 웹사이트, 동영상, 지도, 문서등을 포함 가능
    • frameoption객체.disable() :
      Http HeaderFrameOption을 비활성화.
      ▶ 모든 iframe을 허용하여 iframe 기반 UI ( ex. h2-console )을 사용 시 필요하지만 보안위험이 존재하므로, 신뢰할 수 있는 경우에만 사용.

    • frameoption객체.sameOrigin() :
      iframe을 같은 도메인에서 오는 `HTTP Request에 대해서만 허용.
      ▶ 동일한 도메인에서만 iframe을 사용가능하고, 다른 도메인에서는 차단.

HttpSecurity객체.build() :
Configuration이 수행된 HttpSecurity객체를 생성.
▶ 주로 SecurityFilterChain InterfaceUpCasting하여 활용.

HttpSecurity객체.sessionManagement(콜백함수) :
Spring Security에서 Session Policy를 설정하는 Method.

Spring Security는 기본적으로 Session을 사용하여 사용자의 Authentication 정보를 저장하지만, Session을 사용하지 않는 Stateless 방식의 JWT기반 인증 또는 REST API 구현을 위해 Session Policy에서 STATELESS 설정 시 활용
Session이 없는 경우, CSRF Protection을 비활성화 가능

HttpSecurity객체.formLogin()등의 Session을 사용하는 인증방식의 경우 사용설정해야한다.
▶ 웹브라우저에 계속 로그인 상태를 유지해야하는 경우 Session을 통한 로그인을 활성화
REST API처럼 API 호출시에만 일회성으로 로그인이 필요한 경우 Session을 사용하지 않는 STATELESS 방식으로 JWT를 활용.

。매개변수로 session이 전달되며, 람다식으로 session.sessionCreationPolicy(Session Policy 설정 옵션)를 통해 Spring Security가 설정한 Session Policy에 따라 Session의 처분을 결정.

httpsecurity객체.sessionManagement(
    session->session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
 )

Spring SecuritySession을 사용하지 않도록 Session Policy 설정.

Session Policy 설정 옵션
import org.springframework.security.config.http.SessionCreationPolicy;

  • SessionCreationPolicy.ALWAYS :
    。항상 새로운 Session을 생성하도록 Session Policy 설정.

  • SessionCreationPolicy.NEVER :
    Spring SecuritySession을 생성하지 않지만, 기존 Session을 사용가능하도록 Session Policy 설정.

  • SessionCreationPolicy.IF_REQUIRED :
    。기본값으로서, 필요한 경우에만 Session을 생성하도록 Session Policy 설정.

  • SessionCreationPolicy.STATELESS :
    Session을 사용하지 않도록 Session Policy 설정.
    주로 JWT Token을 활용하는 REST API Authentication 구현 시 사용.

HTTPSecurity객체.oauth2Login(Customizer.withDefaults())
OAuth - Google 로그인 설정
Spring Security에서 Oauth 2.0 로그인 기능을 활성화.
▶ 다음 설정을 끝낸 후 localhost:8080/login 접속 시 해당 API를 보호하기위해 등록된 OAuth2 Provider ( ex. Google , Facebook )에 의해 로그인옵션이 자동으로 표시됨.

localhost:8080/logout 접속 시 로그아웃을 수행.



  • HTTPSecurity객체.oauth2ResourceServer(람다식)
    OAuth2.0 Resorce Server를 이용하여 HTTP RequestAuthentication Header에 포함된 Access Token ( ex. JWT, Opaque Token 등 )을 전달받아 JWT Decoder의 Instance에 의해 Decryption을 수행 및 유효성 검증을 수행하여 Authentication하는 Method.
    ▶ 검증을 수행한 후 AuthenticationHTTP Request에 대해서만 API에 접근할 수 있도록 처리.

    HttpSecurity객체.oauth2ResourceServer(람다식)의 람다식 매개변수는 OAuth2ResourceServerConfigurer 객체를 매개변수로 전달.
    ▶ 해당 Instance에서 .jwt() , .opaqueToken()을 설정하여 Resource ServerAccess Token 검증방식 선택.

    JwtDecoder Interface의 구현체의 Instance를 생성하는 @Bean Method를 정의하여 EncryptJWT TokenDecrypt 후 유효성을 검증하는 역할을 수행
    JWTDecryption 및 검증하는 용도로 활용되므로, JWK URI에서 Key를 가져와서 Decrypt를 수행하는 JwtDecoder Instance를 생성하여 반환.
@Configuration
public class JwtSecurityConfiguration {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
     	// OAuth2.0 Resorce Server를 통해 HTTP Request의 JWT를 Decryption하여 
        return http.oauth2ResourceServer(oauth2 -> oauth2
                        .jwt(jwt -> jwt
                                .decoder(jwtDecoder())
                        ))
                // HttpSecurity instance를 생성한 후 return.
                // HttpSecurity는 SecurityFilterChain interface의 구현 Class이므로
     			// SecurityFilterChain의 instance로 활용이 가능.		
                .build();
    }
     // JWT는 RSA로 Encrypt 된 상태이므로 JWK URI 에서 Key를 가져와서 
     // Decrypt 및 유효성을 검증하는 JwtDecoder Instance를 생성하는 @Bean Method.
    @Bean
    public JwtDecoder jwtDecoder() {
        return NimbusJwtDecoder.withJwkSetUri("https://auth-server-url/.well-known/jwks.json").build();
    }
}

OAuth2ResourceServerConfigurer
Spring Security에서 OAuth2.0 Resource ServerConfiguration을 수행하는 용도로 사용.
OAuth2.0 Access Token을 검증하는 보안필터를 설정.

HTTPSecurity객체.oauth2ResourceServer(람다식)람다식 매개변수로서 OAuth2ResourceServerConfigurer Instance가 전달
▶ 해당 Instance에서 .jwt() , .opaqueToken()을 설정하여 Resource ServerAccess Token 인증방식 선택

  • OAuth2ResourceServerConfigurer객체.jwt(람다식)
    OAuth2.0 Resource Server에서 JWT 기반 Authentication을 수행하는 Method.
    Resource ServerJWT Token을 검증하도록 설정.

    일반적으로 Resource Server에 의해 HTTP RequestJWTCustom JWT Decoder를 통해 Decrypt 하여 검증하는 용도로 사용.

    람다식 매개변수는 JwtConfigurer객체를 받는다.
    JwtConfigurer.decoder(JwtDecoder구현체Instance)를 통해 JWT Decoder 설정

JwtConfigurer
JWT 기반 Authentication Configuration을 수행.
▶ 주로 JWT TokenDecryption하는 용도로 사용됨.

OAuth2ResourceServerConfigurer.jwt(람다식)의 람다식 매개변수로 JwtConfigurer instance가 전달됨.

  • JwtConfigurer객체.decoder(JwtDecoder구현체Instance)
    JWTDecryption을 수행하는 JWT Decoder를 설정.

JwtDecoder
RSA를 통해 EncryptJWT TokenDecrypt 및 유효성을 검증하는 역할을 수행하는 Interface
NimbusJwtDecoder등의 구현 Class의 instance를 생성하여 JwtDecoder의 instance로 반환하는 Custom JWT Decoder @Bean Method를 정의하여 OAuth2ResourceServerConfigurer객체.jwt(람다식)에 활용.

RSA를 통해 EncryptJWT TokenDecryptPublic Key가 필요하므로, JWK URI 에서 Key를 가져와서 Decrypt를 수행.
JWT Signature의 검증을 수행하기 위해서 Public Key가 필요하므로 JWK를 활용한다.

 	// JWT는 RSA로 Encrypt 된 상태이므로 JWK URI 에서 Key를 가져와서 
     // Decrypt 및 유효성을 검증하는 JwtDecoder Instance를 생성하는 @Bean Method.
    @Bean
    public JwtDecoder jwtDecoder() {
        return NimbusJwtDecoder.withJwkSetUri("https://auth-server-url/.well-known/jwks.json").build();
    }

Nimbus JOSE+JWT Library :
OAuth2.0 Resource Server dependency를 추가할 경우 자동으로 같이 추가됨.
Java에서 JWT, JWK , JWE( JSON Web Encryption ) , JWS ( JSON Web Signature )를 쉽게 다룰 수 있도록 지원하는 오픈소스 Library.
JWT의 검증 , Encryption & Decryption , Public Key 관리 등의 기능을 제공하는 도구.

Spring Security는 기본적으로 Nimbus Library를 활용하여 JWTDecrypt.

NimbusJwtDecoder :
Spring Security에서 제공하는 JWT Decoder로서 JWTDecrypt 및 유효성 검증을 수행하며 JwtDecoder Interface를 구현한 기본 Class
JWK URI, RSA Public Key 등을 통해 JWTSignature를 검증.

  • NimbusJwtDecoder.withJwkSetUri("JWK URI")
    RSA 암호화 알고리즘을 사용하는 JWTDecryptSignature의 유효성 검증 시 사용하는 NimbustJwtDecoder의 instance를 생성하는 static Method.
    JWK Set을 제공하는 Authentication Server가 정의된 JWK Set URI를 정의하여 자동으로 Public Key를 가져온 후 DecryptJWT Signature의 유효성 검증을 수행하는 JwtDecoder Instance를 생성

    JWK Set URI : JWK Set을 제공하는 URI
    https://example.com/oauth2/jwks : OAuth 2.0 Authentication Server가 제공하는 공개 키 목록.

  • NimbusJwtDecoder.withPublicKey(RSAPublicKey객체) :
    RSA 암호화 알고리즘을 사용하는 JWTDecryptSignature의 유효성 검증을 수행하는 NimbusJwtDecoder instance를 특정 RSAPublicKey instance를 활용하여 생성하는 Method.
    ▶ Client가 JWT를 Server에 전송 시 Server는 해당 Public Key 기반ㅇ로 생성된 NimbusJwtDecoder instance를 통해 전송된 JWT Signature를 유효성 검증 가능.

  • NimbusJwtDecoder.build() :
    NimbusJwtDecoder의 instance를 생성하는 builder method
    NimbusJwtDecoderJwtDecoder의 구현 Class이므로 해당 Interface의 instance로서 활용 가능.
            
profile
공부기록 블로그

0개의 댓글