**SecurityContext**와 **SecurityContextHolder**는 Spring Security의 인증 및 권한 관리에서 중요한 두 가지 개념입니다. 이들은 Spring Security에서 사용자 인증 정보를 유지하고 관리하는 역할을 하며, 애플리케이션의 요청 처리 과정에서 인증된 사용자의 정보를 필요로 하는 곳에 제공합니다.
1. SecurityContext
**SecurityContext**는 Spring Security에서 현재 인증된 사용자 정보를 저장하고 관리하는 인터페이스입니다. 인증된 사용자의 정보를 저장하여 애플리케이션의 어느 부분에서든 인증 상태를 참조할 수 있게 합니다.
주요 역할
• 현재 인증된 사용자 정보 유지: 사용자가 인증을 완료하면 SecurityContext는 인증된 사용자 정보를 Authentication 객체로 저장합니다.
• 권한 관리: SecurityContext에 저장된 사용자 정보에는 사용자의 권한 정보가 포함되어 있어, 요청이 발생할 때 권한에 따라 리소스 접근 여부를 판단할 수 있습니다.
SecurityContext의 구조
• SecurityContext 객체는 보통 Authentication 객체를 포함하며, 이 Authentication 객체가 인증된 사용자 정보, 사용자 권한 등을 관리합니다.
• Authentication: Spring Security의 핵심 인터페이스로, 사용자의 인증 상태와 인증된 사용자 정보를 나타냅니다.
• getPrincipal(): 인증된 사용자 정보 (보통 UserDetails 타입)를 반환합니다.
• getAuthorities(): 사용자의 권한 목록을 반환하여, 접근 제어에 활용됩니다.
• isAuthenticated(): 사용자가 인증된 상태인지 여부를 반환합니다.
SecurityContext 예시
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
public class ExampleService {
public void printAuthenticatedUserInfo() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication.isAuthenticated()) {
System.out.println("Authenticated user: " + authentication.getName());
System.out.println("User authorities: " + authentication.getAuthorities());
}
}
}
이 예시에서 SecurityContextHolder.getContext()를 통해 SecurityContext를 가져와, 현재 인증된 사용자의 정보와 권한을 확인할 수 있습니다.
2. SecurityContextHolder
**SecurityContextHolder**는 현재 스레드에 SecurityContext를 저장하고 관리하는 클래스입니다. Spring Security는 SecurityContextHolder를 통해 인증 정보를 안전하게 보관하고 요청 시마다 이 정보를 참조합니다.
SecurityContextHolder의 역할
• SecurityContext를 관리: SecurityContextHolder는 SecurityContext 객체를 생성, 저장 및 공유합니다. 모든 요청에 대해 인증 정보를 관리하고, 이를 다른 컴포넌트에서 접근할 수 있도록 합니다.
• 스레드와 SecurityContext 연결: 기본적으로 SecurityContextHolder는 스레드 로컬(ThreadLocal) 방식을 사용하여, 각 요청마다 고유한 SecurityContext를 유지합니다.
• 각 요청마다 SecurityContext가 스레드에 저장되므로, 여러 요청이 동시에 발생해도 각 요청의 SecurityContext가 독립적으로 관리됩니다.
SecurityContextHolder의 작동 방식
• ThreadLocal 방식: Spring Security는 기본적으로 ThreadLocal을 통해 SecurityContext를 관리합니다. 이는 각 스레드마다 SecurityContext를 독립적으로 저장하는 방식으로, 웹 요청이 종료되면 SecurityContextHolder는 해당 요청의 SecurityContext를 제거합니다.
• 전역(모드) 설정: SecurityContextHolder는 모드에 따라 ThreadLocal, InheritableThreadLocal, 또는 사용자 정의 전략을 선택할 수 있습니다.
• MODE_THREADLOCAL(기본 모드): ThreadLocal을 사용하여 각 요청마다 고유의 SecurityContext를 보관합니다.
• MODE_INHERITABLETHREADLOCAL: 부모 스레드의 SecurityContext를 자식 스레드로 전달할 수 있습니다. 일반적인 웹 애플리케이션에서는 잘 사용되지 않습니다.
• MODE_GLOBAL: 애플리케이션 전체에서 하나의 SecurityContext를 공유합니다. 테스트나 특수한 상황에만 사용됩니다.
SecurityContextHolder의 설정 변경 예시
import org.springframework.security.core.context.SecurityContextHolder;
public class SecurityConfig {
public void configureSecurityContextHolder() {
// MODE_INHERITABLETHREADLOCAL 설정
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
}
}
SecurityContext와 SecurityContextHolder의 상호작용
Spring Security에서 **SecurityContext**와 **SecurityContextHolder**는 인증된 사용자 정보를 요청과 연계하는 방식으로 상호작용합니다.
1. 인증 과정에서 SecurityContextHolder 설정:
• 사용자가 로그인하면, AuthenticationManager는 사용자의 자격 증명을 확인한 후 Authentication 객체를 생성합니다.
• 이 Authentication 객체는 SecurityContext에 저장되고, SecurityContextHolder를 통해 관리됩니다.
• 이후 모든 요청에서 SecurityContextHolder를 통해 인증된 사용자의 정보를 참조할 수 있습니다.
2. 요청 중 SecurityContextHolder 참조:
• 애플리케이션의 비즈니스 로직이 실행되는 동안, 필요할 때 SecurityContextHolder를 통해 현재 요청의 SecurityContext를 가져올 수 있습니다.
• 이를 통해 인증된 사용자 정보와 권한을 확인하고, 필요한 작업을 수행할 수 있습니다.
3. 요청 종료 시 SecurityContext 정리:
• 웹 요청이 종료되면 SecurityContextPersistenceFilter가 SecurityContext를 정리하고, SecurityContextHolder의 값을 제거하여 메모리 누수를 방지합니다.
• 이러한 정리 작업은 요청마다 SecurityContext가 고유하게 유지되도록 보장합니다.
요약
1. SecurityContext:
• 현재 인증된 사용자의 정보를 저장하는 컨테이너로, Authentication 객체를 포함합니다.
• 인증 정보는 사용자가 인증을 완료한 후 저장되며, 요청이 끝날 때까지 참조됩니다.
2. SecurityContextHolder:
• SecurityContext를 관리하는 싱글톤 클래스입니다.
• ThreadLocal을 통해 각 요청마다 고유한 SecurityContext를 관리하며, 다른 요청과의 독립성을 유지합니다.
• Spring Security의 다른 컴포넌트들이 SecurityContext에 접근할 수 있도록 중앙에서 관리 역할을 수행합니다.
결론적으로, SecurityContext와 SecurityContextHolder는 Spring Security의 인증 상태를 요청마다 안전하게 관리하고, 요청 중에 인증된 사용자 정보에 접근할 수 있도록 도와줍니다.
HTTP 요청과 스레드 처리 방식
1. 스레드 풀(Thread Pool):
• 서버는 미리 설정된 수의 스레드를 가진 스레드 풀을 유지합니다. 이 스레드 풀에서 빈 스레드를 할당하여 HTTP 요청을 처리합니다.
• 요청이 완료되면 스레드는 스레드 풀로 돌아가고, 다음 요청에서 다시 사용될 수 있습니다.
• 스레드 풀을 사용함으로써 서버는 매번 스레드를 생성하거나 소멸시키지 않고도 많은 요청을 효과적으로 처리할 수 있습니다.
2. 멀티 스레드 방식:
• 각 HTTP 요청은 스레드 풀에서 할당된 개별 스레드에서 처리됩니다. 따라서 다중 요청을 병렬로 처리할 수 있습니다.
• 스레드 풀 크기를 초과하는 요청이 들어올 경우, 대기 큐에 요청을 저장했다가 스레드가 비면 처리하게 됩니다.
3. 스레드 관리의 예 (Spring과 Tomcat):
• Spring Boot가 내장 Tomcat을 사용하여 웹 애플리케이션을 실행하는 경우, Tomcat의 기본 설정으로 스레드 풀이 구성됩니다.
• 예를 들어, 기본적으로 Tomcat은 최대 200개의 요청을 동시에 처리할 수 있도록 설정되어 있습니다(maxThreads 속성으로 조정 가능).
• Spring WebFlux와 같은 비동기 처리 방식을 사용하면 스레드 하나가 여러 요청을 처리할 수 있는 방식으로 작동하여 자원 사용 효율을 높일 수 있습니다.
요약
• HTTP 요청 하나가 스레드 하나에 할당되기는 하지만, 요청마다 새로운 스레드를 생성하는 것이 아니라 스레드 풀에서 할당받아 처리됩니다.
• 서버는 요청 수와 부하에 맞게 스레드 풀 크기를 조정하여 최적의 성능을 유지하도록 구성할 수 있습니다.
'Spring Security' 카테고리의 다른 글
Callable과 Runnable (0) | 2024.10.29 |
---|---|
Tomcat Executor (0) | 2024.10.29 |
UserDetailsService, PasswordEncoder, AuthenticationProvider (0) | 2024.10.29 |
JSON Web Token (0) | 2024.10.28 |
SHA-256 (4) | 2024.10.28 |