SEB_BE_43 / 23.03.16 회고

rse·2023년 3월 16일
0

코드스테이츠_BE_43

목록 보기
55/65

오늘

  • Spring Security Athentication

Spring Security Athentication(인증) 흐름

  1. 사용자가 로그인 요청.

  2. UsernamePasswordAuthentication에서 Authentication 정보 생성.
    여기서 Authentication 정보는 아직 인증 안된 정보. 인증을 하기 위해서 필요한 정보다.

  3. AuthenticationManager는 받은 정보를 보고 인증절차 진행한다.

  4. AuthenticationProvider 는 UserDetailsService 에게 UserDetails 확인을 부탁한다.
    UserDetails는 데이터베이스 등의 저장소에 저장된 사용자의 Username과 사용자의 자격을 증명해주는 크리덴셜(Credential)인 Password, 그리고 사용자의 권한 정보를 포함하고 있는 컴포넌트이다.

  5. UserDetailsService는 DB같은 저장소에서 사용자의 정보 조회를 한다.

  6. 조회한 정보를 바탕으로 UserDetails를 생성한다. 생성한 UserDetails AuthenticationProvider에게 다시 전달.

  7. AuthenticationProvider 에서 PasswordEncoder를 이용해 UserDetails에 Password와 인증을 위해 만든 Authentication Password가 같은지 확인.

  8. 검증에 성공하면 UserDetails 를 이용해 인증된 Authentication 생성. 검증에 실패하면 에러 발생과 인증 처리 중단.

  9. 인증된 Authentication을 거치고 거쳐서 다시 UsernamePasswordAuthenticationFilter에게 전달.

  10. 마지막으로 SecurityContextHolder를 이용해 SecurityContext에게 전달&저장.


UsernamePasswordAuthenticationFilter

맨 처음 UsernamePasswordAuthenticationFilter 가 로그인 폼에서 제출되는 Username과 password를 전달받는다.

Filter 인데 doFilter 메서드가 없는 이유는 상속받고 있는 AbstractAuthenticationProcessingFilter 안에 doFilter 를 포함하고 있기 때문이다.

결과적으로 AbstractAuthenticationProcessingFilter 에서 제일 먼저 로그인 Request를 전달 받는다.

위 메서드는 Spring Security의 인증 관련 필터를 구현하기 위한 추상 클래스 중 하나임을 의미한다.
따라서 AbstractAuthenticationProcessingFilter 클래스의 메서드로 포함이 되어 있다는 것은 이 클래스가 Spring Security의 필터 중 하나임을 알 수 있다.

현재 위 메서드는 ServletRequestServletResponse 인터페이스를 상속받는 객체를 인자로 받고, 이를 HttpServletRequestHttpServletResponse 객체로 변환하여 doFilter() 메소드를 호출하고 있다.

클라이언트의 URL이 /login 이고, HTTP method가 POST일 경우에 매치 된다 라는 것을 예측 가능.

방금 생성해준 DEFAULT_ANT_PATH_REQUEST_MATCHER 객체는 상위 클래스인 AbstractAuthenticationProcessingFilter 에 전달되어 Filter가 구체적인 작업을 수행 할지, 특별한 작업 없이 다른 Filter를 호출 할지 결정한다.

클라이언트의 HTTP Method가 post가 아니라면 Exception 발생
클라이언트에서 전달한 username과 password로 UsernamePasswordAuthenticationToken 생성.

UsernamePasswordAuthenticationToken 은 인증을 하기 위한 인증 토큰이다.

성공 토큰과는 상관없음

마지막에 호출하는 메서드는

의 메서드.

UsernamePasswordAuthenticationToken

principal = Username
credentials = Password
를 의미한다.

첫번째 메서드인 unauthenticated 메서드는 인증을 위한 UsernamePasswordAuthenticationToken 객체를 생성하고,
두번째 메서드 authenticated는 인증에 성공 후 SecurityContext에 저장될 토큰 객체 생성.

Authentication

Principal : 사용자를 식별하는 고유 정보. 일반적으로 Username/Password 기반 인증에서 Username이 해당된다. 다른 인증 방식에서는 UserDetails 가 해당된다.

Credentials : 사용자 인증에 필요한 Password를 의미한다. 인증이 이루어지고 난 후, ProviderManager 가 해당 Credentials을 삭제한다.

Authorities : AuthenticationProvider에 의해 부여된 사용자의 접근 권한 목록.
일반적으로 GrantedAuthority인터페이스의 구현 클래스는 SimpleGrantedAuthority다.

ProviderManager

AuthenticationProvider를 관리하고, AuthenticationProvider에게 인증 처리를 위임하는 역할을 한다.

적절한 AuthenticationProvider를 for문으로 찾는다.
찾은 후에는 AuthenticationProvider에게 인증 처리를 맡긴다.

인증이 정상적으로 처리되었다면 인증에 사용된 Credentials를 제거한다.

AuthenticationProvider

AuthenticationProvider는 AuthenticationManager로부터 인증 처리를 위임받아 실질적인 인증 수행을 담당한다.

Password/Username 기반의 인증처리는 DaoAuthenticationProvider가 담당하고 있다.

retrieveUser메서드는 UserDetailsService에서 UserDetails 를 조회하는 역할을 한다.
그리고 사용자를 인증하고 성공하면, 인증된 Authentication 객체를 생성하는 곳에 사용된다.

PasswordEncoder를 이용해 사용자의 패스워드를 검증한다.

SecurityContext와 SecurityContextHolder

SecurityContext는 인증된 Authentication 객체를 저장한다.
SecurityContextHolder 는 SecurityContext를 관리한다.

🌟Spring Security 입장에서는 SecurityContextHolder에 의해 SecurityContext에 값이 채워져 있다면 인증된 사용자로 간주한다.

private static SecurityContextHolderStrategy strategy;

SecurityContextHolder 에서 사용하는 전략을 의미한다.
기본전략은 ThreadLocalSecurityContextHolderStrategy 다.

현재 실행 스레드에서 SecurityContext 를 얻을 수 있다.

현재 실행 스레드에 SecurityContext 를 연결한다.

profile
기록을 합시다

0개의 댓글