-
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에 대한 대비책 역할을 합니다.
위에서 말한 구조를 바탕으로 클래스 다이어그램으로 나타내면 아래와 같습니다.
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/
반응형'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