![[Spring Security] @Secured,@PreAuthorize, @PostAuthorize](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FcZF5DR%2FbtsPnyfxUrB%2FAAAAAAAAAAAAAAAAAAAAAJ0pptjz_luP9knd74W15XaSo2Cmvhh_FbT0Og71KxK5%2Fimg.jpg%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DY6hJP0kTD6TYABhCstKvX7I2xs8%253D)
[Spring Security] @Secured,@PreAuthorize, @PostAuthorizeBack-End/Spring2025. 7. 18. 00:32
Table of Contents
@Secured,@PreAuthorize, @PostAuthorize
활성화 설정
@Configuration
@EnableWebSecurity // 스프링 시큐리티 필터가 스프링 필터체인에 등록
@EnableMethodSecurity(securedEnabled = true, prePostEnabled = true) // 중요
public class SecurityConfig {
@EnableMethodSecurity(securedEnabled = true, prePostEnabled = true)
SecurityConfig 파일에 해당 애노테이션을 적용해야 @Secured,@PreAuthorize, @PostAuthorize 이 애노테이션들을 사용할 수 있다.
@PreAuthorize만 사용할꺼면 @EnableMethodSecurity 만 붙혀도 상관없다.
@Secured
- 특정 권한이 있는 사용자에게만 접근을 허용하도록 함
@Secured("ROLE_ADMIN") // 권한이 ADMIN인 사용자만 접근 허용
@GetMapping("/info")
public @ResponseBody String info() {
return "개인정보";
}
@PreAuthorize, @PostAuthorize
- @PreAuthorize: 메서드가 실행되기 전에 인증을 거친다.
- @PostAuthorize: 메서드가 실행되고 나서 응답을 보내기 전에 인증을 거친다.
@Secured와 차이점
- @Secured는 SpEL(pring Expression Language)표현식 사용할 수 없다.
- @PreAuthroize, @PostAuthorize는 SpEL 표현식 사용을 사용하여 디테일한 설정이 가능하다.
Remember-Me(자동 로그인)는 사용자가 로그인 후 브라우저를 닫아도 다시 로그인하지 않고 자동으로 로그인 상태를 유지할 수 있게 해주는 기능이다.
authentication.name: 로그인된 사용자 ID 또는 username
authentication.credentials: 인증 시 사용한 비밀번호 등 자격 증명
authentication.details: 인증 요청 관련 정보
authentication.authorities: 권한 목록 (GrantedAuthority)
hasRole('ROLE_ADMIN'): ADMIN 권한을 가졌는지
hasAnyRole('ROLE_ADMIN', 'ROLE_USER'): 둘 중 하나라도 권한이 있는지
hasAuthority('SCOPE_read'): 특정 권한이 있는지
hasAnyAuthority('SCOPE_read', 'SCOPE_write'): 여러 권한 중 하나라도 있는지
isAnonymous(): 익명 사용자 여부
isAuthenticated(): 인증된 사용자 여부(일반 로그인, Remember-Me)
isRememberMe(): remember-me 인증인지
isFullyAuthenticated(): 완전히 인증된 사용자 (remember-me 제외)
@PreAuthorize
사용 예시
@PreAuthorize("#contact.name == authentication.name") //#은 파라미터를 참조할 때 사용하는 접두사
public void doSomething(Contact contact);
doSomething(Contact contact) 메서드가 실행되기 전에, contact.name 값이 현재 로그인한 사용자의 이름(authentication.name)과 같을 때만 접근을 허용한다는 의미
contact.name과 authentication.name 일치하지 않는다면 AccessDeniedException가 발생한다.
@PostAuthorize
사용 예시
@PostAuthorize("isAuthenticated() and (( returnObject.name == principal.name ) or hasRole('ROLE_ADMIN'))")
public void doSomething();
- isAuthenticated()
현재 사용자가 인증된 사용자(= 로그인된 사용자)인지를 검사한다.
익명 사용자는 false, 로그인한 사용자는 true. - returnObject.name == principal.name
메서드가 반환한 객체의 name 필드가 현재 로그인된 사용자의 name과 같은지를 비교한다.
여기서 returnObject는 해당 메서드의 리턴값이며, principal은 현재 인증된 사용자 객체이다. - hasRole('ROLE_ADMIN')
현재 사용자가 ROLE_ADMIN 권한(역할)을 가지고 있는지를 검사한다. - 전체 조건
인증된 사용자이면서, (반환된 객체의 name이 자신의 이름과 같거나, 관리자인 경우)에만 접근 허용한다.
간단한 인가에 대한 처리의 경우는 @Secure 를 사용하고, 복잡한 인가에 대한 처리는 @Pre/PostAuthorize 를 사용하는 것이 좋다.
- @Secured: 단순히 역할만 검사하고, 파라미터 기반 조건을 못 쓰므로 실무에서 거의 사용되지 않는다고 한다. 그리고 더 좋은 대체제가 있다.(authorizeHttpRequests)
- @PostAuthorize: 반환값이 특정 조건을 만족해야 할 때만 사용되며,잘못 사용하면 불필요한 DB 접근 후 차단되므로 비효율적이다.
- @PreAuthorize: SpEL 지원으로 사용자 ID, 파라미터 값, 권한 등 다양한 조건을 적용할 수 있기 때문에 실제 서비스 로직 보호에 적합하다.
출처 : https://velog.io/@joon6093/SecuredPreAuthorize-PostAuthorize
'Back-End > Spring' 카테고리의 다른 글
[Spring] CQRS 패턴 (0) | 2025.06.07 |
---|---|
[Spring Boot 핵심원리와 활용] 사용자 정의 메트릭 (0) | 2025.05.11 |
[Spring Boot 핵심원리와 활용] 마이크로미터, 프로메테우스, 그라파나 (0) | 2025.05.10 |
[Spring Boot 핵심원리와 활용] 액츄에이터(Actuator) (0) | 2025.05.09 |
[Spring Boot 핵심 원리와 활용] 외부 설정 (0) | 2025.05.03 |