본문 바로가기

SPRING SECURITY

[Spring Security] UsernamePasswordAuthenticationFilter에 대해서

UsernamePasswordAuthenticationFilter는 Form인증을 처리하는 필터이다.

 

사용자가 로그인하면 인증처리가 이루어지는데, 이 인증처리를 담당하고 관련된 요청을 처리한다.

내부적으로 각각의 인증처리의 역할을 따라 여러 클래스를 활용해서 인증처리를 하게 된다.

 

 

인증을 처리하는 과정이다.

1. Form인증으로 인증을 시도하면 UsernamePasswordAutenticationFilter가 요청을 받는다.

2. 사용자가 요청한 url정보(요청정보)를 확인한다.

위의 사진에서는 현재 요청정보의 url이 login인지 확인한다.(default값은 login)

이 값은 http. loginProcessingUrl("...")에서 바꿀 수 있다.

default값이 login이기 때문에 /login으로 요청을 하면

여기서 true를 반환해서 3번(Authentication객체 생성)으로 넘어간다. /login이 아니라 다른 url을 호출할 경우 doFilter를 통해 처리가 된다.

 

3. 인증객체를 만들어서 (Autentication) 인증을 시도한다.

attemptAutentication을 통해서 인증을 성공하면 authenticationResult로 인증 객체(5번)를 리턴 받는데

 

여기서 attempAutentication은 UsernamePasswordAuthenticationFilter안에 구현되어있다.

사용자가 로그인을 시도할 때 입력한 정보 username, password를 추출하고

인증 객체를 생성한다. 그런 후에 생성한 인증객체(authRequest)를 전달하며 authenticationManger에게 인증 처리를 맡긴다.(4번)

 

4. AutneticatonManger는 AutenticationProvider에게 인증처리를 위임한다.

인증을 성공한 이후에 createSuccessAutentication에서 인증객체를 다시 생성한다.

 

5. 인증을 성공한 후에 생성된 인증 객체(Autentication)는 인증에 성공한 user객체 정보와 사용자에게 부여된 권한 정보를 인증 객체에 저장된다. 위의 사진에서는 principal,. getCredential(비밀번호), 권한 정보가 result에 담겨 생성된다.

 

그 이후에 providerManager는 다시금 UsernamePasswordAutenticationFilter에 인증받은 객체를 반환한다. 

 

6. 

그 객체를 SecurityContext에 담아주는데 이 내용은 위치 상관없이 SecurityContextHolder.getContext(). getAuthentication()을 통해서 값을 가져올 수 있다.