Spring Security 인증

귀찮Lee·2022년 7월 26일
0

Spring Security

목록 보기
3/13

◎ Spring Security 인증 처리 과정

  • ※ 인터페이스 (구현체) 로 읽자

◎ Authentication

  • Authentication 내의 정보

    • principal

      • 사용자를 식별
      • 사용자의 고유 식별자와 암호로 인증이 이루어지는 경우 일반적으로 UserDetails 인터페이스를 구현하여 만듦
      • 다른 경우 구현체 :
        org.springframework.security.core.userdetails.User
    • credentials

      • 암호 정보
      • 사용자의 인증이 이루어진 후 지워짐
    • Authorities

      • AuthenticationManger에 의해 부여된 인가에 대한 정보
      • 부여된 권한에 대한 정보는 GrantedAuthority로 추상화 (구현체 : SimpleGrantedAuthority) // 아래 내용 참고
  • Authentication(인증)

    • 스프링 시큐리티는 종합적인 인증 처리를 지원 (Principal & GrantAuthority 정보 제공)
    • 특정 리소스에 접근하려고 하는 사용자가 누구인지를 확인할 때 사용
    • 보통 사용자가 이름과 비밀번호를 입력하는 것으로 사용자를 인증
    • 한번 인증하면 사용자를 식별하고 권한을 부여할 수 있다.
      • 인증된 사용자 정보를 제공 (UserDetailsService를 리턴한 객체, UserDetails 타입)

◎ Password Storage

  • 비밀번호를 안전하게 저장할 수 있도록 단방향 변환을 수행

    • PasswordEncoder는 비밀번호를 단방향으로 변환
    • 인증에 사용할 credential 정보를 저장
  • PasswordEncoder 를 사용해서 저장하는 비밀번호는 인증 시점에 사용자가 입력하는 비밀번호와 비교하는 용도로 사용

  • Password Storage history

◎ Servlet Authentication Architecture

  • 서블릿 인증에서 사용하는 스프링 시큐리티의 주요 아키텍처 컴포넌트

  • SecurityContextHolder

    • SecurityContextHolder만 알고있으면 인증 정보를 가져올 수 있다. (SecurityContext 제공)
    • 스프링 시큐리티로 인증한 사용자의 상세 정보를 저장
    • 값을 어떻게 넣을지 신경 쓰지 않고, 값이 있을 때 현재 인증한 사용자 정보로 사용
  • SecurityContext

    • SecurityContextHolder로 접근하는데 사용
    • Authentication 객체를 가지고 제공함.
  • GrantedAuthority

    • Authentication.getAuthorities() 메서드로 접근, GrantedAuthority 객체의 Collection을 리턴
    • 인증한 주체에게 부여된 권한을 뜻함 (Principal이 가진 권한을 나타냄)
    • 권한은 보통 역할(role)을 의미하고 웹 인가, 메서드 인가, 도메인 객체 인가, 권한 확인 등에서 사용
    • 이름/비밀번호 기반 인증을 사용한다면 UserDetailsService가 GrantedAuthority를 로드
    • GrantedAuthority 객체는 애플리케이션 전체에 걸친 권한을 의미
  • AuthenticationManager

    • 스프링 시큐리티 필터의 인증 수행 방식을 정의하는 API
    • AuthenticationManager를 호출한 객체(스프링 시큐리티의 필터)가 리턴한 Authentication을 SecurityContextHolder에 설정
      • 스프링 시큐리티의 Filters를 사용하지 않을 경우엔 AuthenticationManager를 사용하지 않고 SecurityContextHolder에 직접 설정 가능
    • AuthenticationManager 가장 많이 사용하는 구현체는 ProviderManager이다.
    • 여러 ProviderManager 인스턴스에 동일한 부모를 공유하는 것도 가능
      • 인증 매커니즘이 다른 SecurityFilterChain 여러 개가 공통 인증을 사용하는 경우에 흔히 쓰는 패턴
  • ProviderManager

    • AuthenticationManager 구현체

    • ProviderManager는 동작을 AuthenticationProvider List에 위임함

      • AuthenticationProvider 마다 각자 맡은 인증을 수행
      • AuthenticationProvider는 인증을 성공 or 실패 or 결정을 내릴 수 없는 것으로 판단하여 다운스트림에 있는 AuthenticationProvider가 결정할 수 있도록 만들 수 있다.
      • 설정해둔 AuthenticationProvider가 전부 인증에 실패하면 ProviderNotFoundException 예외 발생과 함께 실패
      • 인증을 수행 할 수 있는 AuthenticationProvider가 없을 때 사용할 부모 AuthenticationManager를 설정할 수 있다. ( ProviderManager 인스턴스에 동일한 부모를 공유하는 것도 가능)
  • AuthenticationProvider

    • AuthenticationProvier는 각 구현체의 authenticate() 메서드에서 정의된 특정 유형에 따른 인증을 수행

    • ProviderManager에 AuthenticationProvider를 여러 개 주입 가능

    • 각 AuthenticationProvider는 인증 성공, 실패 및 결정 할 수 없음을 나타낼 수 있고, 나머지 AuthenticationProvider가 결정할 수 있도록 전달한다.

    • AuthenticationProvider 마다 담당하는 인증 유형이 다름

    • 예시

      • DaoAuthenticationProvider는 이름/비밀번호 기반 인증 지원 (기본으로 적용되는 구현체)
      • JwtAuthenticationProvider는 JWT 토큰 인증 지원
    • 사용자 이름과 암호를 통해 올바른 이름 및 암호인지 확인하기 위한 UserDetailService가 호출되고, 사용자가 인증되면 SecurityContext가 세션에 저장된다.

◎ 참고하면 좋은 자료

◎ 일단 정리한 자료

profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!

0개의 댓글