본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
안녕하세요 :)
오늘은 챌린지 26일차로, 새벽에 잠이 안 와서 오랜만에 새벽 공부를 하게 되었습니다...
오늘 배울 내용은,
Part B. 스프링 시큐리티 심화
Ch 1. 액세스 제한과 권한
"01. 권한과 역할에 따른 접근 제한 - 1" 입니다.

Part A 에서는 인증 과정을 통해 요청을 보낸 사용자가 접근 권한이 있는지 없는지를 검증하는 과정에 대해 알아봤었다.
만약 접근 권한이 존재하여 로그인을 허용한 다음은 어떤 처리가 가능할까? 특정 메뉴에 접근이 가능한가? 특정 기능을 사용할 수 있는가? 생각해볼 수 있다.
그래서 이번에는 권한 부여 (Authorization)에 대해 알아본다. 인증된 사용자가 요청된 리소스(예: 특정 메뉴에 대한 접근 요청)에 액세스할 권한이 있는지 시스템이 결정하는 프로세스로, 이 과정은 항상 인증 이후에 수행되어야 한다.
스프링 시큐리티 관점에서 본다면, 애플리케이션은 인증 흐름을 완료한 후 요청을 권한 부여 필터에 위임한다. 필터는 구성된 권한 부여 규칙에 따라 요청을 허용하거나 거부할 수 있다.
GrantedAuthority 를 활용하여 권한 부여 기능을 적용할 수 있다. 사용자마다 다른 권한을 가지게 되며, 권한에 따라 특정 작업만 수행할 수 있다.
사용자, 권한, 기능은 서로 엮여 있다. GrantedAuthority 뿐만 아니라 UserDetails 등도 다 함께 연결되어 있다.
사용자는 하나 이상의 권한을 가질 수 있고, UserDetailsService 는 사용자에 대한 정보를 취득할 수 있다. 인증된 사용자(UserDetails) 는 하나 이상의 GrantedAuthority를 가질 수 있다.
스프링 시큐리티에서 제공하는 아래 메소드를 활용해보자
- hasAuthority()
- hasAnyAuthority()
- access()
각 메소드에 대한 간단한 설명은 다음과 같다.
hasAuthority() : 제한을 구성하는 하나의 권한을 파라미터로 전달받고, 해당 권한이 있는 사용자는 엔드포인트로 접근할 수 있다.
hasAnyAuthority0 : 제한을 구성하는 하나 이상의 권한을 파라미터로 전달받을 수 있다. (주어진 권한 중 하나라도 있을 때, 허용)
access().* SpringSecurity 5 버전까지 유효하다. 정규표현식처럼 스프링에서도 비숫한 표현식을 제공하며(SpEL, Spring Expression Language), 이를 활용해서 권한 부여 규칙을 정의할 수 있다. 자율성을 극대화되어 장점도 존재하지만 가독성이 떨어지고 디버깅이 어려운 단점이 있다. access().* SpringSecurity 6 버전 이후는, Custom 한 AuthorizationManager 를 만들어 활용한다는 것을 알 수 있었다.