본문 바로가기

Language/Spring Security

요청 기반 권한 부여 - HttpSecurity.authorizeHttpRequests()

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