이전 글에서 Spring Security 의 Authentication (인증) 에 대해 알아보았다.
요번 글에서는 Authorization (인가) 에 대해 작성하도록 하겠다.
위 사진에서 볼 때, 인증을 마친 후 , 인가를 진행하고, 각 회원의 ROLE_*; 값에 따라 접근할 수 있는 영역이 달라지는 것을 확인할 수 있다.
1. 사용자가 자원 접근 (Request)
2. FilterSecurityInterceptor 에서 요청을 받아서 인증여부 확인
a. 인증객체를 가지고 있는지 확인
b. 인증객체가 없으면 null AuthenticationException 발생
c. Excetpion TranslationFilter 에서 해당 예외를 받아 로그인 페이지 이동
or 알아서 후처리 해준다.
3. 인증객체가 있을 경우, SecurityMetadataSource는 자원에 접근하기 위해 설정된
권한정보를 조회해서 전달해준다.
a. 권한 정보를 조회한다.
b. 권한 정보가 없으면 null 권한 심사를 하지 않고 자원 접근 허용
4. 권한 정보가 있을 경우 AccessDecisionManager에게 권한 정보를
전달하여 위임한다.
-> AccessDecisionManager는 최종 심의 결정자다.
5. AccessDecisionManger 가 내부적으로 AccessDecisionVoter(심의자)를
통해서 심의 요청을 한다.
6. 반환된 승인/거부 결과를 가지고 사용자가 해당 자원에 접근 가능한지 판단.
a. 접근이 거부되었을 경우 AccessDeniedException이 발생한다
b. Exception TranslationFilter에서 해당 예외를 받아서 다시 후처리
7. 접근이 승인되었을 경우 자원 접근 허용
-> 접근결정의 세가지 유형 ::구현체
AccessDecisionVoter
- 판단을 심사하는 것 (위원)
- 각각의 Voter 마다 사용자의 요청마다 해당 자원에 접근할 권한이 있는지 판단 후, AccessDecisionMager 에게 반환하는 역할
Voter가 권한 부여 과정에서 판단하는 자료 - 아래 정보를 전달받아 판단.
-> 결정 방식 - AccessDecisionMager은 반환 받은 결정 방식을 사용해서 후처리를 한다.
1. FilterSecurityInterceptor 가 AccessDecisionManger 에 인가 처리 위임
2. AccessDecisionManger 는 자신이 가지고 있는 Voter 들에게 정보 Decide
(authentication, Object, ConfigAttributes)를 전달
3. Voter 들은 정보들을 가지고 권한 판단을 심사한다.
4. 승인 거부,보류 결정방식을 반환하면 AccessDecisionManager에서는 반환받은
결정 방식을 가지고 후처리를 진행한다.
A. 승인 : FilterSecurityIntercepteor에 승인여부 반환
B. 거부 : AccessDeniedException 예외를 ExceptionTranslationFilter로 전달
정말 세세하게 잘 정리되어 있다.
https://catsbi.oopy.io/f9b0d83c-4775-47da-9c81-2261851fe0d0
(정말 정리 잘되있다.. 참고해서 직접 Security 코드 따라다니면서 확인하면 이해하기 유용)