Spring/초기 setting

5) 스프링 시큐리티(spring-security) 개요

쿠카이든 2023. 4. 5. 15:41
728x90
  • 스프링 시큐리티(Spring Security) 개요
    • Spring Security는 Spring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크이다.
    • Spring Security는 '인증'과 '권한'에 대한 부분을 Filter 흐름에 따라 처리하고 있다.
      • Filter는 Dispatcher Servlet으로 가기 전에 적용되므로 가장 먼저 URL 요청을 받지만, Interceptor는 Dispatcher와 Controller사이에 위치한다는 점에서 적용 시기의 차이가 있다.
    • Spring Security는 보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 일일이 보안관련 로직을 작성하지 않아도 된다는 장점이 있다.

처리과정 (출처 : GitHub - VitoJeong/SpringBoot )

  1.  

아래 내용은 https://github.com/beaver84/setting-test 에서 실제 소스를 확인할 수 있습니다.

  1. HTTP 요청 수신 (Http Request) 및 AuthenticationFilter 통과
    • Spring Security 는 일련의(연결된) 필터들을 가지고 있다.
    • 요청(request)은, 인증(Authentication)과 권한부여(Authorization)를 위해 이 필터들을 통과하게 된다.
    • 이 필터를 통과하는 과정은, 해당 요청과 관련된 인증 필터(인증 메커니즘/모델에 기반한 관련 인증 필터)를 찾을 때 까지 지속된다.
    예) HTTP Basic - `BasicAuthenticationFilter`
    로그인 form submit - `UsernamePasswordAuthenticationFilter`
  2. 사용자 자격 증명을 기반으로 AuthenticationToken 생성
    • 인증 요청이 관련 AuthenticationFilter에 의해 수신되면 수신된 요청에서 사용자 이름과 비밀번호를 추출한다.
    • 추출된 사용자 자격 증명(credentials)을 기반으로 인증개체를 만든다
    • 추출된 자격 증명(credentials)을 통해 UsernamePasswordAuthenticationToken이 생성된다.
  3. AuthenticationManager를 위해 생성된 AuthenticationToken 위임
    • 만들어진 UsernamePasswordAuthenticationTokenAuthenticaionManager의 인증 메서드를 호출하는데 사용됨
    • AuthenticaionManager는 단순한 인터페이스이며 실제 구현은 ProviderManager 이다.
    public interface AuthenticationManager {
        Authenticaion authenticate(Authentication authentication) throw AuthenticaionException;
    }
    
    • ProviderManager에는 사용자 요청을 인증에 필요한 AuthenticationProvdier 목록이 있다.
    • ProviderManager는 제공된 각 AuthenticationProvdier를 살펴보고 전달된 인증 개체(UsernamePasswordAuthenticationToken)를 기반으로 사용자 인증을 시도한다.
  4. AuthenticationProvier 목록으로 인증 시도
    • AuthenticationProvider 는 제공된 인증 개체로 사용자를 인증한다
    public interface AuthenticationProvider {
        Authentication authenticate(Authentication authentication) throws AuthenticationException;
        boolean supports(Class<?> authentication);
    }
    
    즉, authenticate 메소드는 통과하는 무언가가 지원되는 형식(Class<? extends Authentication>)인지 확인한다.
  5. UserDetailsService (옵션 - customize)
    • 일부 AuthenticationProvider는 사용자 이름(username)을 기반으로 사용자 세부 정보를 검색하기 위해 UserDetailSesrvice를 사용할 수 있다.
    public interface UserDetailService {
        UserDetail loadUserByUsername(String username) throws UsernameNotFoundException;
    }
    
  6. UserDetails (옵션 - customize)
  7. User (옵션 - customize)
    • 5번의 예제 코드에 사용된 UserDetail은 사용자 정보(User)를 담고 있는 인터페이스이면 될 것이다.
  8. AuthenticationException
    • AuthenticationProvider 인터페이스에 의해 사용자가 성공적으로 인증되면 완전히 채워진 인증개체가 반환된다.
    • 그렇지 않으면 AuthenticationException가 발생한다.
    • AuthenticationException가 발생하면 인증 메커니즘을 지원하는 AuthenticationEntryPoint에 의해 처리된다.
  9. 인증 완료!
    • AuthenticationManager는 획득한 완전히 채워진 인증객체를 관련 인증 필터로 다시 반환한다.
  10. SecurityContext 에서 인증 객체 설정
    • 관련 AuthenticationFilter는 향후 필터 사용을 위해 획득한 인증 객체를 SecurityContext에 저장한다.
    SecurityContextHolder.getContext().setAuthentication(authentication);

 

출처 : https://github.com/VitoJeong/SpringBoot

 

GitHub - VitoJeong/SpringBoot

Contribute to VitoJeong/SpringBoot development by creating an account on GitHub.

github.com

 

728x90

'Spring > 초기 setting' 카테고리의 다른 글

mapStruct 소개 및 활용  (0) 2023.04.10
6) 스프링 시큐리티(spring-security) 적용  (0) 2023.04.05
4) Querydsl 설정  (2) 2023.03.20
3) JPA 다중 스키마 설정  (0) 2023.03.19
2) MyBatis 3.0 다중 스키마 설정  (0) 2023.03.19