BasicAuthenticationFilter

BasicAuthenticationFilter 필터는 지난 시간 폼 인증을 할 때 사용된 UserNamePasswordAuthenticationFilter 인증 필터에서 처리하는 과정하고 많은 부분들이 유사하다. 오히려 더 간단하다. 그래서 폼 인정 필터를 제대로 이해했다면 이번 필터는 그렇게 어렵지 않다.

이 필터는 기본 인증 서비스를 제공하는데 사용된다. 내부적으로 이 필터는 BasicAuthenticationConverter 이런 클래스가 있다. 이 클래스를 사용해 요청 헤더에 기술된 인증 정보의 유효성을 체크하고 Base64 인코딩된 username 과 password 를 추출한다고 되어있다. 우리가 클라이언트가 서버로 Basic 인증을 통해 요청할 때 인증을 받기 위해 요청 헤더에 Authorization : Basic /인코딩 된 username password 값을 보내줘야 한다. 그러면 서버에서는 현재 Basic 인증으로 처리를 할 지 하지 않을 지를 결정해야 하는데 그걸 어떻게 결정하느냐 하면 일단 클라이언트가 보낸 요청 헤더에 Authorization 인증 헤더가 있는지 보고 이 헤더명이 없을 시 인증 처리를 하지 않는다. 유효성이 검증이 안되기 때문. 해더의 내용을 보고 Basic 값이 포함되어 있는지 본다. 포함되어 있지 않으면 역시 인증 처리 수행하지 않는다. → 이 둘 다 정상적으로 있는지 보는데 이를 유효성이 있는지 체크한다고 해석. 이 유효성이 체크되면 그때 인코딩된 값으로부터 username 과 password 를 추출해 인증 전략을 수행한다 보면 된다. 그걸 BasicAuthenticationConverter 라는 클래스가 한다는 것. 그리고 이 필터는 인증 이후 세션을 사용하는 경우가 있고 사용하지 않는 경우도 있는데 물론 우리가 세션을 사용해 인증 처리를 수행할 수도 있지만 이 필터는 세션을 사용하지 않는다. 하지 않고 요청 Request 라고 있는데 요청 범위 내에서만 인증이 이루어지도록 하고 있다. 그래서 만약에 세션을 사용하면 약간 처리되는 흐름에 차이가 있다는데 참고. 세션을 사용하는 경우에는 매 요청마다 인증 과정을 거치지 않을 것. 세션 안에서 요청 정보를 꺼내 인증 상태를 유지하면 되니 마치 폼 인증처럼. 하지만 세션을 사용하지 않으면 세션에서 아무런 정보가 없으니 매 요청마다 새로운 사용자가 되기에 매 요청마다 인증 과정을 거쳐야 한다. 그래서 BasicAuthenticationFilter 는 일반적으로 세션을 사용하지 않는다. 세션을 사용하지 않고 일반적으로 인코딩된 문자열로 계속해 인증을 처리한다. JWT 같은 인증 처리 방식 또한 세션 사용 없이 토큰에 인증을 처리할 만한 정보와 만료 기간이 있어 만료 기간 내에서는 인증 처리가 되도록 사용.

흐름도

보면 폼 인증과 똑같다. 하지만 몇 개 빠진게 있으니 살펴볼 것.

image.png

클라이언트가 GET 방식으로 로그인 요청을 하고 BasicAuthenticationFilter 가 요청을 받아 처리한다. 그리고 인증 처리를 하는데 이 과정을 가기 전 유효성을 체크하는 과정이 있는 것. 이 과정이 성공해야 넘어온다. 넘어오면 UsernamePasswordAuthenticationToken 인증 객체로 여기에 추출한 username 과 password 를 저장하며, 이 토큰이 다시 AuthenticationManager 에 전달이 된다. 이 Manager 가 인증 처리 후 성공과 실패로 나눠지고 성공과 실패의 로직은 저번에 살펴본 내용과 동일.