
Authorization - 인가처리
인증에 성공한 사용자가 자원에 접근이 가능한지 처리하는 영역
당신에게 무엇이 허가 되었는지 증명하는 것이다.
스프링 시큐리티는 Authentication과 Authorization을 나눈다.
인가 단계
사용자가 인증을 받는다.
인증 받은 사용자가 웹 어플리케이션에 접근
인증 받은 사용자가 가진 권한이 해당 자원에 접근할 권한이 있는지 확인
(이것이 인가이다)
--- 인증을 먼저 하고 후에 인가를 한다 ---

권한 계층
웹 계층
-- URL 요청에 다른 메뉴 혹은 화면 단위의 레벨 보안
서비스 계층
-- 화면 단위가 아닌 메소드 같은 기능 단위의 레벨 보안
도메인 계층
-- 객체 단위의 레벨 보안
--- FilterSecurityInterceptor ----

마지막에 위치한 필터로써 인증된 사용자에 대하여 특정 요청의 승인/거부 여부를 최종적으로 결정
인증객체 없이 보호자원에 접근으 시도할 경우 AuthenticationException을 발생
인증 후 자원에 접근 가능한 권한이 존재하지 않을 경우 AccessDeniedException을 발생
권한 제어 방식 중 HTTP 자원의 보안을 처리하는 필터
권한 처리를 AccessDecisionManager에게 맡김

사용자가 접근 시도
FilterSecurityInterceptor 필터가 요청을 받아 인증 여부를 체크한다
2-1 (SecurityContext 내에)사용자가 가진 인증객체가 있는지 확인한다는 것
2-2 인증 객체가 없으면(null) AuthenticationException 발생시켜 인가 처리하지 않아.
2-3 AuthenticationException를 ExceptionTranslationFilter가 받아서 현재 사용자가 인증예외를 터졌기 때문에 로그인 화면으로 다시 보낸다.
인증 객체가 null이 아니라면?
3-1 SecurityMetadataSource 클래스가 받는다.
3-2 /user url에 role_user로 접근가능하다 한다면
3-3 SecurityMetadataSource가 권한 정보를 가지고 오는 역할을 한다
[사용자가 요청한 자원에 필요한 권한 정보 조회해서 전달한다]
권한 정보가 없다면(null인경우)? (아무나 접근 가능한 자원) -> 자원 접근 허용
권한 정보가 있다면?
5-1 유저 권한 정보를 AccessDecisionManager가 최종으로 권한 심의를 결정한다
5-2 AccessDecisionVoter 라는 심의자에게 심의 요청하고 AccessDecisionVoter가 승인여부를 AccessDecisionManager에게 전달한다.
5-3 접근이 거부당하면? AccessDeniedException에러 발생 -> ExceptionTranslationFilter 에게 전달
접근이 승인된다면 자원 접근이 허용된다.