[Spring Security] ThreadLocal
- 📚 Spring/Spring-Security
- 2022. 2. 9. 13:48
| ThreadLocal
- 대부분의 경우 요청 1개에 Thread 1개가 생성된다.
- 이때 ThreadLocal을 사용하면 Thread마다 고유한 공간을 만들 수 있고 그곳에 SecurityContext를 저장할 수 있다.
- 공유전략으로 3가지 방법이 있으며 기본적으로 ThreadLocal을 사용한다
- MODE_THREADLOCAL, MODE_INHERITABLETHREADLOCAL, MODE_GLOBAL
- 대부분 ThreadLocal을 사용한다
- Spring Security의 기본적인 Security Context 관리 전략은 ThreadLocal을 사용하는 ThreadLocalSecurityContextHolderStrategy이다.
- 변수는 지연변수, 전역변수 등 유효한 Scope을 가진다. 마찬가지로 ThreadLocal은 Thread마다 고유한 영역을 가지고 있는 곳에 저장된 변수로 각각의 Thread안에서 유효한 변수이다.
- 일반적 서버의 경우 외부로부터 요청이오면 그 요청마다 Thread 1개가 할당된다. 따라서 ThreadLocal로 SecurityContext를 관리하게 되면 SecurityContext는 요청마다 독립적으로 관리될 수 있다.
/*
* Copyright 2004, 2005, 2006 Acegi Technology Pty Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.security.core.context;
import org.springframework.util.Assert;
/**
* A <code>ThreadLocal</code>-based implementation of
* {@link SecurityContextHolderStrategy}.
*
* @author Ben Alex
* @see java.lang.ThreadLocal
* @see org.springframework.security.core.context.web.SecurityContextPersistenceFilter
*/
final class ThreadLocalSecurityContextHolderStrategy implements SecurityContextHolderStrategy {
private static final ThreadLocal<SecurityContext> contextHolder = new ThreadLocal<>();
@Override
public void clearContext() {
contextHolder.remove();
}
@Override
public SecurityContext getContext() {
SecurityContext ctx = contextHolder.get();
if (ctx == null) {
ctx = createEmptyContext();
contextHolder.set(ctx);
}
return ctx;
}
@Override
public void setContext(SecurityContext context) {
Assert.notNull(context, "Only non-null SecurityContext instances are permitted");
contextHolder.set(context);
}
@Override
public SecurityContext createEmptyContext() {
return new SecurityContextImpl();
}
}
'📚 Spring > Spring-Security' 카테고리의 다른 글
[Spring Security] 2. Form Login 필터 : UsernamePasswordAuthenticationFilter (0) | 2022.03.03 |
---|---|
[Spring Security] Form Login 인증방식 (0) | 2022.03.02 |
[Spring Security] Security Filter 의 종류 (0) | 2022.02.13 |
[Spring Security] 내부구조 (0) | 2022.02.09 |
[Spring Security] Spring Security 란? (0) | 2022.02.09 |