본문 바로가기

내일배움캠프/Today I Learned

[TIL] 나의 서른 아홉번째 회고록

Today Error


팀 프로젝트 마무리 단계에서 

로그인 체크, 권한 설정을 좀 더 편하게 할 수 있는 방법이 없을까?라는 의문이 들었다.

분명 Spring에서 제공하는 도구가 있을 것이야..! 

 

그러던 중 같은 클래스의 동기가

@PreAuthorize 을 말하는 것을 얼핏! 듣게되었다. 

어..?뭐지 저건? 싶어서 얼른 검색해서 알아보았다. 

 

역시나

Spring Security에서 Annotation 형태로

Class, Method 레벨 단위로 권한별 접근제어 기능을 제공한다는 것!! 

그의 예시로 

@Secured, @PostAuthorize, @PreAuthorize 

이렇게 세가지의 Annotation을 통해 계정 접근을 편하게 만들어준다고 한다. 

 

해당 Annotation들의 자세한 내용은 아래에서 자세하게

정리 해놓도록 하겠다.

 

1일 1개념


API를 만들다보면 어떤 조건에 부합하는 사용자만 접근을 할 수 있도록 제한을 둬야만 할 때가 있다.

예를들어, 관리자만 접근할 수 있는 API, 본인만 접근 할 수 있는 API 등등

까다롭고 복잡한 조건을 걸어서 접근을 제한하고 싶은 API가 있다면 어떻게 처리해야 할까?

 

 Spring Security를 사용하여 인증를 구현했다면

Spring Security는 ROLE 기반의 권한처리가 기본

 

@Secured 

어노테이션을 이용하면 사용자의 권한정보에 따라 자동으로 해당 메서드의 접근을 제한할 수 있게 된다. 

@Secured("ROLE_ADMIN")
@RequestMapping( value = "/my/api/address", method = RequestMethod.GET )
public String somthingMethod( HttpServletRequest request, HttpServletResponse response ){
    return "Hello, World!";
}

@PostAuthorize 

어노테이션은 함수를 실행하고 클라이언트한테 응답을 하기 직전에 권한을 검사하는 어노테이션이다.

@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);
}

@PreAuthorize 

어노테이션은 요청이 들어와 함수를 실행하기 전에 권한을 검사하는 어노테이션이다.

@PreAuthorize("isAuthenticated() and (( #user.name == principal.name ) or hasRole('ROLE_ADMIN'))") @RequestMapping( value = "", method = RequestMethod.PUT) 
public ResponseEntity<Message> updateUser( User user ){ 
    userService.updateUser( user ); 
    return new ResponseEntity<Message>( new Message(), HttpStatus.OK ); 
}

출처 : https://steemit.com/kr-dev/@igna84/spring-security-preauthorize-postauthorize

 

Spring Security @PreAuthorize, @PostAuthorize 를 사용하는 신박한 전처리 후처리 기법 — Steemit

요즘은 처음에 시작했던 시리즈는 만들지 않고 짧은 코딩들이나 팁을 계속 올리고 있는데 이것은 시리즈를 만들기 위해 잠깐 숨고르기를 하고 있는 중이기 때문이라고 믿어주길 바란다는 서문

steemit.com