공부/Spring Boot

Spring Boot 3.x 버전에서 Spring Security 적용기

son_i 2024. 8. 13. 23:26
728x90

* 스프링 시큐리티 버전확인하기

 

Gradle - Dependencies - 'security' 검색하여 확인할 수 있다.

 

6.3.1 버전으로 확인된다.

 

스프링 시큐리티 5.7버전 이상부터는 더이상 WebSecurityConfigurerAdapter가 사용되지 않는다고 한다.

이전 프로젝트는 5.7.11 버전이었고 WebSecurityConfigurerAdapter를 상속받아 SecurityConfig를 구성했었었는데 더이상 그대로 제작할 수 없게 되었다.

(5.7.11버전에서 저렇게 줄이 그어져있긴 하지만 사용할 수는 있었다.)

GiftFunding) Spring Security를 이용한 로그인 구현 (tistory.com)

 

GiftFunding) Spring Security를 이용한 로그인 구현

Spring Security 는 서블릿 필터를 기반으로 동작하며 Dispatcher Servlet 앞에 필터가 배치되어있다. - Dispatcher Servlet 이란 ?) HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위

soni-developer.tistory.com

 

 

WebSecurityConfigurerAdapter를 상속받는 대신에 SecurityFilterChain을 빈으로 등록하는 방법이 권장된다고 한다.

 

1. csrf 비활성화

csrf(Cross Site Request Forgery) : 공격자가 인증된 브라우저에 저장된 쿠키의 세션 정보를 활용하여 웹 서버에 사용자가 의도하지 않은 요청을 전달하는 것. 즉, 정상적인 사용자가 의도치 않은 위조 요청을 보내는 것을 의미한다.

REST API를 이용한 개발은 Session 기반 인증과 다르기 때문에 서버에 인증 정보를 보관하지 않는다.
권한 요청시 필요한 인증정보 (OAuth2.0, JWT 토큰 등) 요청을 포함하기 때문에 csrf 보안은 불필요함으로 비활성화 처리한다. 

SecurityFilterChain Bean 메소드를 만들고 csrf를 disable 해주었다.

 

기존의 csrf().disable()은 제거될 예정이라 사용할 수 없다.

 

스프링부트 3.x 버전부터 람다 형식을 사용해야한다고 해서 해줬는데 이렇게 노란색으로 표시되며 대체하라고 한다.

 

AbstractHttpConfigurer를 제거하여 비활성화합니다. 이렇게 하면 새로운 버전의 구성을 적용할 수 있습니다.
반환: 추가 사용자 지정을 위한 Http SecurityBuilder

 

대체해 주었다.

 

2. .authorizeHttpRequests()로 인증/인가가 필요한 URL 작성

스프링부트 3.x 이전 -> .antMatchers()를 이용해 특정 리소스에 대한 접근 권한 지정

 

스프링부트 3.x 이후 -> .requestMatchers()를 이용해 특정 리소스에 대한 접근권한 지정

 

3. HttpBasic(), FormLogin() 비활성화

- HttpBasic() : Http Basic Auth 기반으로 로그인 인증창이 뜸. 기본 인증 로그인을 이용하지 않으면 disable처리.
- FormLogin() : formLogin 대신 Jwt를 사용하기 때문에 disable.

csrf를 비활성화 한 방법과 마찬가지로 disable 해준다.

 

 

4. sessionManagemet() 설정

REST API 기반 애플리케이션의 동작방식을 설정한다.
JWT로 인증 처리할 때 세션 인증정보즌 서버에 담아놓을 필요가 없어서 STATELESS 설정.

- SessionCreationPolicy() : 정책 설정
- SessionCreationPolicy.STATELESS) : 4가지 정책 중 하나로 JWT 와 같이 세션 사용하지 않는 경우에 사용

 

5. H2 console 접근 허용

.requestMatchers로 "/h2-console/** 만 해줘서는 db로그인 화면까지는 정상적으로 뜨는데 로그인을 누르면 다음과 같이 나오게 된다.

 

