ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Security 정리
    Java/Spring 2019. 10. 5. 16:28
    반응형

    Spring Security

     Spring Security는 SpringFramework의 하위 프로젝트이며, 애플리케이션의 복잡한 보안 기능을 구현할 수 있도록 도와주는 프레임워크입니다. Spring Security는 다양한 옵션을 제공하여 커스터마이징 할 수 있습니다. 그렇기때문에 기본 동작 방식외에도 필요한 보안 요구사항을 추가로 구현할 수 있습니다.


    Spring Security의 주요 개념

     Spring Security에는 알아두어야할 개념이 있습니다.

     

    - Authentication (인증)

    Authentication은 주체(principal)의 신원을 증명하는 과정입니다. 예를 들자면 사용자가 애플리케이션을 이용하기 위해 로그인을 진행하는 것과 같습니다.

     

    - Authorization (인가)

     Authorization은 인증을 마친 사용자에게 권한을 부여하여 특정 리소스에 접근할 수 있도록 허가하는 과정입니다. 인가는 인증 과정 이후에 수행되어야 하며 권한은 Role의 형태로 부여하는게 일반적입니다.

     


    Authentication

     인증에 관한 주요 전략 인터페이스는 AuthenticationManager 입니다. AuthenticationManager 는 authenticate() 메서드를 통해 다음과 같이 세 가지 일을 수행할 수 있습니다.

    • 입력된 값들이 유효한 주체라고 확인이 된다면 Authentication 객체를 반환합니다.
    • 입력된 값들이 유효하지 않은 주체라면 AuthenticationException 예외를 발생시킵니다.
    • 위의 두 가지를 결정할 수 없다면 null 을 반환합니다.

    AuthenticationException 예외는 런타임 예외입니다.

    public interface AuthenticationManager {
    
      Authentication authenticate(Authentication authentication)
        throws AuthenticationException;
    
    }

     


     

     AuthenticationManager의 가장 일반적인 구현체는 ProviderManager 입니다. ProviderManager는 AuthenticationProvider 인스턴스들에게 위임합니다. AuthenticationProvider 는 AuthenticationManager 와 유사하지만, authenticate() 메서드에 전달되는 인자가 지원되는 타입의 인자인지 확인하는 supports() 메서드를 추가적으로 제공함으로써 차이점을 보입니다.

    public interface AuthenticationProvider {
    
    	Authentication authenticate(Authentication authentication)
    			throws AuthenticationException;
    
    	boolean supports(Class<?> authentication);
    
    }

    supports() 의 Class<?> 인자는 실제로 Class<? extends Authentication> 와 같습니다. 이는 supports() 메서드에서 통과된 타입이authenticate() 메서드의 Authentication 인자로 받아야하기 때문입니다.

     ProviderManager 는 AuthenticationProvider 들에게 위임을 함으로써, 같은 애플리케이션 내에 서로 다른 여러 인증 메커니즘을 지원할 수 있습니다. 만약 ProviderManager 가 Authentication 타입을 인식하지 못한다면 해당 인증은 스킵될 것입니다.

     

     애플리케이션은 보호되는 자원의 논리적 그룹을 가지고 있고, 각 그룹은 AuthenticationManager 를 가질 수 있습니다.

     AuthenticationManager는 해당 구현체인 ProviderManager 이고, 이들은 같은 부모를 공유합니다. 부모 ProviderManager 는 글로벌한 리소스로, 모든 provider에 대한 대비책 역할을 합니다.

    출처 : https://spring.io/guides/topicals/spring-security-architecture

     


     

     위에서 말한 구조를 바탕으로 클래스 다이어그램으로 나타내면 아래와 같습니다.

    출처 : https://minwan1.github.io/2017/03/25/2017-03-25-spring-security-theory/

     

     AuthenticationManager 의 구현체로는 ProviderManager 클래스가 있습니다. ProviderManager 는 인증에 대한 구현을 AuthenticationProvider 에게 위임하고, 저희는 애플리케이션 서비스에 맞게 AuthenticationProvider 를 구현하여 사용하면 됩니다.

     


     

    Authentication

     Spring Security 에서 Authentication은 다음과 같은 역할을 합니다.

    • 현재 접근 주체 정보를 담는 역할
    • 인증 요청을 할 때, 요청 정보를 담는 역할

    SecurityContext

     Authentication 을 보관하는 역할을 합니다. Spring Security 는 현재 사용자에 대한 Authentication 객체를 구할 때, SecurityContext로부터 구할 수 있습니다.

     

    SecurityContextHolder

     SecurityContext를 보관합니다. 이를 바탕으로 Authentication 객체를 얻는 코드를 나타내면 아래와 같이 작성할 수 있습니다.

    Authentication auth = SecurityContextHolder.getContext().getAuthentication();

     


    참고 자료

    https://spring.io/guides/topicals/spring-security-architecture

    https://minwan1.github.io/2017/03/25/2017-03-25-spring-security-theory/

    https://tramyu.github.io/java/spring/spring-security/

    https://www.slideshare.net/madvirus/ss-36809454

    반응형

    'Java > Spring' 카테고리의 다른 글

    [Spring Boot] JSP 설정하기  (0) 2019.12.04
    [Spring Security] CORS 에 대하여  (0) 2019.11.11
    [Spring] @Transactional 속성 정리  (0) 2019.09.06
    JWT 에 대한 간단 정리  (0) 2019.08.04
    Spring AOP PointCut 표현식 정리  (0) 2019.07.21

    댓글

Designed by Tistory.