Spring Boot

[Spring Security] docs: Authentication Architecture (1) - SecurityContextHolder, SecurityContext, Authentication

kiritoni 2024. 8. 30. 22:24
๋ฐ˜์‘ํ˜•

๐Ÿ”ป Spring Security docs  ๊ฒŒ์‹œ๊ธ€ ๋ชฉ์ฐจ  

๋”๋ณด๊ธฐ

1. [Spring Security] docs : Getting Started

 

[Spring Security] docs : Getting Started

Spring Security๋Š” ์ธ์ฆ, ๊ถŒํ•œ๋ถ€์—ฌ ๋ฐ ์ผ๋ฐ˜์ ์ธ ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ๋ณดํ˜ธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณด์•ˆ ์„ค์ •์— ์ถ”๊ฐ€์ ์œผ๋กœ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๋”๋ผ๋„ ์•ˆ์ „ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋น ๋ฅด๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋„

kiritoni.tistory.com

 

2. [Spring Security] docs : Architecture (1) - Filter

 

[Spring Security] docs : Architecture (1) - Filter

Spring Security docs Hello Spring Security :: Spring SecurityRunning Spring Boot Application $ ./mvnw spring-boot:run ... INFO 23689 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration : Using generated security password: 8e557245-73e2-4286-969a

kiritoni.tistory.com

 

3. [Spring Security] docs: Architecture (2) - DelegatingFilterProxy

 

[Spring Security] docs: Architecture (2) - DelegatingFilterProxy

Spring Security docs Hello Spring Security :: Spring SecurityRunning Spring Boot Application $ ./mvnw spring-boot:run ... INFO 23689 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration : Using generated security password: 8e557245-73e2-4286-969a

kiritoni.tistory.com

 

4. [Spring Security] docs: Architecture (3) - FilterChainProxy & SecurityFilterChain

 

[Spring Security] docs: Architecture (3) - FilterChainProxy & SecurityFilterChain

2024.08.29 - [Spring Boot] - [Spring Security] docs: Architecture (2) - DelegatingFilterProxy [Spring Security] docs: Architecture (2) - DelegatingFilterProxySpring Security docs Hello Spring Security :: Spring SecurityRunning Spring Boot Application $ .

kiritoni.tistory.com

 

5. 2024.08.30 - [Spring Boot] - [Spring Security] docs : Architecture(4) : FilterChain์˜ ์—ญํ• ๊ณผ ์ˆœ์„œ, ์ปค์Šคํ…€ ํ•„ํ„ฐ

 

[Spring Security] docs : Architecture(4) : FilterChain์˜ ์—ญํ• ๊ณผ ์ˆœ์„œ, ์ปค์Šคํ…€ ํ•„ํ„ฐ

๐Ÿ”ป Spring Security docs  ๊ฒŒ์‹œ๊ธ€ ๋ชฉ์ฐจ  ๋”๋ณด๊ธฐ1. [Spring Security] docs : Getting Started [Spring Security] docs : Getting StartedSpring Security๋Š” ์ธ์ฆ, ๊ถŒํ•œ๋ถ€์—ฌ ๋ฐ ์ผ๋ฐ˜์ ์ธ ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ๋ณดํ˜ธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

kiritoni.tistory.com

 

6. 2024.08.30 - [Spring Boot] - [Spring Security] docs: Architecture(5) - ExceptionTranslationFilter, RequestCache, logging

 

[Spring Security] docs: Architecture(5) - ExceptionTranslationFilter, RequestCache, logging

๐Ÿ”ป Spring Security docs  ๊ฒŒ์‹œ๊ธ€ ๋ชฉ์ฐจ  ๋”๋ณด๊ธฐ1. [Spring Security] docs : Getting Started [Spring Security] docs : Getting StartedSpring Security๋Š” ์ธ์ฆ, ๊ถŒํ•œ๋ถ€์—ฌ ๋ฐ ์ผ๋ฐ˜์ ์ธ ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ๋ณดํ˜ธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

kiritoni.tistory.com

 

 

 

 

๐ŸŒฑ Spring Security docs ๋ฐ”๋กœ๊ฐ€๊ธฐ

 

Servlet Authentication Architecture :: Spring Security

ProviderManager is the most commonly used implementation of AuthenticationManager. ProviderManager delegates to a List of AuthenticationProvider instances. Each AuthenticationProvider has an opportunity to indicate that authentication should be successful,

docs.spring.io

 

 

 

 

๐Ÿ” Servlet Authentication Architecture์˜ ํ‚ค์›Œ๋“œ ์•Œ์•„๋ณด๊ธฐ

