[Spring Boot] Chapter.13 서비스의 인증과 권한 부여

굿거리·2023년 7월 9일
0

🧡 인증

  • 인증(authentication)은 사용자가 누구인지 확인하는 단계를 의미한다.
  • 인증의 대표적인 예로 로그인이 있다.
  • 로그인에 성공하면 애플리케이션 서버는 응답으로 사용자에게 토큰을 전달한다.
  • 로그인에 실패한 사용자는 토큰을 전달받지 못해 원하는 리소스에 접근할 수 없게 된다.

💛 인가

  • 인가(authorization)는 앞에서 설명한 인증을 통해 검증된 사용자가 애플리케이션 내부의 리소스에 접근할 때 사용자가 해당 리소스에 접근할 권리가 있는지를 확이하는 과정을 의미한다.
  • 예를 들어 로그인한 사용자가 특정 게시판에 접근해서 글을 보려고 하는 경우 게시판 접근 등급을 확인해 접근을 허가하거나 거부하는 것이 대표적인 인가의 사례이다.
  • 일반적으로 사용자가 인증 단계에서 발급받은 토큰은 인가 내용을 포함하고 있으며, 사용자가 리소스에 접근하면서 토큰을 함께 전달하면 애플리케이션 서버는 토큰을 통해 권한 유무 등을 확인해 인가를 수행한다.

💚 접근 주체

  • 접근 주체(principal)는 말 그대로 애플리케이션의 기능을 사용하는 주체를 의미한다.
  • 접근 주체는 사용자가 될 수도 있고, 디바이스, 시스템이 될 수도 있다.
  • 애플리케이션은 앞서 소개한 인증 과정을 통해 접근 주체가 신뢰할 수 있는지 확인하고, 인가 과정을 통해 접근 주체에게 부여된 권한을 확인하는 과정 등을 거친다.

Spring Security

🧡 스프링 시큐리티의 동작 구조

  • 위 그림의 필터체인(FilterChain)은 서블릿 컨테이너에서 관리하는 ApplicationFilterChain을 의미한다.
  • 클라이언트에서 애플리케이션으로 요청을 보내면 서블릿 컨테이너는 URI를 확인해서 필터와 서블릿을 매핑한다.
  • 사용하고자 하는 필터체인을 서블릿 컨테이너의 필터 사이에서 동작시키기 위해 아래와 같이 DelegatingFilterProxy를 사용한다.

  • DelegatingFilterProxy는 서블릿 컨테이너의 생명주기와 스프링 애플리케이션 컨텍스트(ApplicationContext) 사이에서 다리 역할을 수행하는 필터 구현체이다.
  • 표준 서블릿 필터를 구현하고 있으며, 역할을 위임할 필터체인 프록시(FilterChainProxy)를 내부에 가지고 있다. 필터체인 프록시는 스프링 부트 자동 설정에 의해 자동 생성된다.
  • 필터체인 프록시는 스프링 시큐리티에서 제공하는 필터로서 보안 필터체인(SecurityFilterChain)을 통해 많은 보안 필터를 사용할 수 있다.

별도의 설정이 없다면 스프링 시큐리티에서는 아래와 같이 SecurityFilterChain에서 사용하는 필터 중 UsernamePasswordAuthenteicationFilter를 통해 인증을 처리한다.

위 그림의 인증 수행 과정은 다음과 같다.

  1. 클라이언트로부터 요청을 받으면 서블릿 필터에서 SecurityFilterhain으로 작업이 위임되고 그중 UsernamePasswordAuthenticationFilter(위 그림에서 AuthenticationFilter에 해당)에서 인증을 처리한다.
  2. AuthenticationFilter는 요청 객체(HttpServletRequest)에서 usernamepassword를 추출해서 토큰을 생성한다.
  3. 그러고 나서 AuthenticationManager에게 토큰을 전달한다. AuthenticationManager는 인터페이스이며, 일반적으로 사용되는 구현체는 ProviderManager이다.
  4. ProviderManager는 인증을 위해 AuthenticationProvider로 토큰을 전달한다.
  5. AuthenticationProvider는 토큰의 정보를 UserDetailsService에 전달한다.
  6. UserDetailsService는 전달받은 정보를 통해 데이터베이스에서 일치하는 사용자를 찾아 UserDetails 객체를 생성한다.
  7. 생성된 UserDetails 객체는 AuthenticationProvider로 전달되며, 해당 Provider에서 인증을 수행하고 성공하게 되면 ProviderManager로 권한을 담은 토큰을 전달한다.
  8. ProviderManager는 검증된 토큰을 AuthenticationFilter로 전달한다.
  9. AuthenticationFilter는 검증된 토큰을 SecuritycontextHolder에 있는 SecurityContext에 저장한다.

JWT

https://velog.io/@sunlake123/JWT


🧡 UserDetailsUserDetailsService 구현

public interface UserDetails extends Serializable {
	
    Collection<? extends GrantedAuthority> getAuthorities();
    
    String getUsername();
    
    String getPassword();
    
    boolean isAccountNonExpired();
    
    boolean isAccountNonLocked();
    
    boolean isCredentialsNonExpired();
    
    boolean isEnabled();
}
  • getAuthorities() : 계정이 가지고 있는 권한 목록을 리턴.
  • getPassword() : 계정의 비밀번호를 리턴.
  • getUsername() : 계정의 이름을 리턴한다. 일반적으로 아이디를 리턴.
  • isAccountNonExpired() : 계정이 만료됐는지 리턴. true는 만료되지 않았다는 의미.
  • isAccountNonLocked() : 계정이 잠겨있는지 리턴. true는 잠기지 않았다는 의미.
  • isCredentialsNonExpired() : 비밀번호가 만료됐는지 리턴한다. true는 만료되지 않았다는 의미.
  • isEnabled() : 계정이 활성화돼 있는지 리턴한다. true는 활성화 상태를 의미.
profile
개발자를 향해

0개의 댓글

관련 채용 정보