SecurityConfig

오두호·2024년 1월 29일

Spring

목록 보기
2/3

전에 올려둔 글에서 HttpSecurity 관련 바뀐 문법에 대해 다룬 적이 있다.

링크텍스트

IDE를 Intelij IDEA 2022.2~ -> 2023.3.2 로 바꾸면서 또 추천되는 새로운 문법과 함께 간략한 개념을 정리해보려한다.

HttpSecurity?

HttpSecurity는 Spring에서 제공하는 Configuration 클래스이다.
사용자는 입맛에 맞게 커스텀하여 사용할 수 있고 이엔 관련 여러 함수들이 존재한다.
Java 17 이상부턴 람다식 으로 작성하는 것이 일반적이다.

    @Bean
    public SecurityFilterChain configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .cors(Customizer.withDefaults())
                .csrf(AbstractHttpConfigurer::disable)
                .httpBasic(AbstractHttpConfigurer::disable)
                .sessionManagement((sessionManagement)
                        -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeHttpRequests((authorizeHttpRequests)
                                -> authorizeHttpRequests
                                .anyRequest().permitAll()
                );
        httpSecurity.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
        httpSecurity.addFilterBefore(jwtExceptionFilter, JwtAuthenticationFilter.class);

        return httpSecurity.build();
    }

간단한 프로젝트 내의 Config 코드를 예시로 정리해보려한다.


CORS

프론트엔드와 함께 개발을 하다보면 한번쯤 접해봤을 '403 Cross-origin' 오류가 발생하는 원인이다.
다른 출처에서 오는 리소스에 관한 정책 설정이다.

여기서 말하는 '다른 출처'는 Protocol, Host가 다른 곳을 말한다.

.cors(Customizer.withDefaults()) : 기본값으로 CORS 정책을 설정한다.
이후 Access-Control-Allow-Origin 관련 설정을 통해 외부 리소스에 대한 핸들링을 진행할 수 있다.

@CrossOrigin 어노테이션, 혹은 Config 클래스 내부 설정을 통해 관련 보안 설정을 진행할 수 있다.

CSRF

보안 공격중 하나로, "Cross-Site Request Forgery"의 약자이다.
'명시적인 동의 없이 사용자를 대신해 웹 어플리케이션에서 악의적인 행동'을 취하는 공격을 의미한다.

.csrf(AbstractHttpConfigurer::disable): CSRF 에 관한 정책 설정을 하지 않는다.

간단한 프로젝트에선 보통 진행하지 않는데, 보통 CSRF Token을 활용해서 이 공격을 방지한다. 세션마다 다른 토큰을 발급하며 공격을 방지하곤한다.

HttpBasic

인증 처리를 진행할 때, 사용자 정의 loginForm을 정의하는 방법과 SpringSecurity에서 제공하는 기본 인증을 활용하는 방법이 있다.
이 옵션을 활성화 한다면 팝업으로 인증 절차를 제공해준다.

.httpBasic(AbstractHttpConfigurer::disable): 사용하지 않는다.

간단한 프로젝트 규모에서 인증 폼을 작성하는 것이 귀찮다면 활용할 수 있는 옵션이다.

SessionManagement

세션 관련 정책을 설정할 수 있는 옵션이다.
세션 관련 개념은 따로 다루진 않을 예정이다.
간단한 정리가 목적

.sessionManagement((sessionManagement) -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) : 간단히 말하면 세션을 활용하지 않는 정책 설정이다.

AuthorizeHttpRequests

HttpMethod, Url 등에 요청에 인증을 활성화할 것인지, 비활성화 할 것인지 설정하는 옵션이다.

.authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests .anyRequest().permitAll() ); : 모든 요청을 허용한다.(인증하지 않는다.)

상세한 설정도 가능하다.
예를 들어, "/login" 경로는 인증하게끔 활용하고싶다면
.requestMatchers(HttpMethod.GET,"/login").authenticated()

혹은 이 경로를 인증하지 않게끔 활용하고싶다면
.requestMatchers(HttpMethod.GET,"/login").permitAll()

두가지 방법으로 활용할 수 있다.

AddFilterBefore

인증 전, 혹은 특정 필터가 사용되기 전 사전 필터링을 적용할 수 있는 옵션이다.

httpSecurity.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
httpSecurity.addFilterBefore(jwtExceptionFilter, JwtAuthenticationFilter.class);

이 두가지 옵션은, Id, Password 체크 필터 실행 전 Jwt인증 필터를 적용하고
Jwt인증 필터 실행 전 Jwt예외 필터를 적용해 관련해서 발생하는 예외를 체킹할 수 있게끔 하는 설정이다.


위 설정은 가장 쉽게 할 수 있는 설정으로, 실제 프로젝트 단계에선 사용할 수 없다.
하지만 간단하게 개인 프로젝트를 개발할 경우 위같은 설정을 통해 간단하지만 인증이 가능한 설정을 적용할 수 있을 것이다.

profile
Developer

0개의 댓글