스프링시큐리티를 사용해서 특정URI에 접근을 차단하는 부분 질문드립니다.

2018-01-08 00:37

안녕하세요. 스프링시큐리티를 사용해서 특정URI에 접근을 차단하는 부분을 구현 중에 헷갈리는 부분이있어 질문드립니다.

우선 프로젝트에서 커스텀한 FilterSecurityInterceptor를 사용하고 있습니다.

만약 이럴경우 SecurityConfig 파일에서 아래와 같이 URI 제한을 걸더라도 테스트를해보니

    http
            .csrf().disable()
            .authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")

무시되고(=ADMIN권한이 없더라도 통과) FilterChain상 마지막에 있는 FilterSecurityInterceptor에 설정된 AccessDecisionManager에 의해서 통과 시킬지 말지가 결정되고 있었습니다.

[질문]

Q> 그럼 이럴경우에는 SecurityConfig에서 URI 제한은 무용지물이 되고있는데 굳이 설정안해줘도 되는건가요? 아니면 혹시 모르니 그래도 제한을 걸어주는것이 맞는 걸까요?

Q> 굳이 SecurityConfig에서 URI제한을 안하더라도 찾아보니 @Secured 또는 @PreAuthorize어노테이션을 컨트롤러 메소드에 붙여 해당 URI 제한을 걸수가 있던데, SecurityConfig에서 제한을 거는경우와 어노테이션을 이용해서 제한을 거는 경우의 특별한 차이점이 있을까요?

만약 차이점이 없다면 기능 추가시(=URI추가시) SecurityConfig에서 URI 제한을 일일히 다 설정해주는것보다 어노테이션 방식으로 해당 메소드위에 어노테이션을 붙여주는게 훨씬 효율적일것 같아 질문드립니다.

또한 프로젝트에서는 URI별로 접근을 할지 말지를 AccessDecisionManager에서 해주고있는데, 일단 모두 통과시켜주고 메소드위에 어노티이션(@Secured)을 붙여서 URI별로 접근 제한거는 것이 더 좋은 방법이지 않을까란 생각이 드는데 조언 부탁드리겠습니다.

-> 즉 복잡하게 스프링 시큐리티쪽에서(SecurityConfig 또는 FilterInvocationSecurityMetadataSource) URI제한을 걸지말고 만능약인 @Secured 또는 @PreAuthorize를 컨트롤러 메소드위에 붙여 URI제한을 하는게 미래에 기능이 추가되더라도 다른곳에 수정없이 간단히 어노테이션만 붙이면 되므로 심플하지 않을까란 생각이 들어서 질문드립니다.

그럼 오늘 하루도 좋은 하루되세요~ 감사합니다.

1개의 의견 from SLiPP

2018-01-18 09:07
  1. URI 차단이 적용되지 않는 것은 비정상적인 케이스입니다. 원인이 여러가지일 수 있어서 저 부분만으로는 정확한 원인을 파악하긴 어렵습니다만.. hasRole("ROLE_ADMIN") 으로 바꿔보세요.(종종 나오는 부분입니다.) 기본적으로 "ROLE_" 을 default prefix로 사용합니다. 추가적인 확장이 없었다면..제일 간단한 원인중 하나로 지목할 수 있을 것 같습니다.

  2. 적용여부만을 생각하면, Security Config에서 관리하는 부분이나, Method별로 사용하는 부분이나 동일합니다. 다만 Method Level에서 적용하면 조금 더 디테일한 부분까지도 적용 가능합니다. (실제 Production 상에서.. role name만으로 권한을 모두 제어하기는 어렵습니다.) Spring Security의 권한 부분을 확장한다면, @PreAuthorize("hasAuth('ROLE_NAME', 'READ_WRITE'") 와 같은 복합적인 권한 체크도 가능합니다.(어디까지나 기초적인 확장입니다만...) ※ hasAuth는 제가 임의로 정의한 Experession입니다.

의견 추가하기

연관태그

← 목록으로