2 minute read

로그인 기능을 구현하는 방식




들어가기 전

이 글은 로그인 예제 프로젝트를 진행하면서 핵심적인 부분들, 예제에서 알려준 로직에 대해 메모한 글이다.
로그인 로직에 대해서 지식이 이미 있다면 이 글은 추천하지 않는다.



로그인 기능 청사진

image



스프링 시큐리티

Spring 애플리케이션의 보안(인증, 인가, 권한)을 담당하는 Spring 하위 프레임워크이다.
Spring Security를 사용하면 인증과 인가에 대한 관리 기능을 쉽게 구현할 수 있다.



특징

  • Spring Security는 Spring 애플리케이션의 보안 프레임워크
  • 애너테이션 설정이 매우 간편함
  • CSRF,session flxtion 공격을 방어해줌

    session flxtion은 세션에 들어있는 사용자의 인증 정보를 탈취하거나 변조하는 공격을 말함

  • 요청 헤더를 보안처리 해줌


Spring Security Filter Chain 구조

image

위 사진을 보면서 원하는 위치에 Custom Filter를 만들어 원하는 위치에 Filter Chain을 연결해줄 수 있다

| 필터명 | 설명 | |———-|———-| | SecurityContextPersistenceFilter | SecurityContextRepository에서 SecurityContext(접근 주체와 인증에 대한 정보를 담고 있는 객체)를 가져오거나 저장하는 역할을 합니다 | | Logoutfilter | 설정된 로그아웃 URL로 오는 요청을 확인해 해당 사용자를 로그아웃 처리합니다 | | UsernamePasswordAuthenticationFilter | 인증 관리자입니다. 폼 기반 로그인을 할 때 사용되는 필터로 아이디, 패스워드 데이터를 파싱해 인증 요청을 위임합니다.
인증이 성공하면 AuthenticationSuccessHandler를
인증에 실패하면 AuthenticationFailureHandler를
실행합니다 | | DefaultLoginPageGeneratingFilter | 사용자가 로그인 페이지를 다로 지정하지 않았을 때 기본으로 설정하는 로그인 페이지 관련 필터입니다. | | BasicAuthenticationFilter | 요청 헤더에 있는 아이디와 패스워드를 파싱해서 인증 요청을 위임합니다.
인증이 성공하면 AuthenticationSuccessHandler를
인증에 실패하면 AuthenticationFailureHandler를
실행합니다 | | RequestCacheAwareFilter | 로그인 성공 후, 관련 있는 캐시 요청이 있는지 확인하고 캐시 요청을 처리해줍니다. 예를 들어 로그인하지 않은 상태로 방문했던 페이지를 기억해두었다가 로그인 이후에 그 페이지로 이동 시켜줍니다. | | SecurityContextHoldlerAwareRequestFilter | HttpServletRequest 정보를 감쌉니다. 필터 체인 상의 다음 필터들에게 부가 정보를 제공하기 위해 사용합니다. | | AnonymousAuthenticationFilter | 필터가 호출되는 시점까지 인증되지 않았다면 익명 사용자 전용 객체인 AnonymousAuthentication을 만들어 SecurityContext에 넣어줍니다. | | SessionManagementFilter | 인증된 사용자와 관련된 세션 관련 작업을 진행합니다. 세션 변조 방지 전략을 설정하고, 유효하지 않은 세션에 대한 처리를 하고, 세션 생성 전략을 세우는 등의 작업을 처리합니다. | | ExceptionTranslationFilter | 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달합니다. | | FilterSecurityInterceptor | 접근 결정 관리자입니다. AccessDecisionManager로 권한 부여 처리를 위임함으로써 접근 제어 결정을 쉽게 해줍니다. 이 과정에서는 이미 사용자가 인증되어 있으므로 유효한 사용자인지도. 즉, 인가 관련 설정을 할 수 있습니다. | —-

체크하고 넘어갈 Security Filter 동작

  1. UsernamePasswordAuthenticationFilter
    • ID와 PASSWORD가 로그인 요청과 같이 넘어오면 인증 요청을 위임하는 인증 관리자 역할을 한다.
  2. FilterSecurityInterceptor
    • 권한 부여 처리를 위임해 접근 제어 결정을 쉽게 하는 접근 결정 관리자 역할을 한다.
  3. 사용자가 폼 기반의 로그인 요청을 보냈을 때 Security의 동작
    1. 사용자가 폼에 아이디와 패스워드를 입력하면 HTTPServletRequest에 아이디와 비밀번호 정보가 전달된다.
    2. 유효성 검사가 끝나면 실제 구현체인 UsernamePasswordAuthenticationToken을 만들어 넘겨줌
    3. 전달받은 인증용 객체인 UsernamePasswordAuthenticationToken을 AuthenticationManager에게 보냄.
    4. UsernamePasswordAuthenticationToken을 AuthenticationProcider에 보냄
    5. 사용자 아이디를 UserDetailService에 보냄
      1. UserDetailService는 사용자 아이디로 찾은 사용자의 정보를 UserDetails 객체로 만들어 AuthenticationProvider에게 전달 함
    6. DB에 있는 사용자 정보를 가져옵니다.
    7. 입력 정보와 UserDetails의 정보를 비교해 실제 인증 처리를 합니다.
    8. 인증이 완료되면 SecurityContextHolder에 Authentication을 저장하고 인증 성공 여부에 따라 성공하면 AuthenticationSuccessHandler를 실패하면 AuthenticationFailureHandler를 실행합니다.

Updated: