* 스프링 시큐리티 버전확인하기
Gradle - Dependencies - 'security' 검색하여 확인할 수 있다.
6.3.1 버전으로 확인된다.
스프링 시큐리티 5.7버전 이상부터는 더이상 WebSecurityConfigurerAdapter가 사용되지 않는다고 한다.
이전 프로젝트는 5.7.11 버전이었고 WebSecurityConfigurerAdapter를 상속받아 SecurityConfig를 구성했었었는데 더이상 그대로 제작할 수 없게 되었다.
(5.7.11버전에서 저렇게 줄이 그어져있긴 하지만 사용할 수는 있었다.)
GiftFunding) Spring Security를 이용한 로그인 구현 (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
시큐리티 기본 개념 복습
스프링부트 3.x 에서 SpringSecurity 설정
h2-db 사용 설정 및 lamda 형식으로 바뀐 거 학습
'공부 > Spring Boot' 카테고리의 다른 글
Spring Boot) 백 & 프론트 카카오 로그인 API 구현하기 (4) | 2024.08.24 |
---|---|
Spring Security + JWT 인증 인가 구현하기(로그인 API, 인증이 필요한 API) (0) | 2024.08.16 |
Spring Boot) 회원가입 시 PasswordEncoder 이용해 비밀번호 암호화 (0) | 2024.08.12 |
SpringBoot 3.x 버전에서 RestDocs + SwaggerUI 사용하기 (0) | 2024.08.01 |
OpenAPI 데이터 받아오기 (0) | 2023.09.29 |