코드짜는 노인네

[Spring] Spring Security 이해 본문

spring

[Spring] Spring Security 이해

ikohong 2022. 8. 22. 04:07
728x90
반응형

[Spring] Spring Security 이해


스프링 시큐리티(Spring Security)

스프링 기반의 애플리케이션의 보안 (인증과 인가 등)을 담당하는 스프링 하위 프레임 워크입니다. 주로 서블릿 필터(filter)와 이들로 구성된 필터체인으로 구성된 위임모델을 사용합니다.

  • 인증(Authenticate) : 유저가 누구인지 확인하는 절차
  • 인가(Authorize) : 유저에 대한 권한을 허락하는 절차
Spring Security 특징
  • Filter 기반으로 동작하여 MVC와 분리하여 관리 및 동작
  • 어노테이션(@)을 통한 간단한 설정
  • 세션 & 쿠키 방식으로 인증
  • 라이브러리 추간만으로 login/logout 기능 제공
  • SecurityConfig 와 UserDetailsService 를 통해 인증 환경 커스텀 가능
기본용어
  • 접근 주체 (Principal)
    • 보호된 리소스에 접근하는 대상
  • 인증 (Authentication)
    • 보호된 리소스에 접근한 대상이 누구인지, 애플리케이션의 작업을 수행해도 되는 주체인지 확인하는 과정
    • 실질적으로 인증정보를 담고 있는 객체
  • 인가 (Authorize)
    • 해당 리소스에 대한 접근 권한을 가지고있는지 확인하는 과정
  • 권한
    • 일부 리소스에 대한 접근 제한, 모든 리소스에 접근 제어 권한이 걸려있으며, 인가 (Authorize) 과정에서 해당 리소스에 대한 제한된 최소한의 권한을 가졌는지 확인
인증정보를 담고 있는 객체
Principal
  • 인증 주체에 대한 정보를 담고 있는 객체
/**
 * 회원 페이지 (인증필요, USER 이상의 권한 접근 가능)
 */
// Controller
 @GetMapping("/user")
 public String user(Model model, Principal principal) {
    // Principal을 통해 인증 주체가 누구인지 알 수 있다.
    model.addAttribute("username", principal.getName());
    return "/user";
 }
 
// HTML (타임리프)
<title>User 페이지</title>
</head>
<body>
    <h1>회원 화면</h1>
    <p>th:text="${username}" 님 환영합니다.</p>
</body>
Authentication
  • 실질적으로 인증정보를 담고 있는 객체
Principal - 접근하는 대상이 누군지에 대한 정보를 담고 있는 객체
- 로그인_ID에 해당하는 값을 담고 있다.
Credentials - 인증자격에 대한 정보를 담고 있는 객체
- 비밀번호와 같은 암호 값을 담고 있다.
Authorities - 현재 유저의 권한(ROLE)정보를 담은 객체
SecurityContextHolder
  • 시큐리티가 최종적으로 제공하는 객체

Spring Security 구조
  • UsernamePasswordAnthenticationFilter : 인증 관리자
  • FilterSecurityInterceptor : 접근 결정 관리자

각 필터별 기능 설명
  • SecurityContextPersistenceFilter
    • SecurityContextRepository에서 SecurityContext를 로드하고 저장하는 일을 담당
    • 인증된 SecurityContext를 세션에 캐시하는 필터
      • 인증 전 세션에 인증정보가 있는지 체크
      • 세션에 정보가 있으면 복구해서 재사용(로그인 유지)
      • 세션에 정보가 없으면, 인증을 실행
인증 흐름
  1. SecurityContextPersistenceFilter에서 로그인이 됐는 지 세션체크 (있으면 세션정보로 로그인처리)
  2. [1]이 없는 경우 UsernamePasswordAuthenticationFilter로 폼인증 시작 (AuthenticationManager) 호출
  3. ProviderManager(&AuthenticationManager)를 통해 인증처리
  4. UsernamePasswordAuthenticationFilter를 통해 SecurityContextHolder 객체로 리턴
  5. SecurityContextPersistenceFilter를 통해 인증정보를 세션에 담는다.

  • LogoutFilter
    • 로그아웃 URL로 지정된 가상 URL에 대한 요청을 감시하고 매칭되는 요청이 있으면 사용지를 로그아웃시킴

  • UsernamePasswordAuthenticationFilter
    • 사용자명과 비밀번호로 이뤄진 폼기반 인증에 사용하는 가상 URL요청을 감시하고 요청이 있으면, 사용자의 인증을 진행한다.
    • 해당 필터에서 AuthenticationManger를 호출
      • 여기서 AuthenticationManger 란?
        • 인증 처리 관련 인터페이스
        • authenticate(Authentication authentication) 메서드를 통해 인증을 구현한다.
    • 인증 후 받은 Authentication 객체를 SecurityContextHolder로 포장
