Spring Security @Secured, @PreAuthorize, @PostAuthorize Annotation이 동작하지 않을 때

in kr-dev •  7 years ago 

요즘 장학도사라는 사이트를 만들고 있다.

이 사이트 광고를 좀 하자면 국내의 장학재단들이 있고 장학재단들이 갖고 있는 장학금의 종류가 무려 2천여개던가? 그렇단다.

그래서 "(주) 꿈꾸는 세상" 대표랑 둘이서 등록금때문에 힘들어서 학업을 포기하려고 하는 학생들이나 생활이 힘들어 학업을 더이상 진행할 수 없는 학생들을 위해서 꿍짝꿍짝하면서 만들고 있다. 사실 몇년 전에 한번 만들었는데 지금 기술과 노하우와 여러가지 기능들을 더해 조금 더 좋은 서비스를 하기위해 올 2월 중순에 오픈할 예정으로 새로 만드는 중이다.(그런데 여러가지 문제로 인해 계속 작업중인.... ㅠㅠ)

이 사이트를 만들던 도중 Spring Security를 적용해 인증처리를 하려고 하는데 문제가 발생했다. @Secured 어노테이션과 @PreAuthorize, @PostAuthorize 어노테이션이 동작하질 않는 거다. 완전 난처한 상황이 벌어졌다.

그래서 검색을 좀 해보고 여기저기 기웃기웃거려보고 책도 좀 뒤져보고 해서 알아낸 내용은 아래와 같다.

Spring Security의 설정은 Spring boot를 사용할 경우 WebSecurityConfigurerAdapter를 확장해서 만든다. 일반적으로 과거에 사용했던 Spring Framework 를 이용한 구성에서는 xml 파일을 통해 설정을 했었는데 Spring boot에서는 Config 클래스를 만들어서 설정한다.

(뭐 다른 방법이 있을지도 모르지만 내 공부가 아직 부족하여.... ㅠ)

이때 기본 설정내용이 위에서 이야기했던 어노테이션의 사용설정은 죄다 false로 설정되어있다는 사실이었다. 그래서 각 경로에 따른 접근권한 설정은 기본적으로 HttpSecurity에 있는 authorizeRequests() 메서드를 통해서만 동작하도록 되어있다.

왜 이런방식으로 만들어진 것일까 하고 스프링 시큐리티 프로젝트 문서사이트를 확인해보니 이 어노테이션 기반 글로벌 시큐리티 설정이 Spring Security 2.0 버전 이후부터 적용이 가능하다고 나와있어서 그 이전 버전을 사용하는 프로젝트와 충돌을 일으키는 것을 방지하기 위함이었다고 생각했다.

사실 어노테이션을 사용하는 방법과 authorizeRequest() 메서드를 이용한 보안 적용방식은 각자의 장단점이 있다.

어노테이션을 사용하는 경우 장점

  • 가독성이 좋아진다.(주관적인 견해)
  • 사용하기 쉽다.(주관적인 견해)

어노테이션을 사용하는 경우 단점

  • 관리 포인트가 겁나 많아진다.(한 곳에서 관리가 안된다)
  • authorizeRequest메서드를 사용하는 경우 장점
  • 관리 포인트가 하나라서 config 클래스만 열면 전체 접근권한을 컨트롤 할 수 있다.

authorizeRequest메서드를 사용하는 경우 단점

  • 가독성이 썩 좋지 않다.(주관적인 견해)
  • 사용하기도 좀 까다롭다.(물론 익숙해지면 이게 더 쉬울 수도 있지만..)

일단 어노테이션을 사용하기 위해서 어떻게 코딩을 하면 되는지 샘플을 보여주자면...

@Configuration
@ComponentScan(basePackages = "your.package.path")
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    ....
}

위의 코드에서 @EnableGlobalMethodSecurity 어노테이션의 속성으로 securedEnabled 를 true로 지정해주면 @Secured 어노테이션을, prePostEnabled를 true로 지정해주면 @PreAuthorize@PostAuthorize를 사용할 수 있게 해준다.

p.s 스프링 시큐리티 관련 내용은 조금 더 정리되고 난 뒤에 진행하겠다. 이건 머 거의 책 쓰는 수준으로 내용이 많아서 공부하고 정리할게 많아서...

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!