Spring Security 동작 과정

junto·2024년 4월 13일
0

spring

목록 보기
12/30
post-thumbnail

Spring Security 동작 과정

  • SpringSecurityFilterChian은 들어오는 요청을 처리하고 인증 및 권한 부여 작업을 편리하게 수행할 수 있도록 기본 필터들을 제공한다.

  • 인증(Authentication)은 사용자가 누구인지 확인하는 과정이고, 인가(Authorization)란 사용자가 무엇을 할 수 있는지 확인하는 과정이다. 스프링 시큐리티를 이용하면 이러한 작업을 편리하게 할 수 있다.

1. 인증 필터(Authentication Filter)

  • 사용자가 로그인 폼에 자신의 아이디와 비밀번호를 입력하고 제출하면 UsernamePasswordAuthenticationFilter가 이를 가로챈다.
  • 아이디와 비밀번호로 인증되지 않은 토큰(UsernamePasswordAuthenticationToken)을 만들어 인증 공급자(Authentication manager)에게 전달한다.

2. 인증 관리자(Authentication manager)

  • 인증 관리자는 인증 공급자를 이용해 인증을 처리한다. 왜 인증 관리자를 둘까? 인증 관리자를 두면 쉽게 인증 방식을 추가할 수 있다. 애플리케이션에 소셜 로그인이 필요하다면 새로운 인증 공급자를 추가하기만 하면 된다.
  • 사용자 인증을 성공하기 위해 목록에 있는 AuthenticationProvider를 하나씩 호출한다.
return this.getAuthenticationManager().authenticate(authRequest);

3. 인증 공급자(Authentication provider)

  • 인증 공급자는 인증 논리를 구현한다.
  • 인증 공급자는 사용자 관리 책임을 구현하는 사용자 세부 정보 서비스(UserDetailsService)를 인증 논리에 이용한다. 추가로 암호 관리를 구현하는 암호 인코더를 (Password Encoder) 인증 논리에 이용한다.

4. 보안 컨텍스트(Security Context)

  • 보안 컨텍스트는 인증 프로세스 후 인증 데이터를 유지한다. 유저의 모든 정보를 저장하는 게 아니라 인증 과정에 필요한 최소한의 정보만 저장한다.
  • 컨트롤러에서 인증된 사용자의 정보를 Security Context에서 가져올 수 있다.
public String Test() {

    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

    CustomUserDetails customUserDetails = (CustomUserDetails) authentication.getPrincipal();
    String id = customUserDetails.getId();

    Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
    Iterator<? extends GrantedAuthority> iterator = authorities.iterator();
    GrantedAuthority auth = iterator.next();    
}

5. 에러처리

  • 사용자가 인증되지 않았거나 권한이 없는 경우에 이를 핸들링하는 내부 필터(ExceptionTranslationFilter)가 실행된다. 현재 보안 컨텍스트에 있는 인증 정보를 제거하고, 현재 요청 정보를 저장하여 사용자에게 인증을 요청할 수 있다.
  • handleAuthenticationException()에서는 인증 실패 로그를 기록하고 사용자를 인증 절차를 시작할 수 있는 엔트리 포인트로 리디렉션한다.
  • handleAccessDeniedException()에서는 현재 사용자가 익명 사용자이거나 RememberMe 기능을 통해 인증된 경우, 추가적인 인증 절차를 요구한다.

참고자료

profile
꾸준하게

0개의 댓글