👩🏻‍💻 Programming/SpringBoot

Authentication 메커니즘

한국의 메타몽 2021. 10. 17. 19:28

 

인증 vs 인가 

 

인증 (Authentication) : 특정 리소스에 접근하려고 하는 사용자가 누구인지를 확인하는 절차다.

보통 사용자가 이름과 비밀번호을 입력하는 것으로 사용자를 인증한다. (로그인)
한 번 인증하고 나면 사용자를 식별하고 권한을 부여할 수 있다. (세션)

 

인가 (Authorization) : 인증된 사용자가 어떠한 자원(URI)에 접근 할 '권한'이 있는지 판별한다.

 

 

 

인증 (Authentication)

 

(1) Authneication은 인증된 결과만 저장하는 것이 아니고, 인증을 하기 위한 정보와 인증을 받기 위한 정보가 하나의 객체에 동시에 들어 있다. 왜냐하면, 인증을 제공해줄 제공자(AuthenticationProvider)가 어떤 인증에 대해서 허가를 내줄 것인지 판단하기 위해서는 직접 입력된 인증을 보고 허가된 인증을 내주는 방식이기 때문이다. 그래서 AuthenticationProvider 는 처리 가능한 Authentication에 대해 알려주는 support 메소드를 지원하고, authenticate() 에서 Authentication을 입력값과 동시에 출력값으로도 사용한다.

 

 

  • Credentials : 인증을 받기 위해 필요한 정보, 비번등 (input)
  • Principal : 인증된 결과. 인증 대상 (output)
  • Details : 기타 정보, 인증에 관여된 된 주변 정보들
  • Authorities : 권한 정보들,

 

(2) Authentication 을 구현한 객체들은 일반적으로 Token(버스 토큰과 같은 통행권) 이라는 이름의 객체로 구현된다. 그래서 Authentication의 구현체를 인증 토큰이라고 불러도 좋다.

 

(3) Authentication 객체는 SecurityContextHolder 를 통해 세션이 있건 없건 언제든 접근할 수 있도록 필터체인에서 보장해 준다.

 

 

 

인증 제공자 (AuthneicationProvider)

 

 

 

 

(1) 인증 제공자(AuthenticationProvider)는 기본적으로 Authentication 을 받아서 인증을 하고 인증된 결과를 다시 Authentication 객체로 전달한다.

 

(2) 그런데 인증 제공자는 어떤 인증에 대해서 도장을 찍어줄지 AuthenticationManager 에게 알려줘야 하기 때문에 support() 라는 메소드를 제공한다. 인증 대상과 방식이 다양할 수 있기 때문에 인증 제공자도 여러개 올 수 있다. 

 

 

 

인증 관리자 (AuthneicationManager)

 

 

 

 

 

(1) 인증 제공자들을 관리하는 인터페이스가 AuthenticationManager (인증 관리자)이고, 이 인증 관리자를 구현한 객체가 ProviderManager 이다.

 

(2)ProviderManager 도 복수개 존재할 수 있다.

 

(3) 개발자가 직접 AuthenticationManager를 정의해서 제공하지 않는다면, AuthenticationManager 를 만드는 AuthenticationManagerFactoryBean 에서 DaoAuthenticationProvider 를 기본 인증제공자로 등록한 AuthenticationManage를 만든다.

 

(4) DaoAuthenticationProvider 는 반드시 1개의 UserDetailsService 를 발견할 수 있어야 한다. 만약 없으면 InmemoryUserDetailsManager 에 [username=user, password=(서버가 생성한 패스워드)]인 사용자가 등록되어 제공된다.

 

 

Spring Security - 인증 매커니즘 요약

 

  • Spring security는 세션-쿠키 방식으로 인증한다. (HttpSession 사용)
  • 유저가 로그인을 시도 (http request)
  • AuthenticationFilter
    • 사용자가 보낸 아이디와 패스워드를 Dispatcher Servlet(Front Controller)으로 가기 전에 ServletFilter를 거치게 된다.
    • UsernamePasswordAuthenticationFilter를 사용해서 인증을 진행
    • AuthenticationManager를 통한 인증 실행
    • 인증 성공 실패 처리
      • 인증 성공 시, 얻은 Authentication 객체를 SecurityContext에 저장 후 AuthenticationSuccessHandler 실행
      • 인증 실패 시, AuthenticationFailureHandler 실행
  • AuthenticationManager
    • Authentication 객체 생성
      • 이 객체를 사용해서 Spring security가 인증 수행
    • 유저의 request에 담긴 Authentication을 넘겨 받아, 내용을 채운다.
  • AuthenticationProvider
    • 실제 인증이 일어남.
    • UserDetailsService에서 인증 확인하고, 인증된 사용자면 UsernamePasswordAuthenticationToken 생성
  • UserDetailsService
    • 사용자 인증(확인)
    • 사용자 정보 load
  • User
    • Spring security에서 제공하는 클래스로 이름과 패스워드 권한들에 대한 필드만 있다.
    • 그 외의 정보를 다루려면 UserDetails 구현체를 직접 만들어서 사용해야 한다.
  • DB에 있는 유저라면 UserDetails로 꺼내서 유저의 session 생성
  • Spring security의 인메모리 세션저장소인 SecuirtyContextHolder에 저장
  • 유저에게 session ID와 함께 응답을 내려줌
  • 이후 요청에서는 요청쿠키에서 JSESSIONID를 까봐서 검증 후 유효하면 Authentication를 쥐어준다.

 

참고 자료

 

노는게제일좋아!님 - Spring security 정리

 

Spring security - 용어 정리/작동 방식/JWT

Spring security : 스프링 기반의 어플리케이션의 보안(인증과 권한)을 담당하는 프레임워크이다. 만약 스프링 시큐리티를 사용하지 않았다면?  자체적으로 세션을 체크하고 redirect 등을 해야할 것

hororolol.tistory.com