인증(Authentication)과 권한 부여(Authorization - 인가)

백종석·2022년 6월 2일
0

Spring

목록 보기
1/1
post-thumbnail
  • 스프링 시큐리티의 동작을 이해하기 위해서는 가장 중요한 용어인 인증(Authentication)권한 부여(Authorization - 인가)에 대한 이해이다.
  • 인증(Authentication)은 쉽게 말해서 '자신을 증명하는 것'이다.
    • 다시 말해서 자기 스스로가 무언가 자신을 증명할 만한 자료를 제시하는 것이다.
  • 반면에 권한 부여(Authorization - 인가)는 권한부여남에 의해서 자격이 부여된다.
  • 시큐리티의 개념을 어떤 회사에 방문하는 장면으로 비유하면 아래 그림과 유사하다.

  • 엔지니어 A는 B 회사에 고장 난 데이터베이스를 고치기 위해서 방문했다. 예약을 한 상태에서 방문한 A시는 우선 회사 입구에서 '본인을 인증'할 것을 요구받는다. 출입증을 검사하는 직원은 A의 신분을 확인한다. 인증이란 이처럼 본인이 무엇인가를 증명하는 행위라고 보면 된다.
  • 회사 내부에 들어간 A씨는 다시 담당자를 만나서 데이터베이스의 접근 권한 등의 정보를 얻어야 한다.
    • 이 과정을 인가혹은 권한 부여(Authorization)라고 볼 수 있다.
  • 권한 부여 과정에서 A시는 데이터베이스를 조회하거나 수정할 수 있는 권한이 부여된다.
  • 스프링 시큐리티의 내부에도 이와 비슷한 구조를 가지고 있다.
  • 스프링 시큐리티에서 가장 중요한 역할을 하는 존재가 인증을 담당하는 AuthenticationManager(인증 매니저)라는 존재이다.
  • AuthenticationManager는 다양한 방식의 인증을 처리할 수 있도록 아래와 같은 구조로 설계되어 있다.

  • ProviderManager는 인증에 대한 처리를 AuthenricationProvider라는 타입의 객체를 이용해서 처리를 위임한다.

  • AuthenricationProvider(인증 제공자)는 실제 인증 작업을 진행한다.
    • 이때 인증된 정보에는 권한에 대한 정보를 같이 전달하게 되는데 이 처리는 UserDetailsService라는 존재와 관련이 있다.
    • UserDetailsService 인터페이스 구현체는 실제로 사용자의 정보와 사용자가 가진 권한의 정보를 처리해서 반환하게 된다.

  • 개발자가 스프링 시큐리티를 커스터마이징 하는 방식은 크게 AuthenricationProvider를 직접 구현하는 방식과 실제 처리를 담당하는 UserDetailsService를 구현하는 방식으로 나누어진다.

  • 대부분의 경우에는 UserDetailsService를 구현하는 형태를 사용하는 것만으로도 충분하지만, 새로운 프로토콜이나 인증 구현 방식을 직접 구현하는 경우에는 AuthenticationProvider 인터페이스를 직접 구현해서 사용한다.

profile
항해중인 우당탕탕 코린이

0개의 댓글