목차
스프링 부트 3.0 부터 스프링 시큐리티 6.0.0 이상의 버전이 적용되었습니다. 스프링 부트 2.7.8 까지는 deprecated는 되었더라도 기존 설정대로 대부분 사용 가능했으나, 스프링 부트 3.0 부터는 아예 삭제된 부분들이 있어서 마이그레이션 시 주의할 부분(변경점)에 대해 다룹니다.
- 스프링 부트 2.7 이하 스프링 시큐리티 기본 세팅 : 링크
- 스프링 부트 3.0 이상 스프링 시큐리티 기본 세팅 : 작성중
0. 스프링 시큐리티 설정 마이그레이션 예시
완전히 동일한 세팅은 아니지만, 스프링 부트 2.6 기반으로 작성된 기본 세팅 코드와 스프링 부트 3.0 기반으로 작성된 기본 세팅 코드 입니다. 이하에 나올 변경점들이 적용되어 있는걸 코드로 볼 수 있습니다.(각각 위 2.7 이하 기본 세팅과 3.0 이상 기본 세팅 글에 사용된 코드입니다.)
(기존) github
(변경) github
1. antMatchers(), mvcMatchers(), regexMatchers()
-> requestMatchers() (또는 securityMatchers()) 로 변경
2. authorizeRequests()
-> authorizeHttpRequests() 로 변경
3. JSP 등 컨트롤러에서 화면 파일명을 리턴해 화면을 바꾸는 경우
(FORWARD 방식으로 페이지 이동할 경우)
-> 이하 '4'에서 세팅 시 authorizeHttpRequests 쪽에 dispatcherTypeMatchers(DispatcherType.FORWARD).permitAll() 를 추가해줘야 함 (스프링 시큐리티 6.0부터 forward 방식 페이지 이동에도 default로 인증이 걸리도록 변경되었음)
4. HttpSecurity 설정
기존 extends WebSecurityConfigurerAdapter 를 통해 세팅
-> 이제 WebSecurityConfigurerAdapter를 상속받는 방식은 삭제되었음. SecurityFilterChain 빈을 스프링 컨테이너에 등록해줘야 함.
(기존)
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authz) -> authz
.anyRequest().authenticated()
)
.httpBasic(withDefaults());
}
}
(변경) - 이 때 기존에 antMatchers나 mvcMatchers를 사용했다면 requestMatchers로 변경해야 함.
@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authz) -> authz
.anyRequest().authenticated()
)
.httpBasic(withDefaults());
return http.build();
}
}
5. WebSecurity 설정 방식
-> 마찬가지로 WebSecurityCustomizer 빈을 컨테이너에 등록하는 것으로 변경되었다가, 스프링 시큐리티 6부터는 아예 '4'에서 보던 HttpSecurity쪽에 등록하는 것으로 변경되었음.
(기존)
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authz) -> authz
.anyRequest().authenticated()
)
.httpBasic(withDefaults());
}
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/nahwasa1", "/nahwasa2");
}
}
(변경)
@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(request -> request
.requestMatchers("/nahwasa1", "/nahwasa2").permitAll()
.anyRequest().authenticated()
)
.httpBasic(withDefaults());
return http.build();
}
}
6. UserDetailsService 등록 방식
-> 이제 스프링 컨테이너에만 등록되면 됨.
(기존)
@Service
public class LoginIdPwValidator implements UserDetailsService {
...
}
@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
...
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(loginIdPwValidator);
}
}
(변경)
@Service
public class LoginIdPwValidator implements UserDetailsService {
...
}
(스프링 시큐리티쪽에 별도로 설정할 것 없이 적용됨)
7. JDBC 인증
-> 스프링 컨테이너에 등록
(기존)
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.build();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
auth.jdbcAuthentication()
.withDefaultSchema()
.dataSource(dataSource())
.withUser(user);
}
}
(변경)
@Configuration
public class SecurityConfiguration {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript(JdbcDaoImpl.DEFAULT_USER_SCHEMA_DDL_LOCATION)
.build();
}
@Bean
public UserDetailsManager users(DataSource dataSource) {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
JdbcUserDetailsManager users = new JdbcUserDetailsManager(dataSource);
users.createUser(user);
return users;
}
}
references
https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter
https://docs.spring.io/spring-security/reference/5.8/migration/index.html
https://github.com/spring-projects/spring-security/issues/12479
'Development > Spring Boot' 카테고리의 다른 글
스프링부트 헥사고날 아키텍쳐 코드 구조 (7) | 2023.02.17 |
---|---|
스프링부트 3.0이상 Spring Security 기본 세팅 (스프링 시큐리티) (88) | 2023.02.10 |
스프링부트 3.0.0 프로젝트 생성시 에러 해결법 (인텔리제이) (6) | 2022.12.15 |
스프링부트 MyBatis에서 파라미터 여러개 넘기기 (parameterType) (0) | 2022.02.18 |
스프링부트 Swagger UI 3.0.0 적용 방법 - 스프링부트 2.2 이상 (Spring Boot Swagger UI) (4) | 2021.12.27 |
댓글