@EnableGlobalMethodSecurity
애노테이션이란?
- 메서드 레벨에서 보안을 추가할 수 있는 애노테이션이다.
- 역할, 권한 혹은 기타 속성 기반으로 개별 메서드를 보호하는데 유용하다.
- 현시점 (2023년 7월 기준) 의 최신 애노테이션은 @EnableMethodSecurity 애노테이션이다.
- 둘은 이름이 엄청 비슷한데 다른 애노테이션이므로 주의해야 한다. 공식 문서의 마이그레이션 가이드를 보고 최신으로 마이그레이션을 진행해도 된다.
사용 방법
1. 애노테이션 활성화하기
@Configuration
클래스에@EnableGlobalMethodSecurity
애노테이션을 추가한다.
2. Security Model 선택하기
@EnableGlobalMethodSecurity
애노테이션은 몇가지 속성을 제공한다. 필요한 것을 활성화하여 사용할 수 있다.
@EnableGlobalMethodSecurity(
prePostEnabled = true,
jsr250Enabled = true,
securedEnabled = true
)
prePostEnabled
:@PreAuthorize
혹은@PostAuthorize
애노테이션을 활성화한다.jsr250Enabled
: JSR-250 애노테이션들을 활성화한다. ex)@RolesAllowed
securedEnabled
:@Secured
애노테이션을 활성화한다.
3. @PreAuthorize
와 @PostAuthorize
애노테이션 사용하기
@PreAuthorize
: 메서드가 실행되기 전에 충족해야 할 조건을 정의한다.- 특정 권한이 있는 유저 등으로 한정할 수 있다.
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
}
@Service
public class MyService {
@PreAuthorize("hasRole('ADMIN')")
public void adminMethod() {
// Code here will only be executed if the user has the ADMIN role
}
}
@PostAuthorize
: 메서드가 실행된 이후에 충족해야 할 조건을 정의한다.- 반환 값에 따른 보안을 적용할 때 유용하다.
- 아래의 예제는 ID 로는 아직 name 을 모르기 때문에 username 이 일치하거나 ADMIN 이라는 역할일 때만 올바르게 반환하는 예이다.
- 권한이 부족하면 반환된 정보에 접근할 수 없다.
- 모범적인 사례는 아니지만 그냥 예시이다.
@Service
public class UserService {
@PostAuthorize("returnObject.username == authentication.name or hasRole('ROLE_ADMIN')")
public User getUserDetails(Long userId) {
// Retrieve the user details by userId
User user = userRepository.findById(userId);
return user;
}
}
4. @Secured
애노테이션 사용하기
@PreAuthorize
혹은@PostAuthorize
와 같이 굳이 복잡한 SpEL 필요 없이 단순히 ROLE 기반으로 접근을 제어할 때 유용하다.
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
}
@Service
public class MyService {
@Secured("ROLE_ADMIN")
public void adminMethod() {
// Code here will only be executed if the user has the ADMIN role
}
}
5. @RolesAllowed
애노테이션 사용하기
- 별로 쓸 일은 없지만, Java EE 표준 준수를 강조하는 환경에서 작업하는 경우 유용하다.
@Service
public class MyService {
@RolesAllowed("ROLE_ADMIN")
public void adminOnlyMethod() {
// This method can only be accessed by users with the ADMIN role
}
}
반응형
'프레임워크 > 스프링 프레임워크' 카테고리의 다른 글
@DataJpaTest 애노테이션이란? (0) | 2023.08.03 |
---|---|
Spring Boot Configuration Processor 란? (0) | 2023.08.02 |
@EnableWebSecurity 애노테이션이란? (0) | 2023.07.31 |
@EnableWebMvc 애노테이션이란? (0) | 2023.07.31 |
스프링 WebMvcConfigurer 인터페이스란? (0) | 2023.07.31 |