jhhan의 블로그

Spring - Security 본문

보안관련

Spring - Security

jhhan000 2020. 2. 28. 10:48

Spring에 대해 배우다 보니 Security도 다뤄야 할 부분이 생겨서

Security도 어느정도 정리하려고 합니다.

 

** Security부분이어서 보안관련 탭으로 이동했습니다...

 

이번 글은 아래의 블로그를 참조했습니다.

https://coding-start.tistory.com/153

 

Spring boot - Spring Security(스프링 시큐리티) 란? 완전 해결!

오늘 포스팅할 내용은 Spring Security이다. 사실 필자는 머리가 나빠서 그런지 모르겠지만, 아무리 구글링을 통해 스프링 시큐리티를 검색해도 이렇다할 명쾌한 해답을 얻지 못했다. 대부분 이론적인 설명들은..

coding-start.tistory.com

 

Security

  • Spring 기반의 애플리케이션의 보안을 담당하는 Spring 하위 프레임워크이다.
  • 주로 서블릿 필터와 이들로 구성된 필터체인으로의 위임모델을 사용합니다.
  • 보안과 관련해서 많은 옵션을 제공하므로 보안관련 로직 작성을 생각하지 않으셔도 됩니다.

 

보안용어

  • 접근 주체(Principal) : 보호된 리소스에 접근하는 대상
  • 인증(Authentication) : 보호된 리소스에 접근한 대상에 대해 유저가 누구인지, 작업을 수행해도 되는 주체인지 확인하는 과정

  • 인가(Authorize) : 해당 리소스에 대해 접근 권한을 가지고 있는지 확인

  • 권한 : 어떤 리소스에 대한 접근 제한.  인가과정에서 해당 리소스에 대한 제한된 최소한의 권한을 가졌는지 확인

Security Filter

  • SecurityContextPersistenceFilter : SecurityContextRepository에서 SecurityContext를 가져오거나 저장하는 역할

  • LogoutFilter : 설정된 로그아웃 URL로 오는 요청 감시, 해당 유저 로그아웃 처리

  • (UsernamePassword)AuthenticationFilter : 설정된 로그인 URL로 오는 요청 감시, 유저 인증 처리 (form 기반 인증)

    • AuthenticationManager를 통한 인증 실행

    • 성공 시 : Authentication객체를 SecurityContext에 저장 후 AuthenticationSuccessHandler 실행

    • 실패 시 : AuthenticationFailureHandler 실행

  • DefaultLoginPageGeneratingFilter : 인증을 위한 로그인폼 URL감시

  • BasicAuthenticationFilter : HTTP 기본인증 헤더 감시

  • RequestCacheAwareFilter : 로그인 성공 후, 원래 요청 정보를 재구성하기 위해 사용

  • SecurityContextHolderAwareRequestFilter :  HttpServletRequestWrapper 상속

  • SecurityContextHolderAwareRequestWapper : 클래스, HttpServletRequest 정보를 감싼다.

  • SecurityContextHolderAwareRequestWrapper : 클래스, 필터 체인상의 다음 필터들에게 부가정보 제공

  • AnonymousAuthenticationFilter : 이 필터가 호출되기 전까지 사용자 정보가 인증되지 않았다면 인증토큰에 사용자가 익명 사용자로 나타난다.

  • SessionManagementFilter : 인증된 사용자와 관련된 모든 세션 추적

  • ExceptionTranslationFilter : 보호된 요청을 처리하는 중에 발생할 수 있는 예외를 위임 혹은 전달 역할

  • FilterSecurityInterceptor : AccessDecisionManager로 권한부여 처리를 위임 -> 접근제어 결정을 쉽게 해준다.

 

Authentication

  • 접근 주체는 Authentication객체를 생성합니다.

  • 이 객체는 SecurityContext에 보관되고 사용됩니다.

 

