스프링 시큐리티 - 로그인 과정1 - Form, Basic

HUSII·2023년 8월 23일
0

스프링 시큐리티

목록 보기
5/7

스프링 시큐리티 공식 문서를 읽고, 라이브러리 코드들을 뜯어보면서 공부했습니다.
인증은 username/password 인증을 기준으로 설명하겠습니다.

이전 장에서 스프링 시큐리티를 이용했을 때, 유저가 어떻게 인증되는지 간단히 살펴봤습니다.

위 그림은 이전 장에서 살펴봤던 그림인데, 여기서 AuthenticationFilter가 HttpServletRequest에 있는 username/password를 가지고 UsernamePasswordAuthenticationToken을 생성해서(2), AuthenticationManager에게 토큰을 전달하면서 인증을 진행하는 것을 알아봤습니다(3).

그리고 AuthenticationManager에서 인증을 성공하면(9), AuthenticationFilter가 SecurityContextHolder에 토큰(Authentication 객체)을 저장하는 것(10)까지 알아봤습니다.

이번 장에서 스프링 시큐리티에서 제공하는, HttpServletRequest에서 username/password를 읽을 수 있는 메커니즘을 소개하겠습니다.

다음 장에서 생성된 UsernamePasswordAuthenticationToken을 가지고 AuthenticationManager가 어떻게 인증을 진행하는지 알아보겠습니다.


스프링 시큐리티가 제공하는 메커니즘

스프링 시큐리티에서 제공하는 메커니즘은 3가지가 있습니다.
1. Form
2. Basic
3. Digest

Digest 인증은 다른 두가지 방식에 비해 거의 사용되지 않으므로 다루지 않겠습니다.
사실 Form 로그인을 제일 많이 쓰고 다른 두가지는 거의 안쓰이는 걸로 알고 있습니다.


Form 로그인

SecurityConfig에서 http.formLogin()을 통해 Form 로그인을 활성화시킬 수 있습니다

Form 로그인은 HTML Form을 통해 제공된 username과 password를 읽어서 인증을 진행합니다.

UsernamePasswordAuthenticationFilter가 Form 로그인을 지원합니다.

클라이언트가 Form 로그인 요청을 보냈을 때,
UsernamePasswordAuthenticationFilter가 Form 로그인을 통해 인증하는 과정은 다음과 같습니다.

Spring Security에서 아무것도 건드리지 않은, default 설정일때 기준입니다.

  1. 클라이언트가 HTML Form에 username과 password를 입력하고 서버로 데이터를 제출합니다.

    url은 /login이고, http method는 POST입니다.
    HttpServletRequest의 request body는 username=아무이름&password=아무비밀번호 형태로 제출됩니다.

  2. Spring Security에 의해 Servlet Filter로 등록된, UsernamePasswordAuthenticationFilter가 이 url(/login)과 method(POST)를 감지하고, request body에 있는 username과 password를 이용해서 UsernamePasswordAuthenticationToken을 생성합니다.

  3. 생성한 UsernamePasswordAuthenticationToken을 AuthenticationManager에게 보냅니다.

    AuthenticationManager의 authenticate 메서드 호출

  4. 인증이 성공됐다면 성공된 토큰을 SecurityContextHolder에 저장합니다.


Basic 로그인

SecurityConfig에서 http.httpBasic()을 통해 Basic 로그인을 활성화시킬 수 있습니다

클라이언트는 Authorization 헤더에 Base64로 인코딩된 username/password 값을 입력하고 request를 보냅니다.

예시 - POSTMAN

위 예시처럼 Authorization 헤더에 인코딩된 값으로 서버에 request를 보냅니다.

여기서 BasicAuthenticationFilter가 Basic 로그인을 지원합니다.

Basic 로그인을 하는 과정은 다음과 같습니다.

  1. 클라이언트의 request에서 Authorization 헤더를 찾아서, 해당 값을 디코딩 진행합니다

  2. Authorization 헤더로부터 username/password를 추출합니다.

  3. username/password를 이용해 UsernamePasswordAuthenticationToken을 생성합니다.

  4. 생성한 UsernamePasswordAuthenticationToken을 AuthenticationManager에게 보냅니다.

    AuthenticationManager의 authenticate 메서드 호출

  5. 인증이 성공됐다면 성공된 토큰을 SecurityContextHolder에 저장합니다.


정리

UsernamePasswordAuthenticationFilterBasicAuthenticationFilter 모두 HttpServletRequest로부터 받은 username/password를 이용해서,
UsernamePasswordAuthenticationToken을 생성해주고, AuthenticationManager의 authenticate 메서드를 호출하는 것은 같습니다.

결국은 HttpServletRequest에서 username/password를 읽는 방식이 다릅니다.

다음 장에서 생성된 UsernamePasswordAuthenticationToken을 가지고 AuthenticationManager가 어떻게 인증을 진행하는지 알아보겠습니다.

개인적으로 공부한 내용을 정리한 글입니다.
지적, 피드백 환영합니다.

profile
공부하다가 생긴 궁금한 것들을 정리하는 공간

0개의 댓글