๐โโ๏ธย Quick Start
1. ์์กด์ฑ ์ถ๊ฐ
maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Gradle
implementation "org.springframework.boot:spring-boot-starter-security"
2. Hello Spring Security
classpath์ Spring Security๋ฅผ ์ถ๊ฐํ๊ณ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํฉ๋๋ค.
์คํ ํ ์ฝ์์ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ถ๋ ฅ์ ํ์ธํ ์ ์์ต๋๋ค.
์๋์ ์ถ๋ ฅ์ ํตํด์ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํ๋ง ์ํ๋ฆฌํฐ๊ฐ ์ ์ฉ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
2023-10-11T16:15:34.331+09:00 WARN 1644 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration :
Using generated security password: 5451a8c2-a100-43ef-843c-7fb621b5c73b
ํฐ๋ฏธ๋์ ์คํํ ๋ค ์๋ํฌ์ธํธ URL์ ๋ํ curl ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ถ๋ ฅ์ ํ์ธํ ์ ์์ต๋๋ค.
curl -i http://localhost:8080/hello
HTTP/1.1 401
Set-Cookie: JSESSIONID=AC7913E4BD60253DAC7D19E775107B7B; Path=/; HttpOnly
WWW-Authenticate: Basic realm="Realm"
...
์คํ๋ง ์ํ๋ฆฌํฐ๋ 401
์๋ต๊ณผ ํจ๊ป ์ ๊ทผ์ ๊ฑฐ๋ถํ๊ฒ ๋ฉ๋๋ค.
์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด์ ์ ์์ ์๋ํ๊ฒ ๋๋ฉด ๋ก๊ทธ์ธ ํ์ด์ง๊ฐ ํ์๋ฉ๋๋ค.
์ค์ ์ ๋ณด๋ฅผ ์์ฑํ๊ธฐ ์ ์ด๋ผ Default ์ค์ ์ด ์ ์ฉ๋๊ณ ์์ต๋๋ค.
๋ชจ๋ ์๋ํฌ์ธํธ URL์ ์์ฒญํ ๊ฒฝ์ฐ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธํฉ๋๋ค.
Username์ โuserโ๋ฅผ ์
๋ ฅํ๊ณ Password์๋ Console์์ Log๋ก ํ์ธํ password๋ฅผ ์
๋ ฅํ์ฌ ์ ์ํ ์ ์์ต๋๋ค.
โ
Spring Security Guide
๋ค์ด๊ฐ๊ธฐ ์ ์คํ๋ง ์ํ๋ฆฌํฐ์ ์ปจ์ ์ ๊น์ด ์๊ฒ ์ดํดํ๊ณ ์ถ๋ค๋ฉด ๊ณต์ ์ฌ์ดํธ์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋ณธ ๊ธ์ ๊ธฐ๋ณธ์ ์ธ API ์๋น์ค์ ์คํ๋ง ์ํ๋ฆฌํฐ ๋ฐ JWT ์ ์ฉ์ ๋ชฉ์ ์ผ๋ก ํฉ๋๋ค.
Spring Security :: Spring Security
1. Architecture
์ ์ฒด ์๋๋ฆฌ์ค
- ์ฌ์ฉ์๋ ํ์๊ฐ์
(
/api/v1/auth/signup
)์ ์์ฒญํฉ๋๋ค. - ์ฌ์ฉ์๋ ๊ฐ์
ํ ๊ณ์ ์ ์ด์ฉํ์ฌ ๋ก๊ทธ์ธ(
/api/v1/signin
)ํฉ๋๋ค. - ๊ณ์ ์ธ์ฆ์ ์ฑ๊ณตํ ์ฌ์ฉ์๋ ์์(
/api/v1/resource
)์ ์ ๊ทผํ๊ธฐ ์ํ ์์ฒญ(Request)์ ์๋ฒ์ ๋ณด๋ ๋๋ค.
ํ์๊ฐ์
- ์ฌ์ฉ์๋ ์๋น์ค์ ํ์๊ฐ์
์ ์์ฒญํฉ๋๋ค. ์ฌ์ฉ์์ ์์ฒญ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก User ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค. ์ฌ์ฉ์์ ์ํธ๋
PasswordEncoder
์ ์ํด์ ์ํธํ๋ฉ๋๋ค. - User ๊ฐ์ฒด๋
UserRepository
๋ฅผ ํตํ์ฌ Database์ ์ ์ฅ๋ฉ๋๋ค.
๋ก๊ทธ์ธ
โ
- ์ฌ์ฉ์์ ๋ก๊ทธ์ธ ์์ฒญ์ด ์ค๋ฉด
UsernamePasswordAuthenticationFilter
๊ฐAuthentication
ํ์ ์ธUsernamePasswordAuthenticationToken
์ ์์ฑํฉ๋๋ค. AuthenticationManager
๋ ์ฌ์ฉ์ ์ธ์ฆ๊ณผ ๊ด๋ จํ ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค. ์ฌ์ฉ์ ์ธ์ฆ์ ์ํดUsernamePasswordAuthenticationToken
์AuthenticationManager
๋ก ์ ๋ฌ๋ฉ๋๋ค.- username ๋๋ password๊ฐ ๊ฒ์ฆ์ ์คํจํ๋ค๋ฉด
RememberMeService.loginFail
๊ณผAuthenticationFailureHandler
๊ฐ ํธ์ถ๋ฉ๋๋ค. ์ฌ์ฉ์๋403
์๋ต์ ๋ฐ๊ฒ ๋ฉ๋๋ค. - ์ฌ์ฉ์ ๊ฒ์ฆ์ ์ฑ๊ณตํ๋ค๋ฉด Database์์ ์ฌ์ฉ์๋ฅผ ๊ฒ์ํ๊ฒ ๋ฉ๋๋ค. ๋ง์ฝ ์ผ์นํ๋ ์ฌ์ฉ์๊ฐ ์๋ค๋ฉด ์์ฒญ์์๊ฒ
403
์๋ต์ ๋ฐํํฉ๋๋ค. 2๋ฒ ๊ณผ์ ์์ ์ฌ์ฉ์ ์ธ์ฆ์ ์๋ํ๊ธฐ ๋๋ฌธ์ ์ด ๊ณผ์ ์ ๊ทธ๋ ๊ฒ ์ค์ํ์ง ์์ต๋๋ค. ์ดํ ๊ฒ์๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผJwtTokenProvider
์ ์ ๋ฌํ์ฌ JWT ์์ฑ์ ์์ฒญํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ JWT๊ฐ JSON ์๋ต์ ์บก์ํ๋์ด ์ฌ์ฉ์์๊ฒ ๋ฐํ๋ฉ๋๋ค.
์์ ์์ฒญ
- ์ฌ์ฉ์๊ฐ ์์์ ๋ํ ์์ฒญ์ ์๋ํ๊ฒ ๋๋ฉด, ํด๋น ์์ฒญ์
JwtAuthenticationFilter
๋ก ์ ๋ฌ๋ฉ๋๋ค.SecurityFilterChain
์ ๋ฑ๋ก๋JwtAuthenticationFilter
์ ์ปค์คํ ๋ ํํฐ์ ๋๋ค. - ๋ณดํธ๋ฐ๊ณ ์๋ ์์์ ๋ํ ์์ฒญ์ JWT๊ฐ ์์ ๊ฒฝ์ฐ ์์ฒญ์์๊ฒ
403
์๋ต์ ๋ฐํํ๊ฒ ๋ฉ๋๋ค. - JWT๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ Jwt๋ก๋ถํฐ ์ฌ์ฉ์ ID(Subject)๋ฅผ ์ถ์ถํ๊ธฐ ์ํด
JwtTokenProvider
๊ฐ ํธ์ถ๋ฉ๋๋ค. ์ฌ์ฉ์ ID๊ฐ ์ ์์ ์ผ๋ก ์ถ์ถ๋์ง ์์ ๊ฒฝ์ฐ403
์๋ต์ ๋ฐํํ๊ฒ ๋ฉ๋๋ค. - ๋ง์ฝ ์ฌ์ฉ์ ID๊ฐ ์ถ์ถ๋์๋ค๋ฉด, ID๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ํ์ฌ
UserDetailService
๋ฅผ ๊ตฌํํCustomUserDetailsService
์loadByUserId()
๊ฐ ํธ์ถ๋ฉ๋๋ค. - Database์ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ์๋ค๋ฉด, ์์ฒญ์์๊ฒ
403
์๋ต์ ๋ฐํํ๊ฒ ๋ฉ๋๋ค. - ์ธ์ฆ ์ฑ๊ณต ์ ์ฌ์ฉ์ ์ ๋ณด๋
UsernamaPasswordAuthenticationToken
์ ์บก์ํ๋์ดSecurityContextHolder
์ ์ ์ฅ๋ฉ๋๋ค. - ์ดํ ์คํ๋ง ์ํ๋ฆฌํฐ์ ์ธ๊ฐ ํ๋ก์ธ์ค๊ฐ ์์๋ฉ๋๋ค. ์ธ๊ฐ ํ๋ก์ธ์ค๊ฐ ์ฑ๊ณตํ ๊ฒฝ์ฐ ์ฌ์ฉ์์ ์์ฒญ์ ์ปจํธ๋กค๋ฌ๋ก ๋ณด๋ด์ง๋ฉฐ ๋น์ฆ๋์ค ๋ก์ง์ด ์ฒ๋ฆฌ๋ฉ๋๋ค.
SecurityContextHolder
: ์ธ๊ฐ๋ ์ฌ์ฉ์์ ์ ๋ณด๊ฐ ์ ์ฅ๋ ์ ์ฅ์์ ๋๋ค. ์คํ๋ง ์ํ๋ฆฌํฐ๋ ์ธ์ฆ ์์ ์ ํด๋น ์ ๋ณด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
2. Demonstration
References
https://spring.io/projects/spring-security
https://medium.com