1. SecurityContextHolder: Spring Security๊ฐ€ ์ธ์ฆ๋œ `SecurityContextHolder`์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณณ์ด๋‹ค. 
2. SecurityContext: `SecurityContextHolder`์—์„œ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ˜„์žฌ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ `Authentication` ์ •๋ณด๋ฅผ ํฌํ•จํ•œ๋‹ค. 
3. Authentication: `AuthenticationManager`์— ์‚ฌ์šฉ์ž ์ž๊ฒฉ ์ฆ๋ช…(credential)์„ ์ œ๊ณตํ•˜์—ฌ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , `SecurityContext`์—์„œ ํ˜„์žฌ ์‚ฌ์šฉ์ž๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. 
4. GrantedAuthority: `Authentication`์˜ ์ฃผ์ฒด(principal)์—๊ฒŒ ๋ถ€์—ฌ๋œ ๊ถŒํ•œ(ex. ์—ญํ• , ๋ฒ”์œ„ ๋“ฑ)์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. 
5. AuthenticationManager: Spring Security์˜ ํ•„ํ„ฐ๊ฐ€ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ์ •์˜ํ•˜๋Š” API์ด๋‹ค. 
6. ProviderManager: `AuthenticationManager`์˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ตฌํ˜„์ฒด์ด๋‹ค.
7. AuthenticationProvider: `ProviderManager`๊ฐ€ ํŠน์ • ์œ ํ˜•์˜ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ์ด๋‹ค.
8. Request Credentials with `AuthenticationEntryPoint`: ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ž๊ฒฉ ์ฆ๋ช…์„ ์š”์ฒญํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. (ex. ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•˜๊ฑฐ๋‚˜, `WWW-Authenticate` ์‘๋‹ต์„ ๋ณด๋‚ด๋Š” ์ž‘์—… ๋“ฑ)
9. AbstractAuthenticationProcessingFilter: ์ธ์ฆ์„ ์œ„ํ•œ `Filter`์ด๋‹ค. ์ธ์ฆ์˜ ๊ณ ์ˆ˜์ค€ ํ๋ฆ„๊ณผ ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ์š”์†Œ๋“ค์ด ์–ด๋–ป๊ฒŒ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ณด์—ฌ์ค€๋‹ค. 

 

 

 

 

 


 

 

 

1. SecurityContextHolder

`SecurityContextHolder`๋Š” ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ํ•œ๋‹ค. 

ํ˜„์žฌ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋ณด๊ด€ํ•˜๋Š” `SecurityContext`๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. 

 

 

1-1. SecurityContextHolder์˜ ์—ญํ• 

`SecurityContextHolder`๋Š” Spring Security์—์„œ ๋ˆ„๊ฐ€ ์ธ์ฆ๋˜์—ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณด๊ด€์†Œ ์—ญํ• ์„ ํ•œ๋‹ค. 

Spring Security๋Š” `SecurityContextHolder`๊ฐ€ ์–ด๋–ป๊ฒŒ ์ฑ„์›Œ์ง€๋Š”๊ฐ€๋Š” ๊ด€๊ณ„์—†์ด, `SecurityContextHolder`์— ๊ฐ’์ด ํฌํ•จ๋˜์–ด์žˆ๋‹ค๋ฉด, ๋ฌด์กฐ๊ฑด ํ˜„์žฌ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋กœ ๊ฐ„์ฃผํ•œ๋‹ค. 

 

 

 

1-2. `SecurityContextHolder`์— ์‚ฌ์šฉ์ž ์ธ์ฆ ์„ค์ •ํ•˜๊ธฐ

๊ฐ€์žฅ ๊ฐ„ํŽธํ•œ ๋ฐฉ๋ฒ•์€ `SecurityContextHolder`๋ฅผ ์ง์ ‘ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

SecurityContext context = SecurityContextHolder.createEmptyContext(); 
Authentication authentication = new TestingAuthenticationToken("username", "password", "ROLE_USER"); 
context.setAuthentication(authentication);
SecurityContextHolder.setContext(context);

 

  • ์ƒˆ๋กœ์šด `SecurityContext`์ƒ์„ฑ: ์ƒˆ๋กœ์šด `SecurityContext` ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•จ์œผ๋กœ์จ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ์˜ ๊ฒฝํ•ฉ ์กฐ๊ฑด์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ์กด์˜ `SecurityContextHolder.getContext().setAuthentication(authentication)` ๋ฐฉ์‹ ๋Œ€์‹  ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 
  • ์ƒˆ๋กœ์šด `Authentication` ๊ฐ์ฒด ์ƒ์„ฑ: ์ธ์ฆ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. Spring Security๋Š” `SecurityContext`์— ์„ค์ •๋œ `Authentication`์˜ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„ ํƒ€์ž…์—๋Š” ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๋Š”๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” ๊ฐ„๋‹จํ•œ `TestingAuthenticationToken`์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ๋Š” `UsernamePasswordAuthenticationToken(userDetails, password, authorities)`์„ ๋” ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค. 
  • `SecurityContext` ์„ค์ •: ์ƒ์„ฑํ•œ `SecurityContext`๋ฅผ `SecurityContextHolder`์— ์„ค์ •ํ•œ๋‹ค. ์ด ์ •๋ณด๋Š” Spring Security๊ฐ€ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. 

 

 

 