참고 - 인증처리의 흐름

 

[ProviderManager > authenticate(Authentication)]

  ProviderManager 클래스
  - AuthenticationManager의 구현체
  - 실제 인증을 처리한다.
  1. 인자로 받은 로그인 정보로 userDetailsService의 User정보를 가져온다.
  2. 가져온 정보에 대한 유효성 검증(계정잠김, 만료여부 등)
  3. 이상이 없다면 Authentication 객체로 리턴

물론 처리 과정에서 다른 클래스들을 거치기도 한다.

  • DaoAuthenticationProvider
    • userDetailsService 접근할 때
  • AbstractUserDetailsAuthenticationProvider
    • 유효성 검증 할 때

  • DefaultLoginPageGeneratingFilter
    • 폼기반 또는 OpenID 기반 인증에 사용하는 가상URL에 대한 요청을 가시하고 로그인 폼 기능을 수행하는데 필요한 HTML을 생성

  • BasicAuthenticationFilter
    • HTTP 기본 인증 헤더를 감시하고 이를 처리함

  • RequestCacheAwareFilter
    • 로그인 성공 이후 인증 요청에 의해 가로채어진 사용자의 원래 요청을 재구성하는데 사용

  • AnonymousAuthenticationFilter
    • 이 필터가 호출되는 시점까지 사용자가 아직 인증을 받지 못했다면 요청 관련 인증 토큰에서 사용자가 익명 사용자로 나타나게 됨

  • SessionManagementFilter
    • 인증된 주체를 바탕으로 세션 트래킹을 처리해 단일 주체와 관련한 모든 세션들이 트래킹되도록 도움

  • ExceptionTranslationFilter
    • Spring Security에서 인증/인가 예외 처리 필터

  • FilterSecuritylnterceptor
    • AccessDecisionManager를 통해 인가 혹은 예외를 던진다
      • AccessDecisionManager 인터페이스
        • 인가 처리 관련 인터페이스
        • 인가 결정을 내리는 인터페이스로 3가지 구현체를 제공
          • Voter : 의사결정을 내리는데 사용되는 수단
          1. AffirmativeBased
            • 여러 Voter중에 하나라도 충족하면 허용
            • 기본전략
          2. ConsensusBased : 다수결
          3. UnanimousBased : 만장일치
        • decide() 메서드를 통해 인가로직 구현
        • supports(ConfigAttribute attribute)
          • hasRole(), permitAll()과 같은 설정을 확인하는 메서드
    • 권한부여와 관련한 결정을 AccessDecisionManager에게 위임해 권한부여 결정 및 접근 제어 결정을 쉽게 만들어줌

시큐리티가 기본적으로 제공하는 필터들
설정에서 특정 필터를 비활성하거나, 사용자 정의 필터를 추가하지 않는다면, 아래의 15개의 필터를 기본적으로 활성화한다.
  1. WebAsyncManagerIntergrationFilter
  2. SecurityContextPersistenceFilter
  3. HeaderWriterFilter
  4. CsrfFilter
  5. LogoutFilter
  6. UsernamePasswordAuthenticationFilter
  7. DefaultLoginPageGeneratingFilter
  8. DefaultLogoutPageGeneratingFilter
  9. BasicAuthenticationFilter
  10. RequestCacheAwareFtiler
  11. SecurityContextHolderAwareReqeustFilter
  12. AnonymouseAuthenticationFilter
  13. SessionManagementFilter
  14. ExeptionTranslationFilter
  15. FilterSecurityInterceptor

 

참고 자료
 

[Spring Security] 스프링시큐리티의 기본 개념과 구조

[Spring Security] 스프링시큐리티의 개념/시작하기 /기본세팅 💡 스프링시큐리티(Spring Security)란? 스프링 시큐리티는 스프링 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프

devuna.tistory.com

 

 

스프링 시큐리티 흐름과 구조

스프링 시큐리티의 인증/인가 흐름과 구조, 스프링 시큐리티가 제공하는 필터들

velog.io

 

728x90
반응형
Comments