Spring Security - 정수원 6일차
7. 인증 관리자 : AuthenticationManager
- 인증 처리하는 filter로부터 인증처리 지시를 받는 첫번째 클래스, ID와 PASSWORD를 Authentication 인증 객체에 저장하고 이 객체를
AuthenticationManager
에게 전달
AuthenticationManager
인터페이스를 구현한게 ProviderManager
이다. AuthenticationProvider
를 관리하는 얘임
- AuthenticationProvider 목록중에서 인증처리 요건에 맞는 AuthenticationProvider를 찾아 인증처리를 위임한다.
- AuthenticationManager는 단지 인증처리를 하지않고 해당에 맞는 Provider를 찾아 위임하는 역할
- Form인증 요청
- ProviderManager가 Form 요청에 맞는 DaoAuthenticationProvider 선택 그리고 인증 처리 맡김
- Oauth인증요청이 들어오면 ProviderManager는 Oauth를 처리 못하니 부모한테 맡긴다.
- ProviderManager는 결국 ID 와 PASSWORD를 가지고 인증객체를 만들어 위임한다
응용
- Linked 형태로 부모와 자식간의 관계를 형성할 수 있다.
- 자식에서 적절한 AuthenticationProvider를 찾지 못할 경우 계속 부모로 탐색하여 찾는 과정을 반복함
- AuthenticationManagerBuilder를 사용해서 스프링 시큐리티의 초기화 과정에서 설정한 기본 Parent 관계를 변경해야 권한 필터에서 재 인증 시 모든 AuthenticationProvider를 탐색 할 수 있다.
8. 인증 처리자 - AuthenticationProvider
- 인증 처리할때 가장 핵심적인 역할을 한다.
- id와 password를 검증하는 실질적인 클래스
- manager가 적절한 provider를 선택한다
- AuthenticationProvider는 인터페이스임. 이걸 적절히 implements 받아서 커스텀하게 사용가능
- authenticate 메소드에서 실제적인 인증처리를 한다
- support 메소드는 인증 처리 기준을 정한다
- ID검증은 UserDetailService에서 데이터 계층으로 부터 사용자 계정이 있는지 없는지 조회하고 유저 객체를 생성해서 UserDetails 객체만들어서 반환
- password검증은 로그인시 받았던 비번과 UserDetails에 있는 비번 비교
- 추가 검증 까지 완료하면 Authentication(user, authorities)(유저 정보, 권한 정보)에 담아 Manager에게 보냄
9. 인가 개념 및 필터 이해 : Authorization, FilterSecurityInterceptor
- 어떤 사용자가 인증을 받고 어떤 자원을 사용하려 할때 자격 조건이 되는지 판단
- 당신에게 무엇이 허가 되었는지 증명하는 것
- 첫번째로 시큐리티가 인증 처리를하고 그 다음에 인가 처리한다.
시큐리티가 지원하는 권한 계층
- 웹 계층
- URL 요청에 따른 메뉴 혹은 화면단위의 레벨 보안
/user
—> ROLE_USER
- 서비스 계층
- 화면 단위가 아닌 메소드 같은 기능 단위의 레벨 보안
- 도메인 계층
- 객체 단위의 레벨 보안
- 어떤 객체를 사용할때 권한이 되는지 아닌지??
FilterSecurityInterceptor
- 마지막에 위치한 필터로써 인증된 사용자에 대하여 특정 요청의 승인/거부 여부를 최종적으로 결정
- 인증객체 없이 보호자원에 접근을 시도할 경우
AuthenticationException
을 발생
- 인증 후 자원에 접근 가능한 권한이 존재하지 않을 경우
AccessDeniedException
을 발생
- 권한 제어 방식 중 HTTP자원의 보안을 처리하는 필터
- 권한 처리를 AccessDecisionManager에게 맡김
- 요청이 들오면
- FilterSecurityInterceptor가 마지막에 받고 인증여부체크를 한다
- 이떄 인증 객체가 있는지 여부 확인
- 없으면
AuthenticationException
에러발생
- 그 다음 SecurityMetadataSource 가 사용자가 요청한 URL에 대한 권한 정보를 가져온다. 이때 NULL이면 그 URL은 권한이 없으므로 누구나 접근 허용
- NULL이 아니면 AccessDecisionManager에게 넘기고 권한 심사함, 최정 심의 결정자임, 내부적으로 AccessDecisionVoter가 심의자임 접근 자격 요건 판단
- 접근 거부 뜨면
AccessDeniedException
예외 발생
잘읽엇씁미다미다미당