Spring Security 동작 과정 절차+JWT 토큰 방식

Hoo-Sung.Lee·2023년 9월 14일
2

Spring

목록 보기
2/15

1. Authentication

Spring Security를 직접 적용시켜본 코드를 바탕으로 정리해 보았습니다.

  1. 요청 수신
  • 사용자가 form을 통해 로그인 정보가 담긴 Request를 로그인 uri(/api/login)로 요청한다. Authentication 절차가 일어난다.
  • AuthenticationFilter는 UsernamePasswordAuthenticationFilter를 상속받아서 만들었습니다.
  1. 토큰 생성
  • AuthenticateFilter가 요청을 받아서 UsernamePasswordAuthenticationToken(인증용 객체)를 생성 한다.

  • UsernamePasswordAuthenticationToken은 해당 요청을 처리할 수 있는 Provider(Authentication Provider)을 찾는데 사용한다.

  1. AuthenticationFilter로부터 인증용 객체를 전달 받는다.
  • Authentication Manager에게 처리 위임
  • Authentication Manager는 List형태로 Provider들을 갖고 있다.
  1. Token을 처리할 수 있는 Authentication Provider를 선택한다.
  • 실제 인증을 할 AuthenticationProvider에게 인증용 객체를 다시 전달한다.
  1. 인증 절차
  • 인증 절차가 시작되면, AuthenticationProvider 인터페이스가 실행되고 DB에 있는 사용자의 정보와 화면에서 입력한 로그인 정보를 비교한다.
  1. UserDetailService의 loadUserByUsername 메소드를 수행한다.
  • AuthenticationProvider 인터페이스에서는 authenticate() 메소드를 오버라이딩 하게 되어 있는데 이 메소드의 파라미터인 인증용 객체로 화면에서 입력한 로그인 정보를 가져올 수 있다.
  1. AuthenticationProvider 인터페이스에서 DB에 있는 사용자의 정보를 가져오려면, UserDetailsService 인터페이스를 사용한다.
    supports()-->authenticate()순으로 인증 절차가 진행되므로 둘 다 @override해줘야 한다.

  2. UserDetailsService 인터페이스는 화면에서 입력한 사용자의 username으로 loadUserByUsername() 메소드를 호출하여 DB에 있는 사용자의 정보를 UserDetails 형으로 가져온다. 만약 사용자가 존재하지 않으면 예외를 던진다. 이렇게 DB에서 가져온 이용자의 정보와 화면에서 입력한 로그인 정보를 비교하게 되고, 일치하면 Authentication 참조를 리턴하고, 일치하지 않으면 예외를 던진다.

  1. 인증이 완료되면 사용자 정보를 가진 Authentication 객체를 SecurityContextHolder에 담은 이후 AuthenticationSuccessHandle를 실행한다.(실패 시 AuthenticationFailureHandler를 실행한다.)
  • AuthenticationSuccessHandle에서는 인증에 성공했으므로, Access token, refresh token을 생성해서 반환해준다.
  • Unsuccessful한 경우는 예외처리를 해준다.

2. AuthenticateFilter

1.(UsernamePassword)AuthenticationFilter

아이디와 비밀번호를 사용하는 form 기반 인증

설정된 로그인 URL로 오는 요청을 감시하며, 유저 인증 처리인 AuthenticationManager를 통한 인증이 실행된다.

인증이 성공한다면 인증용 객체를 SecurityContext에 저장 후 AuthenticationSuccessHandler 실행
실패 한다면 AuthenticationFailureHandler 실행

2.AuthenticationProvider
화면에서 입력한 로그인 정보와 DB정보를 비교
이 과정에서 form에서 입력한 비밀번호에 사용자마다 DB에 저장해둔 랜덤값(UUID)을 이용해서 복호화하여, DB에 저장되어 있는 유저의 비밀번호랑 일치 하는지 비교 한다.

Spring Security의 AuthenticationProvider을 구현한 클래스로 security-context에 provider로 등록한 후 인증 절차를 구현한다.

3.UserDetailsService
UserDetailsService 인터페이스는 DB에서 유저 정보를 가져오는 역할을 한다.

4.UserDetails
사용자의 정보를 담는 인터페이스, 직접 상속받아 사용한다.


3. AuthorizationFilter

로그인 uri로 접근 시에는, Authentication & Authorization 과정이 일어나고, 성공하면 JWT 토큰을 반환해준다.
반면에 로그인 한 사용자만 접근해서 서비스를 사용하는 uri 같은 경우는, 인가 과정이 일어나게 된다.
인가 과정에서는 프론트엔드로 부터 받은 토큰이 유효한지를 판별하고, 해당 uri로 접근 권한이 있는지를 판단해 결과에 따라 다르게 진행시킨다.
@doFilterInternal을 오버라이드해서 사용하면 되고

refreshtoken과 accesstoken에 대한 만료 기간은 위의 사진과 같이 설정하였습니다.

AuthorizationFilter에 대한 자세한 내용은 나중에 업로드 하겠습니다.
---이상으로 JWT 토큰 방식에 Spring Security를 적용시켜 보았습니다.!
읽어 주셔서 감사합니다.^^😊

profile
Software Engineer

1개의 댓글

comment-user-thumbnail
2023년 9월 14일

글 잘 봤습니다~

답글 달기