Spring Security의 메소드 수준의 API 권한 관리
API 경로에 권한을 적용하여 관리하다 보면, 같은 기능을 여러 권한에서 사용할 수 있게 중복으로 코드를 작성하는 문제가 발생합니다. 예를 들면 사용자가 주문정보를 조회하는 것과 어드민이 한 사용자의 게임을 조회하는 것 등이 있습니다. API 경로에 대해 권한을 관리하는 것이 아닌 메소드 수준에서 권한을 설정하는 방법을 알아봅니다.
@Secured와 @PreAuthorize 어노테이션
두 어노테이션 모두 Spring Security의 어노테이션으로, 메소드 수준의 보안을 제공하는 데 사용됩니다. 동일한 기능을 제공하지만 약간의 차이가 있습니다.
@PreAuthroize는 Spring EL(표현식)을 사용할 수 있고, AND나 OR 같은 표현식을 사용할 수 있습니다.
// ROLE_USER와 ROLE_ADMIN 두 개의 권한을 가져야 접근 가능
@PreAuthorize("hasRole('ROLE_USER') and hasRole('ROLE_ADMIN')")
@Secured는 표현식을 사용할 수 없고 OR 문만 표현할 수 있습니다.
// ROLE_USER 또는 ROLE_ADMIN 중 하나의 권한을 가지고 있다면 접근 가능
@Secured({"ROLE_USER", "ROLE_ADMIN"})
프로젝트 적용
/**
* MethodSecurityConfig.class
*/
@Configuration
@EnableGlobalMethodSecurity(
prePostEnabled = true,
securedEnabled = true,
jsr250Enabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
}
메소드 수준의 보안 설정은 기본적으로 비활성화 되어 있기 때문에 전역 설정 클래스를 작성해서 원하는 속성을 활성화시킵니다.
GlobalMethodSecurity 사용을 활성화 하는 @EnableGlobalMethodSecurity 어노테이션을 추가
- prePostEnabled - Spring Security의 @PreAuthorize, @PreFilter /@PostAuthorize, @PostFilter어노테이션 활성화 여부
- securedEnabled - @Secured어노테이션 활성화 여부
- jsr250Enabled - @RoleAllowed 어노테이션 사용 활성화 여부
메소드에 권한 적용하기
@Secured({UserRole.ROLES.ADMIN})
또는
@PreAuthorize("hasRole('" + UserRole.ROLES.ADMIN + "')")
////////////////////////
// enum 클래스에 정의
public static class ROLES {
public static final String USER = "ROLE_USER";
public static final String ADMIN = "ROLE_ADMIN";
}
적용하려는 메소드에 어노테이션을 작성해주면 권한이 적용됩니다.
728x90
'# Back-End > Spring' 카테고리의 다른 글
[Spring] 인텔리 J에 환경변수, VMware Option 설정 (0) | 2022.03.19 |
---|---|
@ControllerAdvice를 이용한 예외처리 (2) | 2022.01.24 |
@Vaild를 이용한 Validation 검증 (0) | 2022.01.24 |
Role Enum 클래스를 이용한 인가 (0) | 2022.01.23 |
Spring Security란? (0) | 2022.01.23 |
JWT란? (0) | 2022.01.23 |
인증 방식 비교(서버 기반 인증, 토큰 기반 인증) (0) | 2022.01.23 |