web/SpringBoot
@Secured vs @PreAuthorize, @PostAuthorize
뽀리님
2024. 4. 1. 16:40
서비스를 운영하며 추가로 고도화해야하는 부분에서 잠깐 Sping에서 권한에 대한 어노테이션 정리를 해보고자 한다.
일단 @Secured , @PreAuthorize, @PostAuthorize 이 3개는 다 권한에 대한 어노테이션 이지만 각각의 차이가 있다.
1. 활성화 설정
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
일단 SecurityConfig 파일에 @EnableMethodSecurity(securedEnabled = true, prePostEnabled = true) 와 같이 설정해 주어야지 어노테이션들을 사용할 수 있다.
2. @Secured
@Secured("ROLE_ADMIN")
@GetMapping("/info")
public @ResponseBody String info() {
return "개인정보";
}
자신이 권한을 검사해주고 싶은 곳에 @Secured 애노테이션을 붙여주면, 애노테이션에 인자로 받은 권한이 유저에게 있을 때만 실행하도록 할 수 있다.
3. @PreAuthorize, @PostAuthorize
먼저, 두 메서드의 차이는 아래와 같다.
- @PreAuthorize: 메서드가 실행되기 전에 인증을 거친다.
- @PostAuthorize: 메서드가 실행되고 나서 응답을 보내기 전에 인증을 거친다.
그럼 @Secured()도 비슷한 것 같은데 무슨 차이가 있는지 궁금해 할 것이다. 차이점은 아래와 같다.
✓ @Secured는 표현식 사용할 수 없다.
✓ @PreAuthroize, @PostAuthorize는 표현식 사용을 사용하여 디테일한 설정이 가능하다.
- hasRole([role]) : 현재 사용자의 권한이 파라미터의 권한과 동일한 경우 true
- hasAnyRole([role1,role2]) : 현재 사용자의 권한디 파라미터의 권한 중 일치하는 것이 있는 경우 true
- principal : 사용자를 증명하는 주요객체(User)를 직접 접근할 수 있다.
- authentication : SecurityContext에 있는 authentication 객체에 접근 할 수 있다.
- permitAll : 모든 접근 허용
- denyAll : 모든 접근 비허용
- isAnonymous() : 현재 사용자가 익명(비로그인)인 상태인 경우 true
- isRememberMe() : 현재 사용자가 RememberMe 사용자라면 true
- isAuthenticated() : 현재 사용자가 익명이 아니라면 (로그인 상태라면) true
- isFullyAuthenticated() : 현재 사용자가 익명이거나 RememberMe 사용자가 아니라면 true
4. @PostAuthorize는 returnObject 예약어로 메서드의 리턴 객체에 접근할수 있다.
@PostAuthorize("isAuthenticated() and (( returnObject.name == principal.name ) or hasRole('ROLE_ADMIN'))")
@RequestMapping( value = "/{seq}", method = RequestMethod.GET )
public User getuser( @PathVariable("seq") long seq ){
return userService.findOne(seq);
}
5. @PreAuthorize는 파라미터에 접근하기 위해 '#파라미터명'을 사용하여 객체에 접근할수 있다.
@PreAuthorize("#contact.name == authentication.name")
public void doSomething(Contact contact);
참조
https://velog.io/@joon6093/SecuredPreAuthorize-PostAuthorize