[Spring Boot] Spring Security ์ค์ ํ๋ก์ ํธ - ์ธ์ฆ ํ๋ก์ธ์ค Form ์ธ์ฆ(2)
์ด ๊ธ์ ์ธํ๋ฐ - Spring Boot ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐํ๋ Spring Security๋ฅผ ํ์ตํ๋ฉด์ ์ ๋ฆฌํ ๋ด์ฉ ์ ๋๋ค.
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
GIT HUB ์ฃผ์ : https://github.com/junyharang-coding-study/spring-security-form-auth
๐ ๋ชฉ์ฐจ
โ [Spring Boot] Spring Security Basic - ๊ธฐ๋ณธ API ๋ฐ Filter ์ดํดํธ
โ [Stpring Boot] Spring Security Basic - Spring Security ์ฃผ์ ์ํคํ
์ฒ ์ดํดํธ
โ [Stpring Boot] Spring Security ์ค์ ํ๋ก์ ํธ - ์ธ์ฆ ํ๋ก์ธ์ค Form ์ธ์ฆ ๊ตฌํ(1)
โ [Stpring Boot] Spring Security ์ค์ ํ๋ก์ ํธ - ์ธ์ฆ ํ๋ก์ธ์ค Form ์ธ์ฆ ๊ตฌํ(2)
โ [Stpring Boot] Spring Security ์ค์ ํ๋ก์ ํธ - ์ธ์ฆ ํ๋ก์ธ์ค Ajax ์ธ์ฆ ๊ตฌํ
๐ Form Authentication
๐ฝ ์ธ์ฆ ์คํจ Handler
๐ฆ CustomAuthenticationFaliureHandler
์ต์ด SimpleAuthenticationFaliureHandler๋ฅผ ์์ํ Class๋ฅผ ์์ฑํด ์ฃผ์๊ณ , onAuthenticationFailure()๋ฅผ ์ฌ ์ ์ํด ์ฃผ์์ด์.
19๋ฒ์งธ ์ค์ Client์ Error Message๋ก ๋ณด์ฌ์ง๊ฒ ๋ ๊ธฐ๋ณธ ๋ฌธ์์ด์ ์ง์ ํด ์ฃผ์์ด์.
๊ทธ๋ฐ ๋ค 21๋ฒ์งธ ์ค์ BadCredentialException์ด ํฐ์ง๊ฒ ๋๋ฉด ์ฆ, ์ด์ฉ์๊ฐ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ชป ์
๋ ฅํ๊ฒ ๋๋ฉด Error Message๊ฐ 22๋ฒ์งธ ์ค์ ์
๋ ฅ๋ ๊ฒ errorMessage ๋ณ์์ ๋ด๊ธฐ๊ฒ ํด์ฃผ์๊ณ , InsufficientAuthenticationException์ด ํฐ์ง๊ฒ ๋๋ฉด 24๋ฒ์งธ ๋ฌธ์์ด์ด errerMessage ๋ณ์์ ๋ด๊ธฐ๊ฒ ํด ์ฃผ์์ด์.
๊ทธ๋ฐ ๋ค ์ธ์ฆ ์คํจ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ฉด ์ด๋ํ๊ฒ ๋ URI์ค์ ๊ณผ ํจ๊ป ์ ๋ฏธ์ errorMessage ๊ฐ์ฒด์ ๋ด๊ธด ๋ฌธ์์ด์ ๋ฃ์ด์ฃผ์ด์ Client์๊ฒ ๋ณด์ผ ์ ์๋๋ก ์ฒ๋ฆฌํด์ค ๋ค ๋ถ๋ชจ Class์๊ฒ ํด๋น ์ธ์ฆ ์คํจ ์ฒ๋ฆฌ๋ฅผ ์์ํด ์ฃผ๋๋ก 29๋ฒ์งธ ์ค์ ์ฒ๋ฆฌ๋ฅผ ํ์์ด์.
signin API Method์ ๊ฒฝ์ฐ์๋ error์ exception์ด ๋ฐ์ํ๊ฒ ๋๋ฉด ํด๋น ๊ฐ์ ๋ฐ์์ผ ํ๊ณ , ์ ๋ฐ์ํ๋ฉด ์ ๋ฐ์์ผ ํ๊ธฐ ๋๋ฌธ(required = false)์ 41 ~ 42๋ฒ์งธ ์ค์ URL Parameter ๊ฐ์ผ๋ก ๋ฐ๋๋ก ์ฒ๋ฆฌ๋ฅผ ํด ์ฃผ์์ด์.
error์ exception์ Key, Value Type์ผ๋ก ๊ฐ์ ๋ด์์ค๊ฑด๋ฐ, "error"๊ฐ Key๊ฐ ๋๊ณ , error ๋ด์ฉ์ด Value๊ฐ ๋ ๊ฒ์ด์์. Exception๋ ๋ง์ฐฌ๊ฐ์ง๊ตฌ์!
๊ทธ ๋ด์ฉ์ ๋ด๊ธฐ ์ํด Model ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ์ฃผ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค signin Page๋ก ์ด๋์ ์์ผ์ฃผ์์ด์.
๐ก ์ฐธ๊ณ ์ฌํญ
Spring Boot Model ๊ฐ์ฒด
1. Model ๊ฐ์ฒด๋ HashMap ํํ๋ฅผ ๊ฐ๊ณ ์์ด Key, Value ํ์์ผ๋ก ์ด์ฉ ๊ฐ๋ฅ.
2. addAttribute()๋ Map์ put๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ผ๋ก Model ๊ฐ์ฒด ์์ ์ํ๋ Key, Value๊ฐ์ ์ ์ฅํ ๋ค Client(View)์ Data๋ฅผ ์ ๋ฌ.
๋น์ฆ๋์ค ๋ก์ง์ Service ๋ด๋น์ด๊ธฐ ๋๋ฌธ์ Service์ signIn()๋ฅผ ํธ์ถํด์ ๋งค๊ฐ ๋ณ์ ๊ฐ๋ค์ ๋ชจ๋ ์ ๋ฌํด ์ฃผ์์ด์.
๋น์ฆ๋์ค ๋ก์ง์์ ๋งค๊ฐ ๋ณ์๋ก ๋ฐ์ Model ๊ฐ์ฒด์ Key, Value Type์ผ๋ก error ๋ด์ฉ๊ณผ exception ๋ด์ฉ์ ์ ์ฅํด ์ฃผ์์ต๋๋ค.
์ฌ๊ธฐ์์๋ parameter๊ฐ์ error๊ฐ ์กด์ฌํ๋ฉด <span> ๋ด์ฉ์ด ์ถ๋ ฅ๋๊ฒ ํ์๋๋ฐ, Text Type์ผ๋ก exception ๋ด์ฉ์ด ๋ณด์ด๋๋ก ํด ์ฃผ์์ด์.
28๋ฒ์งธ ์ค์ AuthenticationFailureHandler๋ฅผ ์ฃผ์
ํ์์ด์.
๊ทธ๋ฐ ๋ค 70๋ฒ์งธ ์ค๊ณผ ๊ฐ์ด ์ธ์ฆ ์คํจ ์ฒ๋ฆฌ Handler ์ค์ ์ ์๋ฃ ํ์์ต๋๋ค.
์ Test๋ ์ด์ฉ์๊ฐ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ชป ์
๋ ฅํ์ ๋ ์ํฉ์ด์์. ์ด๋ ๊ฒ ๋น๋ฐ๋ฒํธ๊ฐ ํ๋ฆฌ๋ฉด ํด๋น Exception์ ๋ํ error Message๊ฐ ์ถ๋ ฅ๋๋๋ก ์ฒ๋ฆฌ ๋์์ต๋๋ค.
๐ฝ ์ธ์ฆ ๊ฑฐ๋ถ ์ฒ๋ฆฌ
๐ฆ Access Denied
์ธ์ฆ์ ์๋ํ์ ๋, ์ธ์ฆ ๊ด๋ จ ์์ธ ๋ฐ์ ์ AuthenticationFilter๊ฐ ํด๋น ์์
์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฐ๋ฐ, ์ธ์ฆ์ ์ฑ๊ณตํ๋๋ฐ, ์ธ์ฆ ์ฑ๊ณต ๋ค ์ด๋ค ์์์ ์ ๊ทผํ๋ ค๊ณ ํ ๋, ์์ ์ ๊ทผ ๊ถํ์ด ์์ ๊ฒฝ์ฐ๋, ๊ถํ์ด ์๋ ๊ฒฝ์ฐ์๋ ์ธ๊ฐ ๊ด๋ จ ์์ธ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
์ธ๊ฐ ๊ด๋ จ ์์ธ๋ FilterSecurityInterceptor๊ฐ ๋ฐ์์ํค๊ฒ ๋์.
๊ทธ๋ฆฌ๊ณ , ์ธ๊ฐ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ExceptionTranslationFilter๊ฐ ์ธ๊ฐ ๊ด๋ จ ์์ธ๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค.
์ด ์ฒ๋ฆฌ๋ฅผ ์ํด AccessDeniedHandler๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค์ด ์ฃผ์๊ณ , Exception์ด ํฐ์ก์ ๊ฒฝ์ฐ ์ด๋ํ Page ๊ฒฝ๋ก๋ฅผ ๋ด์ errorPage Member ๋ณ์๋ฅผ ๋ง๋ค์ด ์ฃผ์๊ณ , setter๋ฅผ ๋ง๋ค์ด ์ฃผ์์ด์.
๊ทธ๋ฐ ๋ค handle()๋ฅผ ์ฌ์ ์ ํ๋๋กํ๊ณ , 22๋ฒ์งธ ์ค์ ์ธ๊ฐ ๊ด๋ จ Exception์ด ํฐ์ก์ ๊ฒฝ์ฐ ์ด๋ํ Page ๊ฒฝ๋ก๋ฅผ ์ค์ ํด ์ฃผ๋๋ฐ, Member ๋ณ์ errorPage(denied์ด๋ผ๋ ๋ฌธ์์ด)๊ณผ ?authorization-exception ๊ทธ๋ฆฌ๊ณ , ํด๋น Exception์ ๋ํ Message๊ฐ ๋ด๊ธฐ๋๋ก ํด ์ฃผ์์ด์.
๊ทธ๋ฐ ๋ค ํด๋น URI๋ก ์๋ต๊ฐ์ ๋ณด๋ด ์ด๋ํ๋๋ก ์ฒ๋ฆฌ ํ์์ด์.
์ธ๊ฐ ์์ธ๊ฐ ๋ฐ์ํ์ ์ ํด๋น ๋ด์ฉ์ ์ฒ๋ฆฌํ API๋ฅผ ๋ง๋ค์ด ์ฃผ์์ด์.
์ธ๊ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ฉด ํด๋น Exception์ ๋ฐ์์ผ ํ๊ธฐ ๋๋ฌธ์ URI๋ก ๋ฐ์ ์ ์๊ฒ 59๋ฒ์งธ ์ค์ ์ค์ ์ ํด์ฃผ์๊ณ , Map ํ์์ผ๋ก ๊ฐ์ ๋ฐ๊ธฐ ์ํด Model ๊ฐ์ฒด๋ฅผ ๊ฐ์ด ๋งค๊ฐ ๋ณ์๋ก ๋ฐ๋๋ก ํด ์ฃผ์์ด์.
๊ทธ๋ฐ ๋ค ๋น์ฆ๋์ค ๋ก์ง์ Service์๊ฒ ์์ํ๋๋ก ํ์๊ณ , /error ๋ฐ์ ์์นํ denied.html์ ๋ํ Page Rendering ๋๋๋ก ํ์์ด์.
63๋ฒ์งธ ์ค์ ํด๋น ์์ ์ ๊ทผ ์์ฒญ ์ด์ฉ์์ ์ ๋ณด๋ฅผ ๊บผ๋ด๊ธฐ ์ํด ContextHolder ๊ฐ์ฒด ์ Context์์ ์ธ์ฆ ๊ฐ์ฒด๋ฅผ ๊บผ๋ด๊ณ , ๊ทธ ๊ฐ์ฒด ์์ Principal(์ด์ฉ์ ID ์ ๋ณด)๋ฅผ ๊บผ๋ด๋๋ก ํ์๋๋ฐ, ํด๋น ๋ด์ฉ์ Object Type์ด๋ผ Member Entity Type์ผ๋ก ํ๋ณํ์ ํด์ ๋ฐ์์ด์.
๊ทธ๋ฐ ๋ค model ๊ฐ์ฒด์ ์ด์ฉ์ ID์ ๋ณด์ Exception ๋ด์ฉ์ ๋ด์ Client์๊ฒ ์ ๋ฌ๋๋๋ก ์ฒ๋ฆฌ ํ์์ต๋๋ค.
SpringSecurity Config ์์ 62 ~ 64๋ฒ์งธ ์ค๊ณผ ๊ฐ์ด ์ค์ ์ ํด์ฃผ์ด์ผ ํ๋๋ฐ, ์์ ๊ฐ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์์ด์.
์ด ๋ฌธ์ ๋ 77๋ฒ์งธ ์ค๋ก ์ธํด ๋ฐ์ํ๋ ๊ฑด๋ฐ, authenticationDetailsSource๋ Interface์ธ๋ฐ, ์ฌ๊ธฐ๋ค๊ฐ ๊ทธ๋ฅ ๋ฃ์ด๋ฒ๋ ค์ ๋ฐ์ํ๋ ๊ฒ์ด์์.
๋จผ์ ํด๋น ๊ฐ์ฒด๋ฅผ ๊ตฌํํ๋ ๊ตฌํ์ฒด๋ฅผ ์ฃผ์
๋ฐ๋๋ก ์ฒ๋ฆฌํ์์ด์.
๊ทธ๋ฆฌ๊ณ , ํด๋น ๊ฐ์ฒด๋ฅผ 76๋ฒ์งธ ์ค์ ๋ฃ์ด์ฃผ๊ฒ ๋๋ฉด ๋ฌธ์ ๋ ์ฌ๋ผ์ง๊ฒ ๋ฉ๋๋ค.
์ฐธ๊ณ ๋ก denied.html์ ์๋กญ๊ฒ ๋ง๋ค์ด์ก๊ณ , ์ด ๋ถ๋ถ์ ๋ํด์๋ ์ฃผ๋ํ๋ Git Hub์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
User ๊ณ์ ์ผ๋ก ์ต์ด ์ธ์ฆ์ ๋ฐ๋๋ก ํ ๊ฒ์.
user ๊ณ์ ์ ์ ๊ทผ ๊ถํ์ด ์๋ Mypage๋ ์ ์ ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
ํ์ง๋ง Admin ๊ถํ๋ง ์ ๊ทผ ๊ฐ๋ฅํ ํ๊ฒฝ์ค์ Page์ ์ ๊ทผ ์์ฒญ์ ํ์ ์ ์์ ๊ฐ์ด Error Page๋ฅผ ๋ง๋๋ ๊ฒ์ ๋ณผ ์ ์์ด์.
์ด์ ๊ธ : [Stpring Boot] Spring Security ์ค์ ํ๋ก์ ํธ - ์ธ์ฆ ํ๋ก์ธ์ค Form ์ธ์ฆ ๊ตฌํ(1)
๋ค์ ๊ธ : [Stpring Boot] Spring Security ์ค์ ํ๋ก์ ํธ - ์ธ์ฆ ํ๋ก์ธ์ค Ajax ์ธ์ฆ ๊ตฌํ
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."