728x90
- Spring Security는 요청 기반 권한 부여(Request Based Authorization)와 메소드 기반 권한 부여(Method Based Authorization)를 통해 자원에 대한 심층적인 방어를 제공
- 요청 기반 권한 부여는 클라이언트의 요청(HttpServletRequest) 에 대한 권한 부여를 모델링 하는 것이며 이를 위해 HttpSecurity 인스턴스를 사용하여 권한 규칙을 선언 가능
요청 기반 권한 부여 - HttpSecurity.authorizeHttpRequests()
@Bean
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(authorize -> authorize
.anyRequest().authenticated());
return http.build()
}
- anyRequest().authenticated()
- 애플리케이션의 모든 엔드포인트가 최소한 인증된 보안 컨텍스트가 있어야 한다고 알림
- authorizeHttpRequests()는 사용자의 자원 접근을 위한 요청 엔드포인트와 접근에 필요한 권한을 매핑시키기 위한 규칙을 설정하는 것으로서 서블릿 기반 엔드포인트에 접근하려면 authorizeHttpRequests()에 해당 규칙들을 포함해야 함
- authorizeHttpRequests()를 통해 요청과 권한 규칙이 설정되면 내부적으로 AuthorizationFilter가 요청에 대한 권한 검사 및 승인 작업을 수행
authorizeHttpRequests() API
- requestMatchers()
- requestMatchers 메소드는 HTTP 요청의 URL 패턴, HTTP 메소드, 요청 파라미터 등을 기반으로 어떤 요청에 대해서는 특정 보안 설정을 적용하고 다른 요청에 대해서는 적용하지 않도록 세밀하게 제어 가능
- 예를 들어 특정 API 경로에만 CSRF 보호를 적용하거나, 특정 경로에 대해 인증을 요구하지 않도록 설정 가능
→ 이를 통해 애플리케이션의 보안 요구 사항에 맞춰서 유연한 보안 정책을 구성 가능
메서드 | 설명 |
requestMatchers(String... urlPatterns) | 보호가 필요한 자원 경로를 한 개 이상 정의 |
requestMatchers(RequestMatcher... requestMatchers) | 보호가 필요한 자원 경로를 한 개 이상 정의 → AntPathRequestMatcher, MvcRequestMatcher 등의 구현체를 사용 가능 |
requestMatchers(HttpMethod method, String... utlPatterns) | Http Method와 보호가 필요한 자원 경로를 한 개 이상 정의 |
엔드 포인트 & 권한 부여
- requestMatchers("/admin").hasRole("ADMIN")
- requestMatchers(”/admin”) ⇒ 엔드포인트 패턴
- .hasRole(”ADMIN”) ⇒ 권한 규칙
- 요청 URL이 /admin 엔드포인트일 경우 ADMIN 권한을 필요
보호 자원과 권한 규칙 설정하기
http.authorizeHttpRequests(authorize -> authorize
//엔드 포인트와 권한 설정, 요청이 /user 엔드포인트 요청인 경우 USER 권한을 필요
.requestMatchers("/user"). hasAuthority("ROLE_USER")
//Ant 패턴을 사용 가능, 요청이 /mypage 또는 하위 경로인 경우 USER 권한을 필요
.requestMatchers( "/mypage/**").hasRole("USER")
//정규 표현식을 사용 가능
.requestMatchers(RegexRequestMatcher.regexMatcher("/resource/[A-Za-z0-9]+")).hasAuthority("USER")
//HTTP METHOD 를 옵션으로 설정 가능
.requestMatchers(HttpMethod.GET, "/**").hasAuthority("ROLE_READ")
// POST 방식의 모든 엔드포인트 요청은 write 권한을 필요
.requestMatchers(HttpMethod.POST).hasAuthority("ROLE_WRITE")
//원하는 RequestMatcher를 직접 사용 가능
.requestMatchers(new AntPathRequestMatcher("/manager/**")).hasAuthority("MANAGER")
//admin/ 이하의 모든 요청은 ADMIN 과 MANAGER 권한을 필요
.requestMatchers("/admin/**").hasAnyAuthority("ROLE_ADMIN","ROLE_MANAGER")
// 위에서 정의한 규칙 외 모든 엔드포인트 요청은 인증을 필요
.anyRequest().authenticated());
- 주의 사항
- 스프링 시큐리티는 클라이언트의 요청에 대하여 위에서 부터 아래로 나열된 순서대로 처리하며 요청에 대하여 첫 번째 일치만 적용되고 다음 순서로 넘어가지 않음
→ requestMatcher에 일치되는 것이 있으면 이후 명령은 실행하지 않음 - /admin/** 가 /admin/db 요청을 포함하므로 의도한 대로 권한 규칙이 올바르게 적용 되지 않을 수 있음 → 따라서 엔드 포인트 설정 시 좁은 범위의 경로를 먼저 정의하고 그것 보다 큰 범위의 경로를 다음 설정으로 정의
- 스프링 시큐리티는 클라이언트의 요청에 대하여 위에서 부터 아래로 나열된 순서대로 처리하며 요청에 대하여 첫 번째 일치만 적용되고 다음 순서로 넘어가지 않음
권한 규칙 종류
API | 정의 |
authenticated | 인증된 사용자의 접근을 허용 |
fullyAuthenticated | 아이디와 패스워드로 인증된 사용자의 접근을 허용, rememberMe 인증 제외 |
anonymous | 익명사용자의 접근을 허용 |
rememberMe | 기억하기를 통해 인증된 사용자의 접근을 허용 |
permitAll | 요청에 승인이 필요하지 않는 공개 엔드포인트이며 세션에서 Authentication을 검색하지 않음 |
denyAll | 요청은 어떠한 경우에도 허용되지 않으며 세션에서 Authentication을 검색하지 않음 |
access | 요청이 사용자 정의 AuthorizationManager를 사용하여 액세스를 결정 → 표현식 문법 사용 |
hasAuthority | 사용자의 Authentication에는 지정된 권한과 일치하는 GrantedAuthority가 있어야 함 |
hasRole | hasAuthority의 단축키로 ROLE_ 또는 기본접두사로 구성 → ROLE_ 을 제외해야 함 |
hasAnyAuthority | 사용자의 Authentication에는 지정된 권한 중 하나와 일치하는 GrantedAuthority가 있어야 함 |
hasAnyRole | hasAnyAuthority의 단축키로 ROLE_ 또는 기본 접두사로 구성 → ROLE_ 을 제외해야 함 |
- 권한 규칙은 내부적으로 AuthorizationManager 클래스에 의해 재 구성되며 모든 요청은 여러 종류의 AuthorizationManager에 설정된 권한 규칙에 따라 승인 혹은 거부
728x90
'Language > Spring Security' 카테고리의 다른 글
요청 기반 권한 부여 - HttpSecurity.securityMatcher() (0) | 2024.07.31 |
---|---|
표현식 및 커스텀 권한 구현 (0) | 2024.07.31 |
SameSite (0) | 2024.07.29 |
CSRF 통합 (0) | 2024.07.29 |
CSRF 토큰 유지 및 검증 (0) | 2024.07.29 |