Diary/TIL

2024-05-22) 로그인 분석

nsean 2024. 5. 24. 15:45

오늘은 Spring 환경에서 Spring Security의 작동 원리에 대해 제대로 이해해 보기 위해 GitHub를 참고하면서, 로그인 기능이 어떤 방식으로 구현되어 있는지, 그리고 MVC 구조에서 어떤 폴더와 파일이 존재하는지 확인해봤다.

 

일단 전체적인 로그인 로그아웃의 구조는 내가 봤을땐 아래와 같았다.

로그인 시

  1. 클라이언트가 자격 증명과 함께 로그인 요청을 보낸다.
  2. 컨트롤러가 요청을 받아 DTO 객체로 변환하여 서비스로 전달한다.
  3. 서비스 레이어에서 자격 증명을 검증한다.
  4. 검증이 성공하면 JWT를 생성하고, 액세스 로그를 기록한다.
  5. 생성된 토큰을 헤더에 포함시켜 클라이언트에게 응답한다.

로그아웃 시

  1. 클라이언트가 토큰과 함께 로그아웃 요청을 보낸다.
  2. 컨트롤러가 요청을 받아 헤더에서 토큰을 추출하여 서비스로 전달한다.
  3. 서비스 레이어에서 토큰을 검증하고 블랙리스트에 추가한다.
  4. 클라이언트에게 로그아웃 성공 응답을 반환한다.

로그인 후 토큰을 받게 되면 보안적으로 컷이 걸린 곳은 인증을 통과해야되는데, 인증 로직은 다음과 같은 방법으로 진행되는 것 같았다.

인증 로직

  1. 클라이언트 요청: 클라이언트가 JWT 토큰을 포함하여 보호된 리소스에 접근 요청을 보낸다.
  2. 필터 체인 처리: JwtAuthorizationFilter가 요청을 가로채고, 헤더에서 JWT 토큰을 추출한다.
  3. 토큰 검증: 토큰의 유효성을 검증하고, 유효한 경우 사용자 ID를 추출한다.
  4. 사용자 정보 로드: 사용자 ID를 기반으로 UserDetailsServiceImpl을 통해 사용자 정보를 로드한다.
  5. SecurityContext 설정: 유효한 사용자 정보를 Authentication 객체로 변환하고 SecurityContext에 설정한다.
  6. 요청 처리 계속 진행: 필터 체인은 계속 진행되어 요청이 컨트롤러로 전달된다.
  7. 인증 실패 시: 토큰이 유효하지 않으면 인증 실패 응답(HTTP 401 Unauthorized)을 반환한다.