AuthenticationManager

  • 유저의 요청을 AuthenticationFIlter에서 Authentication객체로 변환합니다.

  • AuthenticationManager(ProviderManager)에게 넘겨준 후

  • AuthenticationProvider(DaoAuthenticationProvider)가 실제 인증 한 후

  • 인증이 완료되면 Authentication객체를 반환합니다.

  • Spring Security는 ProviderManager라는 AuthenticationManager인터페이스의 유일한 구현체를 제공합니다.

  • ProviderManager는 하나 또는 여러개의 AuthenticationProvider 구현체 사용이 가능합니다.

 

비밀번호 인증과정

  • DaoAuthenticationProvider는 UserDetailsService 타입 오브젝트로 위임합니다.

  • UserDetailsService는 UserDetails 구현체를 리턴하는 역할입니다.

  • UserDetails와 Authentication은 유사하지만 목적이 다른 인터페이스입니다.

    • Authentication : 아이디, 패스워드와 인증 요청 컨텍스트에 대한 정보를 가지고 있습니다. 인증 이후 사용자 상세정보와 같은 UserDetails 타입 오브젝트를 포함할 수 있습니다.

    • UserDetails : 이름, 이메일, 전화번호 가틍ㄴ 사용자 프로필 정보를 저장하기 위한 용도입니다.

 

인증 예외

  • AuthenticationException을 상속한다.

  • AuthenticationException은 두개의 멤버 필드를 가집니다.

    • authentication : 인증 요청 관련 Authentication객체를 저장합니다.

    • extraInformation : 인증 예외 관련 부가 정보를 저장합니다.

  • 대표적인 예외들

    • BadCredentialsException : 사용자 아이디가 전달되지 않거나 인증 저장소의 사용자 아이디에 해당하는 패스워드가 일치하지 않을 경우 발생합니다.

    • LockedException : 사용자 계정이 잠긴 경우 발생합니다.

    • UsernameNotFoundException : 인증 저장소에 사용자 ID를 찾을 수 없거나 사용자 ID에 부여된 권한이 없을 경우 발생합니다.

 

접근권한 부여

  • Spring Security 필터 체인의 마지막 서블릿 필터 = FilterSecurityInterceptor

  • 이 필터는 해당 요청의 수락 여부를 결정합니다.

  • FilterSecurityInterceptor가 실행되는 시점에서 이미 사용자가 인증되어 있을 것이기 때문에 유효한 사용자인지도 확인합니다.

  • AccessDecisionManager라는 컴포넌트가 인증 확인 처리합니다.

  • AccessDecisionManager인터페이스는 인증확인을 위해 2개의 메소드 제공

    • supports : AccessDecisionManager구현체는 현재 요청을 지원하는지의 여부를 판단하는 2개의 메소드 제공. 파라미터는 하나는 java.lang.Class, 다른 하나는 ConfigAttribute 타입

    • decide : 요청 컨텍스트와 보언 설정을 참조하여 접근 승인 여부 결정.  리턴값이 없지만 접근 거부를 의미하는 예외 던짐->요청 거부된것을 알림

  • 특정 타입의 예외클래스를 사용하면 권한처리하는 애플리케이션의 동작을 좀더 세밀하게 제어 가능합니다.

  • AccessDecisionManager는 표준 스프링 빈 바인딩과 레퍼런스로 설정 가능(디폴트)

  • AccessDecisionManager 구현체는 AccessDecisionVoter와 Vote 취합기반 접근 승인 방식 제공함

  • Voter는 권한 처리 과정에서 다음을 평가한다.

    • 보호된 리소스에 대한 요청 컨텍스트(URL을 접근하는 IP주소)

    • 사용자가 입력한 비밀번호

    • 접근하려는 리소스

    • 시스템에 설정된 파라미터와 리소스

  • Voter는 사용할 수 있는 정보를 사용해서 사용자의 리소스에 대한 접근 허가 여부를 판단합니다.

  • 세가지 중 한 가지를 결정

    • Grant(ACCESS_GRANT) : 접근 권한을 허가하도록 권장

    • Deny(ACCESS_DENY) : 접근 권한을 거부하도록 권장

    • Abstain(ACCESS_ABSTAIN) : 접근 권한 결정을 보류

'보안관련' 카테고리의 다른 글

Spring Security(2)  (0) 2020.04.23
CSRF  (0) 2020.03.03