๐ฅง Spring Security ๋?
๐ ์คํ๋ง ์ํ๋ฆฌํฐ(Spring Security)
Acegi Security(์์์ง ์ํ๋ฆฌํฐ) ํ๋ก์ ํธ๋ก ์์
โก๏ธ ์คํ๋ง ํฌํธํด๋ฆฌ์ค ํ๋ก์ ํธ์ ๋ณํฉ๋๋ฉด์ ์ด๋ฆ์ด Spring Security๋ก ๋ฐ๋์๋ค.
๐ฐ Spring Security๋ ๊ฐ๋ ฅํ๊ณ ์ปค์คํ ๊ฐ๋ฅํ ์ธ์ฆ(Authentication)๊ณผ ์ ๊ทผ ํต์ (Access Control) ํ๋ ์์ํฌ์ด๋ค.
๐ฐ ์คํ๋ง ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ณด์์ ์ํ ํ์ค์ด๋ค.
๐ฐ ๋ชจ๋ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฉ ๊ฐ๋ฅํ์ง๋ง ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ง์ด ์ฐ์ธ๋ค.
๐ฐ ์คํ๋ง ์ธํฐ์ ํฐ, ํํฐ ๊ธฐ๋ฐ์ ๋ณด์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ๋ณด๋ค ์คํ๋ง ์ํ๋ฆฌํฐ๋ฅผ ํตํด ๊ตฌํํ๋ ๊ฒ์ ๊ถ์ฅํ๊ณ ์๋ค.
๐ฐ ํ์ฅ์ฑ : ๋ค์ํ ์๊ตฌ์ฌํญ์ ์์ฝ๊ฒ ์ถ๊ฐํ๊ณ ๋ณ๊ฒฝํ ์ ์๋ค.
๐ฐ ์คํํ๋ ค๋ฉด Java 8 ์ด์์ ํ๊ฒฝ์ด ํ์
๐ ํ์ ์ฉ์ด ๋ฐ ๊ฐ๋
๐ฅ ์ฃผ์ฒด (Principal)
๐ฐ ์ ์ , ๊ธฐ๊ธฐ, ์์คํ ๋ฑ์ด ๋ ์ ์์ง๋ง ๋ณดํต ์ ์ (์ฌ์ฉ์)๋ฅผ ์๋ฏธํ๋ค.
๐ฅ ์ธ์ฆ (Authentication)
๐ฐ ํน์ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ค๊ณ ํ๋ ์ฌ์ฉ์๊ฐ ๋๊ตฌ์ธ์ง ํ์ธํ ๋ ์ฌ์ฉํ๋ค.
๐ฐ ์ฃผ์ฒด์ ์ ์(identity)์ ์ฆ๋ช ํ๋ ๊ณผ์
๐ฐ ์ฃผ์ฒด๋ ์์ ์ ์ธ์ฆํด๋ฌ๋ผ๊ณ ์ ์ ์ฆ๋ช ์ ๋ณด(credential)์ ์ ์ํ๋ค.
๐ฐ ์ฃผ์ฒด๊ฐ ์ ์ ์ผ ๊ฒฝ์ฐ ์ ์ ์ฆ๋ช ์ ๋ณด๋ ํจ์ค์๋์ด๋ค.
๐ฅ ์ธ๊ฐ (Authorization, ๊ถํ ๋ถ์ฌ)
๐ฐ ์ธ์ฆ์ ๋ง์น ์ ์ ์๊ฒ ๊ถํ(authority)์ ๋ถ์ฌํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๊ฒ ํ๊ฐํ๋ ๊ณผ์
๐ฐ ์ธ๊ฐ๋ ๋ฐ๋์ ์ธ์ฆ ๊ณผ์ ์ดํ ์ํ๋์ด์ผ ํ๋ฉฐ ๊ถํ์ ๋กค ํํ๋ก ๋ถ์ฌํ๋๊ฒ ์ผ๋ฐ์ ์ด๋ค.
๐ฅ ์ ๊ทผํต์ (Access control)
๐ฐ ์ด๋ค ์ ์ ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ฆฌ์์ค์ ์ ๊ทผํ๋๋ก ํ๋ฝํ ์ง๋ฅผ ์ ์ดํ๋ ํ์
๐ฐ ์ ๊ทผ ํต์ ๊ฒฐ์ (access control decision)์ด ๋ค๋ฐ๋ฅธ๋ค.
๐ฐ ๋ฆฌ์์ค์ ์ ๊ทผ ์์ฑ๊ณผ ์ ์ ์๊ฒ ๋ถ์ฌ๋ ๊ถํ ๋๋ ๋ค๋ฅธ ์์ฑ๋ค์ ๊ฒฐ์ ํ๋ค.
๐ฅง Spring Security๋ฅผ ๋ฐฐ์์ผ ํ๋ ์ด์
๐ Spring Security ํน์ง
๐ฐ ๋ชจ๋ ์์ฒญ์ ๋ํด์ ์ธ์ฆ์ ์๊ตฌํ๋ค.
๐ฐ ์ฌ์ฉ์ ์ด๋ฆ ๋ฐ ์ํธ๋ฅผ ๊ฐ์ง ์ฌ์ฉ์๊ฐ ์์ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ฆํ ์ ์๋๋ก ํ์ฉํ๋ค.
๐ฐ ์ฌ์ฉ์์ logout์ ํ์ฉํ๋ค. โก๏ธ LogoutFilter๋ก ์ฝ๋์ ๊ตฌํ์์ด๋ ๊ฐํธํ๊ฒ ๋ก๊ทธ์์์ ์ง์ํ๋ค. ์ปค์คํ ๋ ๊ฐ๋ฅํ๋ค.
๐ฐ CSRF(Cross-site Request Forgery) ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๋ค.
๐ฐ Session Fixation(์ธ์ ๊ณ ์ ๊ณต๊ฒฉ)์ ๋ณดํธํ๋ค.
๐ฐ ๋ณด์ ํค๋ ํตํฉ
- HSTS(HTTP Strict Transport Security) ๊ฐํ
- X-Content-TypeOptions
- ์บ์ ์ปจํธ๋กค(์ ์ ๋ฆฌ์์ค ์บ์ฑ)
- X-XSS-Protection XSS ๋ณด์ : ์คํฌ๋ฆฝํธ ๊ณต๊ฒฉ ๋ณด์
- ํด๋ฆญ์ฌํน์ ๋ฐฉ์งํ๋ X-Frame ์ต์ ํตํฉ
๐ฐ Servlet API ์ ๊ณต
โป Session Fixation (์ธ์ ๊ณ ์ ๊ณต๊ฒฉ)
์ธ์ ๊ณ ์ ์ด๋ ๊ณต๊ฒฉ์๊ฐ ์ ํจํ ์ฌ์ฉ์ ์ธ์ ์ ๊ฐ๋ก์ฑ๋๋ก ํ์ฉํ๋ ๊ณต๊ฒฉ์ ๋งํ๋ค.
๋ก๊ทธ์ธ ์ ๋ฐ๊ธ๋ฐ์ sessionID๊ฐ ๋ก๊ทธ์ธ ์ ํ๋ก ๋ชจ๋ ๋์ผํ๊ฒ ์ฌ์ฉ๋์ด ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ ํผํด์์ ์ธ์ ์ ํ์ด์ ํนํ์ฌ ์ ์์ ์ธ ์ฌ์ฉ์๋ก ์์ฅํ์ฌ ์ ๊ทผํ๋ค.
๊ณต๊ฒฉ์๊ฐ ์ ํจํ session ID๋ฅผ ์ป์ โก๏ธ ์ฌ์ฉ์๊ฐ ๊ณต๊ฒฉ์์ session ID๋ก ์์ ์ ์ธ์ฆํ๋๋ก ์ ๋ โก๏ธ ์ฌ์ฉ๋ session ID๋ฅผ ํตํด ์ฌ์ฉ์ ๊ฒ์ฆ๋ ์ธ์ ์ ํ์ด์ฌํน
์ธ์ ์ ๋ํ ๋ง๋ฃ๋ ์๋ก ๋ค๋ฅธ IP์ ๋์ผํ ์ธ์ ์ ๋ํด ์ทจ์ฝํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์ด์ฉํ๋ ๋ค์์ ์ฌ์ฉ์๊ฐ ํด๋น ๊ณต๊ฒฉ์ ๋ ธ์ถ๋ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํ๋ค.
์ฐธ๊ณ ) Session Fixation(์ธ์ ๊ณ ์ ) ์ทจ์ฝ์
โป HSTS(HTTP Strict Transport Security) ๊ธฐ๋ฅ
HTTP Strict-Transport-Security response header
HTTP ๋์ HTTPS๋ง์ ์ฌ์ฉํ์ฌ ํต์ ํด์ผํ๋ค๊ณ ์น์ฌ์ดํธ๊ฐ ๋ธ๋ผ์ฐ์ ์ ์๋ฆฌ๋ ๋ณด์ ๊ธฐ๋ฅ์ด๋ค.
ํต์ ์์ ์ผ๋ถ๋ถ HTTP๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ sessionID๋ ์ฟ ํค๋ฑ์ด ํด์ปค์๊ฒ ํ์ทจ๋์์ ๊ฒฝ์ฐ ๊ทธ๋๋ก ๋ฐ์ดํฐ๊ฐ ๋ ธ์ถ์ด ๋์ง๋ง HTTPS๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ ธ์ถ๋๋ ๊ฒ์ ๋ง์ ์ ์๋ค.
๋ง์ฝ ์น์ฌ์ดํธ๊ฐ HTTP ์์ฒญ์ ๋ฐ๊ณ HTTPS๋ก ๋ฆฌ๋ค์ด๋ ํธ ํ๋ ๊ฒฝ์ฐ์, ์ ์ ๊ฐ http ๋๋ ๋๋ฉ์ธ๋ง ์ ๋ ฅํ ๊ฒฝ์ฐ์ ๋ฆฌ๋ค์ด๋ ํธ ๋๊ธฐ ์ด์ ์ ์ํธํ๋์ง ์์ ๋ฒ์ ์ ์ฌ์ดํธ์ ํต์ ํ๊ฒ ๋๋ค. ์ด๊ฒฝ์ฐ, ์ ์์ ์ธ ๋ค๋ฅธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ ๋๋ man-in-the-middle attack์ ์ ์ฌ์ ์ํ์ด ์๋ค.
HTTP Strict Transport Security ํค๋๋ ์น์ฌ์ดํธ๊ฐ ๋ธ๋ผ์ฐ์ ์๊ฒ ์ ๋๋ก HTTP๋ก ์ฌ์ดํธ๋ฅผ ์ฐ๊ฒฐํ๋ฉด ์๋๊ณ HTTP๋ก ์ฐ๊ฒฐํ๋ ค๋ ๋ชจ๋ ์๋๋ ์๋์ผ๋ก HTTPS๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค๊ณ ์๋ฆฐ๋ค.
โป ํด๋ฆญ์ฌํน
ํด๋ฆญ์ฌํน์ด๋ ์น ์ฌ์ฉ์๊ฐ ์์ ์ด ํด๋ฆญํ๊ณ ์๋ค๊ณ ์ธ์ํ๋ ๊ฒ๊ณผ ๋ค๋ฅธ ๊ฒ์ ํด๋ฆญํ๊ฒ ์์ด๋ ํดํน ๊ธฐ๋ฒ์ด๋ค.
๊ณต๊ฒฉ์๋ ๋น๋ฐ ์ ๋ณด๋ฅผ ์ ์ถ์ํค๊ฑฐ๋ ์ปดํจํฐ์๋ํ ์ ์ด๋ฅผ ํ๋ํ ์ ์๊ฒ ๋๋ค.
โป Cache-Control
header ํ๋
request์ response ๋ด์ ์บ์ฑ ์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
๐ฅง Spring Security ํ๊ฒฝ ๊ตฌ์ฑ
config ํจํค์ง์ SecurityConfig.java ํ์ผ ์์ฑ
- @Configuration , @EnableWebSecurity ์ถ๊ฐ
- @EnableWebSecurity : spring security ํํฐ์ฒด์ธ์ ๋ฑ๋ก๋๋ค.
๐ฅ http.csrf().disable()
form ํ๊ทธ๋ก๋ง ์์ฒญ์ด ๊ฐ๋ฅํ๊ณ postman ๋ฑ์ ์์ฒญ์ด ๋ถ๊ฐ๋ฅํ๊ฒ ๋๋ค.
๐ฅ http.headers().frameOptions().disable()
h2 ์ฐ๊ฒฐํ ๋ ํ์ํ๋ค.
๐ฅ BCryptPasswordEncoder ํด๋์ค
PasswordEncoder๋ฅผ ๊ตฌํํ ํด๋์ค์ด๊ณ ๊ฐ๋ ฅํ ํด์ ํจ์์ธ BCrypt ๋ฅผ ์ฌ์ฉํ๋ค.
โป ์ฐธ๊ณ ) bcrypt
๋ธ๋กํผ์ ์ํธ์ ๊ธฐ๋ฐ์ ๋ ์ํธํ ํด์ ํจ์
๋ ์ธ๋ณด์ฐ ํ ์ด๋ธ ๊ณต๊ฒฉ ๋ฐฉ์ง๋ฅผ ์ํด salt๋ฅผ ์ถ๊ฐํ ์ ์ํ ํจ์์ ํ๋์ด๋ค.
๐ฅ @EnableGlobalMethodSecurity
Spring Security ์ ์ ์ญ ๋ฉ์๋ ๋ณด์์ ํ์ฑํํ๋ค.
โ ์ต์
1. securedEnabled : Secured ์ ๋ํ ์ด์ ํ์ฑํ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค.
2. prePostEnabled : Spring Security์ pre/proAuthorize ์ ๋ํ ์ด์ ์ ํ์ฑํํ๋ค.
3. jsr250Enabled : @RoleAllowed ์ ๋ํ ์ด์ ์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ค๋ค.
๐ฅ @Secured
1๊ฐ์ ๊ถํ์ ์ค ๋ ์ฌ์ฉ
@Secured(“ROLE_ADMIN”)
๐ฅ @PreAuthorize
1๊ฐ ์ด์์ ๊ถํ์ ์ค ๋ ์ฌ์ฉ
#์ ์ด์ฉํด์ ํ๋ผ๋ฏธํฐ์ ์ ๊ทผํ ์ ์๋ค.
@PreAuthorize(“hasRole(‘ROLE_MANAGER’) or hasRole(‘ROLE_ADMIN’)”)
@PreAuthozie(“isAuthenticated() and ((#user.name == principal.name) or hasRole(‘ROLE_ADMIN’))”)
๐ฅ @PostAuthorize
๋ฉ์๋๊ฐ ์คํ๋๊ณ ์๋ตํ๊ธฐ ์ง์ ์ ๊ถํ์ ๊ฒ์ฌํ๋๋ฐ ์ฌ์ฉ
ํด๋ผ์ด์ธํธ์ ์๋ตํ๊ธฐ ์ ์ ๋ก๊ทธ์ธ ์ํ ๋๋ ๋ฐํ๋๋ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ํ์ฌ ์ฌ์ฉ์ ์ด๋ฆ์ ๋ํ ๊ฒ์ฌ, ํ์ฌ ์ฌ์ฉ์๊ฐ ๊ด๋ฆฌ์ ๊ถํ์ ๊ฐ์ง๊ณ ์๋์ง ๋ฑ์ ๊ถํ ํ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
๐ฅง Filter์ FilterChain
๐ Filter
Spring Security๋ Servlet Filter๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ธ๋ฆฟ์ ์ง์ํ๋ค.
Filter : HTTP ์์ฒญ๊ณผ ์๋ต์ ๋ณ๊ฒฝํ ์ ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋์ด๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก ์์ฒญ์ ํ๊ฒ๋๋ฉด ๊ฐ์ฅ ๋จผ์ Servlet Filter๋ฅผ ๊ฑฐ์น๊ฒ ๋๋ค.
- Filter๋ฅผ ๊ฑฐ์น๊ณ ๋๋ฉด Servlet(DispatcherServlet)์์ ์์ฒญ์ด ์ฒ๋ฆฌ๋๋ค.
- Spring Security๋ ์ฃผ์ ๋ณด์์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์ฌ๋ฌ๊ฐ์ง Filter๋ก ์ฒ๋ฆฌํ๋๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
- ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ(Authorization)์ ๋ํ ์ฒ๋ฆฌ๋ฅผ Filter์์ ํ๋ค.
- ์๋ ์ค์ ์ต์ ์ ์ฌ์ฉํ๋ฉด 10๊ฐ์ ์คํ๋ง ์ํ๋ฆฌํฐ ํํฐ๊ฐ ์๋์ผ๋ก ์ค์ ๋๋ค.
๐ FilterChain
๋จ์ผ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ ํ์ ์ธ ๋ ์ด์ด
์ฌ๋ฌ๊ฐ์ Filter๋ค์ด ์ฌ์ฌ์ฒ๋ผ ์ฐ๊ฒฐ๋์ด ์๋ก ์ฐ๊ฒฐ๋์ด ๋์ํ๋ค.
๐ฅ FilterChain์ ํน์ง
๐ฐ ํด๋ผ์ด์ธํธ๊ฐ ์ฑ์ ์์ฒญ์ ๋ณด๋ด๊ณ ์ปจํ ์ด๋๋ ์์ฒญ URI์ ๊ฒฝ๋ก๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ค ํํฐ์ ์ด๋ค ์๋ธ๋ฆฟ์ ์ ์ฉํ ์ง ๊ฒฐ์ ํ๋ค.
๐ฐ ํ๋์ ์๋ธ๋ฆฟ์ ๋จ์ผ ์์ฒญ์ ์ฒ๋ฆฌํ์ง๋ง ํํฐ๋ ์ฒด์ธ์ ํ์ฑํ์ฌ ์์๋ฅผ ์ง์ ํ๋ฉฐ ์ค์ ๋ก ์์ฒญ ์์ฒด๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ ๊ฒฝ์ฐ ํํฐ๊ฐ ๋๋จธ์ง ์ฒด์ธ์ ๊ฑฐ๋ถํ ์ ์๋ค.
๐ฐ ํํฐ๋ ๋ค์ด์คํธ๋ฆผ ํํฐ์ ์๋ธ๋ฆฟ์ ์ฌ์ฉํด์ ์์ฒญ๊ณผ ์๋ต์ ์์ ํ ์๋ ์๋ค.
๐ฐ ํํฐ ์ฒด์ธ์ ์์๋ ๋งค์ฐ ์ค์ํ๋ฉฐ Spring Boot๋ ๋ ๊ฐ์ง ๋งค์ปค๋์ฆ์ ํตํด ์ด๋ฅผ ๊ด๋ฆฌํ๋ค. ํ๋๋ Filter ํ์ ์ @Beans ์ @Order๋ฅผ ๋ถ์ด๊ฑฐ๋ Ordered๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด๊ณ ๋ค๋ฅธ ํ๋๋ API์ ์ผ๋ถ๋ก ์์๋ฅผ ๊ฐ์ง๋ FilterRegistrationBean์ ์ผ๋ถ๊ฐ ๋๋ ๊ฒ์ด๋ค.
๐ฐ ํด๋ผ์ด์ธํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์์ฒญ์ ์ ์กํ๊ณ ์ปจํ ์ด๋๋ Servlet๊ณผ ์ฌ๋ฌ Filter๋ก ๊ตฌ์ฑ๋ FilterChain์ ๋ง๋ค์ด ์์ฒญ URI path ๊ธฐ๋ฐ์ผ๋ก HttpServletRequest๋ฅผ ์ฒ๋ฆฌํ๋ค.
๐ฐ Filter๋ ์์ฒญ์ด DispatcherServlet์ ์ํด ๋ค๋ค์ง๊ธฐ ์ , ํ์ ๋์ํ๋ค.
๐ฐ Filter๋ FilterChain์ ํตํด ์ฌ๋ฌ ํํฐ๊ฐ ์ฐ์์ ์ผ๋ก ๋์ํ๊ฒ ํ ์ ์๋ค.
๐ฐ 1๊ฐ์ Servlet์ด HttpServletRequest์ HttpServletResponse ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ค.
- Filter๋ ์ฌ๋ฌ๊ฐ ์ฌ์ฉํ ์ ์๋ค.
- ๋ค์ด ์คํธ๋ฆผ์ Servlet๊ณผ Filter์ ์คํ์ ๋ง๋๋ค. (๋ณดํต ์ด ๊ฒฝ์ฐ Filter์์ HttpServletResonse๋ฅผ ์์ฑํ๋ค.)
- ๋ค์ด ์คํธ๋ฆผ์ ์๋ Servlet๊ณผ ์ฌ๋ฌ Filter๋ก HttpServletRequest๋ HttpServletResponse๋ฅผ ์์ ํ๋ค.
๐ฐ Filter๋ FilterChain ์์ ์์ ๋ ํจ๋ ฅ์ ๋ฐํํ๋ค.
๐ฅ Filter Interface
- public void init(FilterConfig filterConfig) throws ServletException ํํฐ๋ฅผ ์น ์ปจํ ์ด๋ ๋ด์ ์์ฑํ ํ ์ด๊ธฐํ ํ ๋ ํธ์ถํ๋ค.
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException ์ฒด์ธ์ ๋ฐ๋ผ ๋ค์์ ์กด์ฌํ๋ ํํฐ๋ก ์ด๋ํ๋ค.
- ์ฒด์ธ์ ๊ฐ์ฅ ๋ง์ง๋ง์๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ์ต์ข ์์์ด ์์นํ๋ค.
- public void destroy() ํํฐ : ์น ์ปจํ ์ด๋์์ ์ญ์ ๋ ๋ ํธ์ถ๋๋ค.
- doFilter() : ํํฐ์ ์ญํ ์ ํ๋ ๋ฉ์๋
๐ฅ FilterRegistrationBean ์ต์
FilterRegistrationBean์ ์ต์ ์ผ๋ก Filter์ ์ฌ๋ฌ๊ฐ์ง ์ต์ ์ ์ถ๊ฐํ ์ ์๋ค.
๐ฅ addUrlPatterns
registrationBean.addUrlPatterns(“/users/*”);
setUrlPatterns์ ๋น์ทํ๋ค.
/users/ ๋ก ์์ํ๋ url๋ก ์์ฒญ์ด ์ค๊ฒ๋๋ฉด ํํฐ๋ฅผ ํต๊ณผํ๋ค.
๐ฅ setOrder
registrationBean.setOrder(1);
ํํฐ์ ์คํ ์์๋ฅผ ์ง์ ํ๋ค.
๐ DelegatingFilterProxy
Spring Security๊ฐ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ฒญ์ ๊ฐ์ธ๊ฒ ํด์ ๋ชจ๋ ์์ฒญ์ ๋ณด์์ด ์ ์ฉ๋๊ฒ ํ๋ ServletFilter์ด๋ค.
์คํ๋ง ํ๋ ์์ํฌ ๊ธฐ๋ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ธ๋ฆฟํํฐ ๋ผ์ดํ ์ฌ์ดํด๊ณผ ์ฐ๊ณํด ์คํ๋ง ๋น ์์กด์ฑ์ ์๋ธ๋ฆฟ ํํฐ์ ๋ฐ์ธ๋ฉํ๋๋ฐ ์ฌ์ฉํ๋ค.
- ์คํ๋ง ๋ถํธ๋ DelegatingFilterProxy(Filter ๊ตฌํ์ฒด)๋ก ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์๋ช ์ฃผ๊ธฐ์ ์คํ๋ง ApplicationContext๋ฅผ ์ฐ๊ฒฐํ๋ค.
- Servlet Container๋ ์์ฒด ํ์ค์ ์ฌ์ฉํด์ Filter๋ฅผ ๋ฑ๋กํ ์ ์์ง๋ง ์คํ๋ง์ด ์ ์ํ๋ Bean์ ์ธ์ํ์ง ๋ชปํ๋ค.
- DelegatingFilterProxy๋ ํ์ค ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋งค์ปค๋์ฆ์ผ๋ก ๋ฑ๋กํ ์ ์์ผ๋ฉด์๋ ๋ชจ๋ ์ฒ๋ฆฌ๋ฅผ Filter๋ฅผ ๊ตฌํํ ์คํ๋ง ๋น์ผ๋ก ์์ํ๋ค.
- DelegatingFilterProxy๋ ApplicationContext์์ Bean Filter0๋ฅผ ์ฐพ์ ์คํํ๋ค.
- Bean Filter0๋ FilterChainProxy๊ฐ ๋๋ค.
๐ FilterChainProxy
Spring Security๋ FilterChainProxy๋ก ์๋ธ๋ฆฟ์ ์ง์ํ๋ค.
- FilterChainProxy๋ Spring Security๊ฐ ์ ๊ณตํ๋ ํน๋ณํ Filter๋ก SecurityFilterChain์ ํตํด ์ฌ๋ฌ Filter ์ธ์คํด์ค๋ก ์์ํ ์ ์๋ค.
- FilterChainProxy๋ ๋น์ด๊ธฐ ๋๋ฌธ์ ๋ณดํต DelegatingFilterProxy๋ก ๊ฐ์ธ์ ธ ์๋ค.
- DelegatingFilterProxy๋ ์๋ธ๋ฆฟ ํํฐ์ด๋ฉฐ, Spring IOC ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๋ Filter Bean์ ๊ฐ๊ณ ์๋ค.
- Filter Bean์ FilterChainProxy์ด๋ฉฐ ์ด ๊ฐ์ฒด์์์ Security์ ๊ด๋ จ๋ ์ผ๋ค์ด ๋ฒ์ด์ง๋ค๊ณ ์๊ฐํ ์ ์๋ค. (์ ๊ทธ๋ฆผ์์์ DelegatingFilterProxy์์ Bean Filter๋ FilterChainProxy๊ฐ ๋๋ค.)
์์ํ Servlet Filter๋ ๋ณธ๋ Spring Container ์ธ๋ถ์ ์กด์ฌํ๋ค.
DelegatingFilterProxy ํด๋์ค๋ Filter๋ฅผ Spring Bean์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
DelegatingFilterProxy ํด๋์ค(Filter Class)๋ Servlet Filter ์ฌ์ด์ ์กด์ฌํ๊ณ Spring Bean์ผ๋ก ๋ฑ๋ก๋ Filter์๊ฒ ์ฒ๋ฆฌ๋ฅผ ์์ํ๋ค.
๐ฅง DelegatingPasswordEncoder
๐ DelegatingPasswordEncoder ๋?
Spring Security 5.0 ๋ฒ์ ์ด์ ์ PasswordEncoder์ ๊ธฐ๋ณธ๊ฐ์ธ NoOpPasswordEncoder๋ ์ผ๋ฐ ํ ์คํธ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฉํ๋ค.
๋น๋ฐ๋ฒํธ ํ์คํ ๋ฆฌ ์ธ์ ์ ๊ธฐ๋ฐ์ผ๋ก PasswordEncoder ๊ธฐ๋ณธ๊ฐ์ด ์ด์ BCryptPasswordEncoder ๊ฐ์ ๊ฒ์ผ๋ก ๋ฐ๋์๋ค.
ํ์ง๋ง ๋ค์์ 3๊ฐ์ง ๋ฌธ์ ๊ฐ ์กด์ฌํ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ง์ด๊ทธ๋ ์ด์ (์ด์)์ด ์ฝ์ง ์์ ์๋ ๋ฐฉ์์ผ๋ก ๋น๋ฐ๋ฒํธ๋ฅผ ์ธ์ฝ๋ฉํ๋ ๊ฒฝ์ฐ
- ๋น๋ฐ๋ฒํธ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๊ดํ์ด ๋ค์ ๋ณ๊ฒฝ๋ ์ ์์
- Spring Security๋ ํ๋ ์์ํฌ๋ก์ ์์ฃผ ๋ณ๊ฒฝ์ฌํญ์ ๋ณ๊ฒฝํ ์ ์๋ค.
๋์ ์ Spring Security๋ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ DelegatingPasswordEncoder๋ฅผ ๋์ ํ๋ค.
- ๋น๋ฐ๋ฒํธ๋ฅผ ์ต์ ์ ์ฅ ๊ถ์ฅ๋ฐฉ๋ฒ์ผ๋ก ์ธ์ฝ๋ฉ๋์๋์ง ํ์ธํ๋ค.
- ์ต์ ๋ฐ ๋ ๊ฑฐ์ ํ์์ ์ํธ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ์ฉํ๋ค.
- ํฅํ ์ธ์ฝ๋ฉ ์ ๊ทธ๋ ์ด๋๋ฅผ ํ์ฉํ๋ค.
์ฐธ๊ณ ) Baeldung Spring Method Security
๊ฐ์ฌํฉ๋๋ค.
์ค๊ฐ๋ ์ ๋ํ ์ง์ ์ ๋ ํ์์ ๋๋ค. ๐
'TIL(Today I Learned)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
8/22 (์) [Pre-Project] ํ๋ก์ ํธ ์์ํ๊ธฐ (0) | 2022.08.22 |
---|---|
7/25 (์) [Spring Security] Authentication(์ธ์ฆ) (0) | 2022.08.15 |
8/9 (ํ) [Cloud] ์ด์ ์ ๋ต (0) | 2022.08.15 |
7/19 (ํ) [Spring MVC] ์ ํ๋ฆฌ์ผ์ด์ ๋น๋ / ์คํ / ๋ฐฐํฌ (0) | 2022.08.03 |
7/18 (์) [Spring MVC] API ๋ฌธ์ํ (0) | 2022.08.02 |