TEMP 스프링 시큐리티
포스트
취소

TEMP 스프링 시큐리티

http.addFilterAt(jwt 발급 필터, 베이직 필터)
addFilterAfter(jwt 검증 필터, 베이직 필터)

jwt 발금 필터 : header 에서 id/pw 를 가져와서 DB에서 찾고,
있으면 매니저에서 Auth 진행 후 (Provider) 에서 처리
response 에 jwt token 넘기기.

jwt 검증 필터 : header 에서 jwt 가져와서 검증한 뒤,
권한 부여한 Auth token 넘기기. 매니저에게 넘기는 게 아닌, doFilter 로 req,res 에 넘김




Auth 필터 -> 요청 Auth manager 에 준다.
매니저는 Provider 로 인증 처리
provider는 user detail 과 pw encoder 를 사용해서 보안 컨텍스트가 인증 데이터유지 및
인증 논리를 구현하고

UserDetailService 객체는 자격 증명이 있는 사용자의 집합을 관리하고,
사용자의 추가/패스워드 관리 등을 진행한다.
provider userDetailService 와 passwordEncoder 에 작업을 위임한다.
(인증 논리만 구현하고 사용자 관리/ 암호 관리만, 필요 없도록 재정의도 가능)

userDetailService 에서 user 를 찾고, passEncoder 로 암호 검증(provider 가 위임한 작업)
provider 는 인증 논리를 구현하고 토근을 반환한다.




userDetailService 와 userDetails

사용자 기술 : userDetails
사용자 권한 : GrantedAuthority
사용자 만들기 등의 user 관리는 userDetailsManager
(JdbcUserDetailsManager 중요)
Service와 Manager 분리는 인터페이스 분리 원칙

사용자 검색/관리를 위해 사용자 객체 생성 필요
userDetails 객체 필요
이거는 Granted Authority 객체 집합을 가진다.

Jdbc 를 이용할 때는 user entity 를 만들고
entity 를 저장할 userDetails 를 구현한다.




userDetailsService 는 loadUserByUsername 메소드를 재정의하여
userDetails 를 반환하여 사용자 검색을 완료한다

userManager 는

  • createUser
  • updateUser
  • deleteUser
  • changePassword
  • userExists

위 메소드를 구현해야하고, JdbcUserManager 도 있다.
JdbcUserManager 의 쿼리 재지정 후 빈으로 사용하면
userDetailsService 가 인식해서 사용한다. configure 에서 auth userDetailsService
(내가 만든 manager 사용 service) 해서 사용가능
암호화 방식은 BCrypt 사용




provider 는 요청 허용 결정

Manager 는 요청 수신 provider 에 전달.
인증 이벤트는 Authentication 인터페이스가 나타낸다.

Authentication -> manager에게 이벤트 발생 -> provider 는 event 를 받음 -> 인증 진행 -> Authentication (Authenticate 메소드 인스턴스 반환 or exception)

지원하는지 알아내는 provider 메소드는 supports 이다.

authentication 의 구현 인스턴스의 예시 : UsernamePaswwordAuthenticationToken
반환된 authentication 인스턴스를 secure context 가 보관한다.

요청을 A가 하면 A를 가진 보안 컨텍스트가 응답
즉, Authentication a 를 넣으면 된다.
엘리게이팅(?)은 나중에 공부하자




필터가 getHeader 해서 name/pass 가져오고,
Authentication a 를 만들어서 각 프로바이더가 받아서 인증 진행한 뒤 매니저에게 넘긴다.
인증이 끝나면 jwt 를 발급하고, response 에 authorization header 에 jwt 를 넘긴다.
jwt 를 만들 때 class 에 권한도 넣자.

클라이언트는 jwt 를 요청마다 모든 컨트롤러에 넘기고
요청 필터가 jwt 취득 후 검증,
username 을 얻고, 권한을 찾을 후 토큰을 만들어 컨텍스트에 넣는다.
단, 이 작업은 요청당 단 한 번만 진행해야 하기 떄문에,
OncePerRequestFilter 를 확장해서 만든다.

로그인도 인증이고 jwt 검증도 인증이다.




이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.