[Spring Security 6] 메서드 단위 권한 요청
스프링 시큐리티는 권한 요청 및 접근 제어를 수행하는 방법으로 크게 두 가지 방법을 제공한다.
1. URL 기반 권한 요청
시큐리티 설정 클래스에서 URL을 기반으로 접근 권한을 제어한다.
HttpSecurity 클래스의 authorizeRequests() 메서드를 사용해 구현한다.
2. 메서드 수준에서의 권한 요청
특정 애너테이션을 사용해 권한을 제어한다.
클래스의 메서드 단위로 권한을 제어할 수 있다.
URL 기반 접근 제어만 사용하는 경우도 많지만, 보안 요구사항이 복잡한 경우 두 가지 방법을 함께 사용하기도 한다.
요청이 들어오면 URL 기반 접근 제어가 먼저 실행되고, 그 다음에 메서드 기반의 접근 제어가 수행된다.
전반적인 보안은 URL 기반으로, 세부적인 접근 제어는 메서드 수준에서 수행하자.
@PreAuthorize("hasRole('ADMIN')")
public void adminOnlyMethod() {
...
}
@PreAuthorize("#username == principal.username")
public void editProfile(String username) {
...
}
@PostAuthorize("returnObject.username == principal.username")
public UserProfile findProfileByUsername(String username) {
return null;
}
@PreAuthorize : 메서드가 실행되기 전에 권한을 확인한다.
@PostAuthorize : 메서드가 실행된 후 권한을 확인한다.
메서드에 전달된 파라미터 기반으로 접근을 허용하거나 특정 역할을 가진 사용자만 API를 호출하도록 할 때 @PreAuthorize 애너테이션을 사용하고,
메서드의 실행 결과를 기반으로 접근을 제어해야 하는 경우 @PostAuthorize 애너테이션을 사용하자.
내부적으로는 AOP를 사용한다.
@PostFilter("filterObject.owner == authentication.name")
public List<Task> getTasks() {
}
@PreFilter(filterTarget="tasks", value="filterObject.owner == authentication.name")
public void deleteTasks(List<Task> tasks) {
}
@PostFilter : 메서드의 반환 값으로 돌려주는 컬렉션을 필터링한다.
@PreFilter : 메서드에 전달되는 컬렉션을 필터링한다.
메서드가 반환하는 컬렉션의 각 요소에 대해 보안 제약을 지정할 때 사용하고,
메서드의 매개변수로 전달되는 컬렉션의 요소에 대해 보안 제약 조건을 지정할 때 사용한다.
컬렉션이나 배열에만 적용할 수 있고, 역시 내부적으로 AOP를 사용한다.
스프링 시큐리티 설정 관련 애너테이션에 대해 살펴보자.
@EnableWebSecurity
스프링 MVC와 함께 사용할 때 웹 보안을 활성화하는 애너테이션이다.
HTTP 보안을 구성하는 메서드들을 오버라이드한다.
spring-boot-starter-security 라이브러리를 사용하면 웹 보안 설정이 자동으로 활성화되니 애너테이션을 생략할 수 있다.
기본 설정보다 더 세밀하게 설정해야 하는 경우 명시적으로 추가하기도 한다.
@EnableMethodSecurity
메서드 레벨에 적용되는 보안을 활성화한다.
@PreAuthorize @PostAuthorize @PreFilter @PostFilter 애너테이션을 활성화한다.
다음에 나오는 애너테이션에 의해 대체됐다.
@EnableGlobalMethhod
전역 메서드 보안을 활성화한다.
starter 라이브러리를 사용해도 자동으로 활성화되지 않으니 메서드 레벨에 보안을 적용하려면 명시적으로 추가해야 한다.
prePostsEnabled, securedEnabled, jsr250Enabled 속성을 가진다.
'Spring > Spring Security' 카테고리의 다른 글
[Spring Security6] 인증 서버 구축 (0) | 2023.08.15 |
---|---|
[Spring Security6] OAuth2와 OpenID Connect (0) | 2023.08.13 |
[Spring Security6] Json Web Token (0) | 2023.08.11 |
[Spring Security6] Authorization과 Filter (0) | 2023.08.09 |
[Spring Security6] CORS, CSRF (0) | 2023.08.08 |
댓글
이 글 공유하기
다른 글
-
[Spring Security6] 인증 서버 구축
[Spring Security6] 인증 서버 구축
2023.08.15 -
[Spring Security6] OAuth2와 OpenID Connect
[Spring Security6] OAuth2와 OpenID Connect
2023.08.13 -
[Spring Security6] Json Web Token
[Spring Security6] Json Web Token
2023.08.11 -
[Spring Security6] Authorization과 Filter
[Spring Security6] Authorization과 Filter
2023.08.09