csrf옵션SameOrgin 정책을 허용시켜서 iframe에 대한 접근이 허용되도록 설정 되어있어야 한다.

다음과 같이 설정해주면 접근이 가능하다.

추가적인 권한 설정을 하려면 .requestMatchers()로 설정

 

5. Swagger UI 접근 설정

.requestMatchers에 아래 세 가지를 모두 permitAll 해줘야 한다.

"/docs/**", "/v3/api-docs/**", "/swagger-ui/**"

 

 

이렇게 기본적인 Spring Security 설정을 해봤다.

개발을 진행하면서 필요한 것은 학습 후 추가할 예정이다.

 

코드 전문

package com.sj.Petory.config;

import org.springframework.boot.autoconfigure.security.servlet.PathRequest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

import static org.springframework.security.config.Customizer.withDefaults;


@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .csrf(AbstractHttpConfigurer::disable)
                .httpBasic(AbstractHttpConfigurer::disable)
                .formLogin(AbstractHttpConfigurer::disable)
                .sessionManagement(session ->
                        session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                )
                .headers(headers ->
                        headers
                                .frameOptions(
                                        HeadersConfigurer.FrameOptionsConfig::sameOrigin)
                )
                .authorizeHttpRequests((authz) ->
                        authz
                                .requestMatchers(
                                        "/members"
                                        , "/members/check-email"
                                        , "/members/check-name"
                                        , "members/login"
                                        , "/h2-console/**"
                                        , "/docs/**", "/v3/api-docs/**", "/swagger-ui/**").permitAll()
                                .anyRequest().authenticated()
                );

        return http.build();
    }
}

의문점

1. 이것저것 설정 안 해주고 그냥 return http.build(); filterChain 빈만 만들어도 기본 로그인 화면도 안 뜨게 된다. 머지?..

 


참조

 

공식문서. WebSecurityConfigurerAdapter를 더이상 사용하지 않음

https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter

 

Spring Security without the WebSecurityConfigurerAdapter

In Spring Security 5.7.0-M2 we deprecated the WebSecurityConfigurerAdapter, as we encourage users to move towards a component-based security configuration. To assist with the transition to this new style of configuration, we have compiled a list of common

spring.io

 

시큐리티 기본 개념 복습

https://velog.io/@dh1010a/SpringSecurity-%EC%8A%A4%ED%94%84%EB%A7%81%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0%EC%9D%98-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90%EA%B3%BC-%EA%B5%AC%EC%A1%B0

 

[Spring]Security - 스프링시큐리티의 기본 개념과 구조

이번시간에는 스프링 시큐리티를 사용하는 법을 공부해보려고 합니다. 스프링 시큐리티의 로그인 진행방식을 먼저 살펴보겠습니다.우선 스프링 시큐리티를 설정을 통해, 기본적인 접근 제어와

velog.io

 

스프링부트 3.x 에서 SpringSecurity 설정

https://velog.io/@dh1010a/Spring-Spring-Security%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-3.X-%EB%B2%84%EC%A0%84-1

 

[Spring] Spring Security를 이용한 로그인 구현 (스프링부트 3.X 버전) [1] - 동작 원리 및 Config 설정

스프링 부트 3.0 이상 버전의 시큐리티 사용법 및 바뀐 Config 작성법을 다루고 있습니다.

velog.io

 

h2-db 사용 설정 및 lamda 형식으로 바뀐 거 학습

https://velog.io/@kide77/Spring-Boot-3.x-Security-%EA%B8%B0%EB%B3%B8-%EC%84%A4%EC%A0%95-%EB%B0%8F-%EB%B3%80%ED%99%94#%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%99%98%EA%B2%BD

 

Spring Boot 3.x + Security 6.x 기본 설정 및 변화

Spring Boot 가 3.x Version 으로 들어서면서 Minor Version 이 바뀌었다보니 확실히 생각보다 변화된 부분이 많습니다.그 중에서도 제가 자주 설정하는 부분 중 하나인 Spring Security 부분에 대해 한번 알아

velog.io

 

728x90