권한 설정이 무엇일까? 바로 우리가 시큐리티를 하게 되면 가장 고민하고 설정을 깔끔하게 해야할 부분이다
권한 설정은 방식이 설정되어 있는데 이는 두가지로 나뉜다.
- 선언적 방식
URL 을 통한 선언적 방식
http.requestMatcher("/user/**").hasRole("USER")
Method 를 통한 선언적 방식
@PreAuthorize("hasRole('USER')")
public void user() {
System.out.println("user")
}
- 동적 방식 - DB 연동 프로그래밍
- URL
- Method
이런식으로 나뉜다. 각 페이지는 사용할수 있는 권한들이 있고 이는 사용자가 설정해주어야 한다. 그러면 훨씬 많은 페이지를 보다 간편하게 다룰수 있는것이다.
코드를 보면 이런식으로 설정이 되어있다.
우리가 경로를 설정 해줄때 아주 중요한것이 있는데 구체적인 경로가 가장 먼저 오게되고 그것보다 큰 범위의 경로가 뒤에 오도록해야한다.
시큐리티는 우리가 설정한 URI 를 위에서부터 아래로 읽어가면서 인가 처리를 도와주는데 도중 어딘가에 걸린다면 그 밑에 모든 URI 가 모두 실행되지않는다.
그래서 우리는 각자의 권한 그리고 해당 권한이 들어갈수 있는 페이지를 잘 설정해주어야한다. 반대로 기억할수 있다 세부적인것이 위로! 더욱 큰 범위가 될수록 아래로! *이 붙으면 왠만하면 내려보자
requestMatcher를 보면 무언가 메소드가 또 있는데 여러가지가 있다 각자의 능력이 무엇인지 알아보자
메소드 | 동작 |
authenticated() | 인증된 사용자의 접근을 허용 |
fullyAuthenticated() | 인증된 사용자의 접근은 허용하지만 rememberMe 인증은 제외한다 |
permitAll() | 무조건 모든 접근을 허용한다 |
denyAll() | 무조건 모든 접근을 허용하지 않는다 |
anonymous() | 익명 사용자의 접근을 허용한다 ※ 여긴 익명의 사용자 만!!! 들어올수 있다 다른 역할은 그 누구도 들어올수 없다 |
rememberMe() | 기억하기를 통해 인증된 사용자의 접근을 허용한다 |
access(String) | 주어진 SpEL 표현식의 평가 경과가 true 이면 접근을 허용한다 |
hasRole(String) | 사용자가 주어진 역할이 있다면 접근을 허용한다 |
hasAuthority(String) | 사용자가 주어진 권한이 있다면 접근을 허용한다. |
hasAnyRole(String...) | 사용자가 주어진 권한중 어떤 권한이라도 접근을 허용한다 |
hasAnyAuthority(String...) | 사용자가 주어진 권한 중 어떤 것이라도 있다면 접근을 허용한다 |
haslpAddress(String) | 주어진 IP로부터 요청이 왔다면 접근을 허용한다 |
정리
권한 설정은 시큐리티를 처음하는 사람도 많이 만나고 고민하게 되는 것이다. 이 설정을 어떻게 하느냐에 따라 화면에 표현하고자 하는 페이지 설정을 더 자유롭게(?) 할 수 있다 앞으로 만들 많은 페이지들을 설정할때는 어느 누가 어디까지 들어갔으면 좋겠다 라는것을 잘 생각해서 만들어야 한다. 그리고 다양한 메소드로 더욱 다양한 역할, 권한에 따른 페이지 설정이 있다. 막상 보면 복잡하고 힘들지만 만들어본다면 굉장히 재밌다.
여기서 중요한것이 있는데 나는 JWT 필터를 생성하는 과정에서 토큰을 검증하는 필터를 상당히 앞단에 위치시켜놓는다. 때문에 모든 URI 가 필터를 거치며 권한 설정을 하는곳까지 도달하지 못하면서 에러가 생겼었다. 이는 내가 List 형태로 URI를 통과하게 만드는 방법을 선택했다 좀 더 좋은 방법이 있지않을까? 고민해봐야겠다.
권한 정보를 설정하는 방법은 FilterInvocationMetadataSource 와 연관이 있다. 이에 대해서 꼭 다시 만들어 보도록 하겠다
'Spring > 👨💻 SpringSecurity' 카테고리의 다른 글
UsernamePasswordAuthenticationFilter ( feat. FormLogin ) (0) | 2023.06.27 |
---|---|
ExceptionTranslationFilter 와 RequestCacheAwareFilter (0) | 2023.06.26 |
AnonymousAuthenticationFilter (0) | 2023.06.26 |
RememberMeAuthenticationFilter (0) | 2023.06.26 |
CuncurrentSesseionFilter (0) | 2023.06.26 |