๐ป 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
[Spring Security] docs : Architecture(4) : FilterChain์ ์ญํ ๊ณผ ์์, ์ปค์คํ ํํฐ
๐ป Spring Security docs ๊ฒ์๊ธ ๋ชฉ์ฐจ ๋๋ณด๊ธฐ1. [Spring Security] docs : Getting Started [Spring Security] docs : Getting StartedSpring Security๋ ์ธ์ฆ, ๊ถํ๋ถ์ฌ ๋ฐ ์ผ๋ฐ์ ์ธ ๊ณต๊ฒฉ์ ๋ํ ๋ณดํธ๋ฅผ ์ ๊ณตํ๋ ํ๋ ์์ํฌ
kiritoni.tistory.com
[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)๊ฐ ์๋ค.