PengTory

스프링 시큐리티(Spring Security)의 개념 본문

Spring

스프링 시큐리티(Spring Security)의 개념

펭토리 2023. 1. 2. 22:55

스프링 시큐리티(Spring Security)

스프링 시큐리티는 스프링 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크이다. 즉 인증(Authenticate) 과 인가(Authorize)를 담당하는 프레임워크를 뜻한다.

스프링 시큐리티에서는 주로 서블릿 필터(filter)와 이들로 구성된 필터체인으로의 구성된 위임모델을 사용한다. 그리고 보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 일일이 보안관련 로직을 작성하지 않아도 된다는 장점이 있다.

 

[인증과 인가]- 접근주체 (Principal): 보호된 리소스에 접근하는 대상

- 인증(Authentication): 해당 사용자가 본인이 맞는지 확인하는 절차

- 인가(Authorize): 인증된 사용자가 요청한 자원에 접근 가능한지를 결정하는 절차

- 권한: 인증된 주체가 어플리케이션의 동작을 수행할 수 있도록 허락되었는지를 결정

 

스프링 시큐리티의 구조

인증 관련 architecture

스프링 Security는 기본적으로 세션 & 쿠키 방식으로 인증을 한다.

 

위 과정을 설명해보면 아래와 같다.

  1. 사용자가 로그인 정보와 함께 인증 요청 (HttpRequest)
  2. AuthenticationFilter가 요청을 가로챔. 이때 가로챈 정보를 통해 UsernamePasswordAuthenticationToken 객체 (사용자가 입력한 데이터를 기반으로 생성, 즉 현 상태는 미검증 Authentication) 생성
  3. ProviderManager (AuthenticationManager 구현체) 에게 UsernamePasswordAuthenticationToken 객체를 전달
  4. AuthenticationProvider에 UsernamePasswordAuthenticationToken 객체를 전달
  5. 실제 DB로 부터 사용자 인증 정보를 가져오는 UserDetailsService에 사용자 정보를 넘겨줌
  6. 넘겨받은 정보를 통해 DB에서 찾은 사용자 정보인 UserDetails 객체를 생성
  7. AuthenticationProvider는 UserDetails를 넘겨받고 사용자 정보를 비교
  8. 인증이 완료되면, 사용자 정보를 담은 Authentication 객체를 반환
  9. 최초의 AuthenticationFilter에 Authentication 객체가 반환됨
  10. Authentication 객체를 SecurityContext에 저장

 

스프링 시큐리티의 주요 모듈

Authentication: 현재 접근하는 주체의 정보와 권한을 담는 인터페이스이다. Authentication 객체는 SecurityContext에 저장되며,

SecurityContextHolder를 통해 SecurityContext에 접근하고, SecurityContext를 통해 Authentication에 접근할 수 있다.

 

UsernamePasswordAuthenticationToken: UsernamePasswordAuthenticationToken은 Authentication을 implements한 AbstractAuthenticationToken의 하위 클래스로, User의 ID가 Principal 역할을 하고, Password가 Credential의 역할을 한다. UsernamePasswordAuthenticationToken의 첫 번째 생성자는 인증 전의 객체를 생성하고, 두번째는 인증이 완료된 객체를 생성한다.

 

AuthenticationManager: 인증에 대한 부분은 AuthenticationManager를 통해서 처리하게 되는데, 실질적으로는 AuthenticationManager에등록된AuthenticationProvider에 의해 처리된다. 인증에 성공하면 두번째 생성자를 이용해 객체를 생성하여 SecurityContext에 저장한다. 

 

AuthenticationProvider: AuthenticationProvider에서는 실제 인증에 대한 부분을 처리하는데, 인증 전의 Authentication 객체를 받아서 인증이 완료된 객체를 반환하는 역할을 한다. 아래와 같은 인터페이스를 구현해 Custom한 AuthenticationProvider를 작성하고 AuthenticationManager에 등록하면 된다.

 

ProviderManager: AuthenticationManager를 implements한 ProviderManager는 AuthenticationProvider를 구성하는 목록을 갖는다.

 

UserDetailsService: UserDetailsService는 UserDetails 객체를 반환하는 하나의 메소드만을 가지고 있는데, 일반적으로 이를 implements한 클래스에 UserRepository를 주입받아 DB와 연결하여 처리한다.

 

UserDetails: 인증에 성공하여 생성된 UserDetails 객체는 Authentication객체를 구현한 UsernamePasswordAuthenticationToken을 생성하기 위해 사용된다. UserDetails를 implements하여 처리할 수 있다.

 

SecurityContextHolder: SecurityContextHolder는 보안 주체의 세부 정보를 포함하여 응용프로그램의 현재 보안 컨텍스트에 대한 세부 정보가 저장된다.

 

SecurityContext: Authentication을 보관하는 역할을 하며, SecurityContext를 통해 Authentication을 저장하거나 꺼내올 수 있다.

 

GrantedAuthority: GrantedAuthority는 현재 사용자(Principal)가 가지고 있는 권한을 의미하며,ROLE_ADMIN이나 ROLE_USER와 같이 ROLE_*의 형태로 사용한다. GrantedAuthority 객체는 UserDetailsService에 의해 불러올 수 있고, 특정 자원에 대한 권한이 있는지를 검사하여 접근 허용 여부를 결정한다.

 

 

결론적으로 스프링 시큐리티가 하는 일을 간단히 줄이자면 클라이언트의 요청이 서블릿에 도착하기 전에 여러 필터를 거치는 과정에서 인증, 인가 및 여러 보안 처리를 하는 것이다.

'Spring' 카테고리의 다른 글

JDBC와 JPA 그리고 Hibernate  (0) 2022.12.22
[Spring] 예외  (1) 2022.11.01
[Spring] 템플릿  (0) 2022.10.21
[Spring] 테스트  (0) 2022.10.14
[Spring] 오브젝트와 의존관계 (5) _ XML  (0) 2022.10.14