티스토리 뷰

스프링 시큐리티 설정 자체는 간단(?)하지만, 스프링 시큐리티가 지원하지 않는 인증 방식을 사용한다거나 

HttpSession이 아닌 다른 장소에 인증 객체를 보관하기 위해서는 스프링 시큐리티의 동작 방식을 이해하고 

그 중 필요한 부분의 기능을 알맞게 변경할 수 있어야 한다. 

 

1. SecurityContext, SecurityContextHolder, Authentication

▶ 흐름  

org.springframework.security.core.Authentication은 스프링 시큐리티에서 사용자(웹 브라우저, REST로 접근한 외부 시스템)의 보안 관련 정보를 보관하는 역할을 한다. 

 

✔️ 보안 관련 정보란? 

 1. 사용자의 인증 여부

 2. 사용자가 가진 권한(Authority)

 3. 이름 및 접근 주체(principal)에 대한 정보 


 

그럼, 스프링 시큐리티가 위의 Authentication을 사용하려면 Authentication객체를 가져와야 하는데,

이 때 사용하는 것이 org.springframework.security.core.SecurityContextHolder 클래스이다. 

SecurityContext context = SecurityContextHoler.getContext();
Authentication auth = context.getAuthentication();

 


org.springframework.security.core.SecurityContextAuthentication 객체를 보관하는 역할을 한다. 

즉, 스프링 시큐리티는 웹 브라우저로부터 요청이 들어오면

서블릿 필터를 이용해서 SecurityContext에 Authentication 객체를 설정한다. 

 

▶ Authentication 인터페이스 

◈ Authentication 의 2가지 목적

1. AuthenticationManager에 인증을 요청할 때 필요한 정보를 담는 목적 

더보기

스프링 시큐리티는 인증을 위한 목적으로 Authentication 객체를 사용한다. 

AuthenticationManager를 사용해서 인증을 처리하는데, 이 것이 입력으로 받는 값의 타입이 Authentication이다. 

2. 현재 접속한 사용자에 대한 정보를 표현하기 위한 목적 

더보기

현재 사용자에 대한 정보를 표현하기 위해 Authentication 객체를 사용하기도 한다. 

스프링 시큐리티는 SecurityContext에 보관된 Authentication 객체를 가져와, 

이 Authentication 객체가 지정한 URL 경로에 접근할 수 있는지 검사한다. 

따라서, 스프링 시큐리티 프레임워크를 잘 사용하려면 알맞은 Authentication 객체를 생성해주어야 한다. 

 

예를 들어, 스프링 시큐리티는 UsernamePasswordAuthenticationToken 클래스를 제공하는데, 

이 클래스는 사용자의 아이디와 암호를 이용해서 인증을 처리할 때 사용되는 Authentication 구현체이다. 

또한, AnonymousAuthenticationToken 클래스는 아직 인증을 거치지 않은 사용자를 표현하기 위한 구현체로 사용된다. 즉, 스프링 시큐리티는 이미 다양한 상황에 맞게 사용할 구현 클래스를 제공하고 있지만, 직접 구현해야 할 때도 있다. 


2. 보안 필터 체인 

스프링을 이용한 웹 보안 처리에서 핵심 요소 중의 하나는 보안 필터 체인이다. 

로그인 폼을 보여준다거나, 접근 권한이 없는 경우 403 상태 코드를 응답하거나, 로그아웃을 하는 등

보안과 관련된 작업을 처리하는 것이 바로 보안 필터 체인이다. 

 

주의 ) 필터의 순서가 중요함. 

▶ 주요 필터 

SecurityContextPersistenceFilter SecurityContext 객체를 SecurityContextHolder에 저장하고, 요청 처리가 끝나면 제거한다. 
UsernamePasswordAuthenticationFilter 지정한 경로로 POST방식 요청이 오면, 아이디/암호 기반의 인증을 수행하고 이후 필터를 진행하지 않는다. 인증에 성공하면 지정한 페이지로 이동하고, 아니면 다시 로그인 폼을 보여준다. 

 


3. AuthenticationManager의 인증 처리 

스프링 시큐리티는 인증이 필요할 때 org.springframework.security.authentication.AuthenticationManager를 이용한다. 

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

▶ authenticate() 메서드는 인증하는데 필요한 정보를 담은 Authentication 객체를 입력으로 전달받는다. 

인증에 성공하면 인증 정보를 담은 Authentication 객체를 리턴하고, 그렇지 않을 경우 익셉션을 발생한다. 

 

일반적으로 사용자 이름(아이디)와 암호를 사용해서 인증한다. 

스프링 시큐리티는 UsernamePasswordAuthenticationToken Authentication의 기본 구현체로 사용하고 있다.