Spring Security @Secured, @PreAuthorize, @PostAuthorize Annotation이 동작하지 않을 때
요즘 장학도사라는 사이트를 만들고 있다.
이 사이트 광고를 좀 하자면 국내의 장학재단들이 있고 장학재단들이 갖고 있는 장학금의 종류가 무려 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 스프링 시큐리티 관련 내용은 조금 더 정리되고 난 뒤에 진행하겠다. 이건 머 거의 책 쓰는 수준으로 내용이 많아서 공부하고 정리할게 많아서...