1-3. ํ˜„์žฌ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด ์ ‘๊ทผํ•˜๊ธฐ

ํ˜„์žฌ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์œผ๋ ค๋ฉด `SecurityContextHolder`๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. 

SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication = context.getAuthentication();
String username = authentication.getName(); // ์‚ฌ์šฉ์ž ์ด๋ฆ„
Object principal = authentication.getPrincipal(); // ์ธ์ฆ๋œ ์ฃผ์ฒด (principal)
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities(); // ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ๋ชฉ๋ก

 

  • `SecurityContextHolder.getContext()`๋ฅผ ํ†ตํ•ด `SecurityContext`๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. 
  • `getAuthentication()`์„ ํ˜ธ์ถœํ•˜์—ฌ ํ˜„์žฌ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ `Authentication` ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. 
  • `authentication.get ~` ์œผ๋กœ ์‚ฌ์šฉ์ž ์ด๋ฆ„, ์ธ์ฆ๋œ ์ฃผ์ฒด, ๊ถŒํ•œ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜จ๋‹ค. 

 

 

1-4. SecurityContextHolder์˜ ์ €์žฅ ์ „๋žต

๊ธฐ๋ณธ์ ์œผ๋กœ `SecurityContextHolder`๋Š” `ThreadLocal`์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ด๋Š” ๊ฐ™์€ ์Šค๋ ˆ๋“œ ๋‚ด์—์„œ๋Š” `SecurityContext`๊ฐ€ ํ•ญ์ƒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. `ThreadLocal` ๋ฐฉ์‹์€ ํ˜„์žฌ ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋œ ํ›„ ์Šค๋ ˆ๋“œ๋ฅผ ์ •๋ฆฌํ•  ๊ฒฝ์šฐ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. `FilterChainProxy`๋Š” ํ•ญ์ƒ` SecurityContext`๊ฐ€ ์ •๋ฆฌ๋˜๋„๋ก ๋ณด์žฅํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ผ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…”๋Š” ์ด๋Ÿฌํ•œ `ThreadLocal` ๋ฐฉ์‹์ด ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋‚˜, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. 

 

 

 


 

 

 

 

2. SecurityContext

`SecurityContextHolder`์—์„œ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ˜„์žฌ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ `Authentication` ์ •๋ณด๋ฅผ ํฌํ•จํ•œ๋‹ค. 

 

 

 


 

 

3. Authentication

 

 

Authentication ์ธํ„ฐํŽ˜์ด์Šค๋Š” Spring Security์—์„œ ๋‘ ๊ฐ€์ง€ ํ•ต์‹ฌ ๋ชฉ์ ์„ ์ œ๊ณตํ•œ๋‹ค. 

1๏ธโƒฃ ์ธ์ฆ ๊ด€๋ฆฌ์ž(AuthenticationManager)์˜ input ์—ญํ• 

์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•œ ์ž๊ฒฉ ์ฆ๋ช…(ex. ์‚ฌ์šฉ์ž ์ด๋ฆ„, ๋น„๋ฐ€๋ฒˆํ˜ธ)์„ ์ธ์ฆํ•˜๊ธฐ ์œ„ํ•ด `AuthenticationManager`์— ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. 

์ด ๊ฒฝ์šฐ(์•„์ง ์ธ์ฆ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์—), `isAuthenticated()` ๋ฉ”์„œ๋“œ๋Š” `false`๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 

 

2๏ธโƒฃ ํ˜„์žฌ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด ํ‘œํ˜„

ํ˜„์žฌ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, `SecurityContext`์—์„œ ํ˜„์žฌ์˜ `Authentication` ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

Authentication ๊ฐ์ฒด์˜ ๊ตฌ์„ฑ ์š”์†Œ

๏น’principal (์ฃผ์ฒด) : ์‚ฌ์šฉ์ž์˜ ์‹๋ณ„ํ•˜๋Š” ๊ฐ’์ด๋‹ค. ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ์ธ์ฆํ•  ๋•Œ, ์ฃผ๋กœ `UserDetails`์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. 
๏น’credentials (์ž๊ฒฉ ์ฆ๋ช…) : ์ฃผ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. ๋Œ€๋ถ€๋ถ„ ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ๋˜๋ฉด ์ด ์ •๋ณด๋Š” ์œ ์ถœ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์‚ญ์ œ๋œ๋‹ค. 
๏น’authorities (๊ถŒํ•œ) : ์‚ฌ์šฉ์ž๊ฐ€ ๋ถ€์—ฌ๋ฐ›์€ ๊ณ ์ˆ˜์ค€์˜ ๊ถŒํ•œ์„ ๋‚˜ํƒ€๋‚ด๋Š” `GrantedAuthority` ์ธ์Šคํ„ด์Šค๋“ค์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์—ญํ• (roles)์™€ ๋ฒ”์œ„(scopes)๊ฐ€ ์žˆ๋‹ค. 

 

 

๋ฐ˜์‘ํ˜•