Spring 기반 App 의 인증과 권한을 담당하는 Spring 의 하위 framework 이다.
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.1.1.RELEASE'
package com.mysite.sbb;
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.web.SecurityFilterChain;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// 인증되지 않은 모든 요청 허락
http.authorizeHttpRequests().requestMatchers(
new AntPathRequestMatcher("/**")
).permitAll();
return http.build();
}
}
위의 방법으로 보안설정을 하면 H2 에서 403 오류가 발생한다.
⚠️ CSRF - Cross Site Request Forgery
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests().requestMatchers(
new AntPathRequestMatcher("/**")).permitAll()
// h2 에서 CSRF 기능을 예외로 처리하는 로직
.and()
.csrf().ignoringRequestMatchers(
new AntPathRequestMatcher("/h2-console/**"))
;
return http.build();
}
}
H2 의 콘솔 화면은 Frame 구조로 되어있고,
Spring Security 는 사이트의 콘텐츠가 다른 사이트에 포함되지 않도록 하기 위해 X-Frame-Options
해더값을 사용해 이를 방지하기 때문에 화면이 깨지게 된다.
XFrameOptions
의 heart
값을 sameorigin
로 설정해 주면 된다.@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests().requestMatchers(
new AntPathRequestMatcher("/**")).permitAll()
.and()
.csrf().ignoringRequestMatchers(
new AntPathRequestMatcher("/h2-console/**"))
// 화면 깨짐 문제 해결 로직
.and()
.headers()
.addHeaderWriter(new XFrameOptionsHeaderWriter(
// 헤더값 변경
XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN))
;
return http.build();
}
}