mvcMatchers(HttpMethod method, String… patterns)
- 제한을 적용할 경로, HTTP방식을 모두 지정 가능
mvcMatchers(String… patterns)
- 경로를 기준으로 권한 부여 제한
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
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.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
// GET 요청에 대해서 /admin/** 경로는 ROLE_ADMIN 권한이 필요함
.mvcMatchers(HttpMethod.GET, "/admin/**").hasRole("ADMIN")
// POST 요청에 대해서 /admin/** 경로는 ROLE_ADMIN 권한이 필요함
.mvcMatchers(HttpMethod.POST, "/admin/**").hasRole("ADMIN")
// GET 요청에 대해서 /user/** 경로는 ROLE_USER 권한이 필요함
.mvcMatchers("/user/**").hasRole("USER")
// "/public/**" 경로는 인증 없이 접근 가능
.mvcMatchers(HttpMethod.POST, "/user/**").hasRole("USER")
// 기타 모든 요청은 인증만 필요함
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
}
CSRF(크로스 사이트 요청 위조)는 웹 애플리케이션의 보안 취약점 중 하나로, 사용자가 의도하지 않은 요청을 수행하게 하여 악의적인 행동을 실행하게 만드는 공격이다. CSRF 공격은 사용자가 현재 로그인되어 있는 웹 애플리케이션에서 발생하며, 공격자가 사용자의 권한을 도용하여 악의적인 요청을 수행하도록 한다.
스프링 시큐리티는 CSRF 공격에 대한 방어 기능을 기본적으로 제공한다. CSRF 보호 기능을 활성화하면 모든 상태 변경 요청(POST, PUT, DELETE 등)에 대해 CSRF 토큰을 요구한다. 이 토큰은 서버가 생성하여 클라이언트에 전달하고, 클라이언트는 이후의 요청에 이 토큰을 포함시켜야 한다.
- 기본 와일드카드 (*)
*는 경로의 한 부분(segment)을 대체한다.
예시: /user/*는 /user/abc, /user/123 등을 매칭한다. 하지만 /user/abc/123는 매칭하지 않는다.- 더블 와일드카드 (**)
**는 경로의 여러 부분(segments)을 대체할 수 있다.
예시: /user/**는 /user/abc, /user/abc/123, /user/abc/123/def 등을 모두 매칭한다.
mvc 선택기 vs 앤트 선택기
mvc 선택기는 스프링 애플리케이션이 컨트롤러 동작에 대한 일치 요청을 이해하는 방법을 정확하게 지정한다. /hello와 /hello/를 같은 경로로 인식한다.
mvc 선택기를 이용하는 것이 좋다. mvc 선택기를 이용하면 스프링의 경로 및 작업 매핑과 관련한 몇 가지 위험을 예방할 수 있다. 그 이유는 권한 부여 규칙을 위해 경로를 해석하는 방법과 스프링이 경로를 엔드포인트에 매핑하기 위해 해석하는 방법이 같기 때문이다.