Back-End ์ž‘์—…์‹ค/Spring Framework

[Spring Boot] Spring Security ์‹ค์ „ ํ”„๋กœ์ ํŠธ - ์ธ์ฆ ํ”„๋กœ์„ธ์Šค Form ์ธ์ฆ(2)

์ฃผ๋‹ˆ์“ฐ๐Ÿง‘‍๐Ÿ’ป 2022. 8. 24. 10:55
728x90
๋ฐ˜์‘ํ˜•

 

์ด ๊ธ€์€ ์ธํ”„๋Ÿฐ -  Spring Boot ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” Spring Security๋ฅผ ํ•™์Šตํ•˜๋ฉด์„œ ์ •๋ฆฌํ•œ ๋‚ด์šฉ ์ž…๋‹ˆ๋‹ค.

 

 

 

 

์Šคํ”„๋ง ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ์ฝ”๋”ฉ ๊ณต์ž‘์†Œ ๊ฐœ์ • 2ํŒ

COUPANG

www.coupang.com

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."

 

 

 

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

 

CustomAuthenticationFailureHandler.java

728x90


์ตœ์ดˆ SimpleAuthenticationFaliureHandler๋ฅผ ์ƒ์†ํ•œ Class๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์—ˆ๊ณ , onAuthenticationFailure()๋ฅผ ์žฌ ์ •์˜ํ•ด ์ฃผ์—ˆ์–ด์š”.

19๋ฒˆ์งธ ์ค„์— Client์— Error Message๋กœ ๋ณด์—ฌ์ง€๊ฒŒ ๋  ๊ธฐ๋ณธ ๋ฌธ์ž์—ด์„ ์ง€์ •ํ•ด ์ฃผ์—ˆ์–ด์š”.
๊ทธ๋Ÿฐ ๋’ค 21๋ฒˆ์งธ ์ค„์— BadCredentialException์ด ํ„ฐ์ง€๊ฒŒ ๋˜๋ฉด ์ฆ‰, ์ด์šฉ์ž๊ฐ€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž˜ ๋ชป ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด Error Message๊ฐ€ 22๋ฒˆ์งธ ์ค„์— ์ž…๋ ฅ๋œ ๊ฒƒ errorMessage ๋ณ€์ˆ˜์— ๋‹ด๊ธฐ๊ฒŒ ํ•ด์ฃผ์—ˆ๊ณ , InsufficientAuthenticationException์ด ํ„ฐ์ง€๊ฒŒ ๋˜๋ฉด 24๋ฒˆ์งธ ๋ฌธ์ž์—ด์ด errerMessage ๋ณ€์ˆ˜์— ๋‹ด๊ธฐ๊ฒŒ ํ•ด ์ฃผ์—ˆ์–ด์š”. 

๊ทธ๋Ÿฐ ๋’ค ์ธ์ฆ ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด ์ด๋™ํ•˜๊ฒŒ ๋  URI์„ค์ •๊ณผ ํ•จ๊ป˜ ์ ‘๋ฏธ์— errorMessage ๊ฐ์ฒด์— ๋‹ด๊ธด ๋ฌธ์ž์—ด์„ ๋„ฃ์–ด์ฃผ์–ด์„œ Client์—๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌํ•ด์ค€ ๋’ค ๋ถ€๋ชจ Class์—๊ฒŒ ํ•ด๋‹น ์ธ์ฆ ์‹คํŒจ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•ด ์ฃผ๋„๋ก 29๋ฒˆ์งธ ์ค„์— ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์˜€์–ด์š”.




UserController.java

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()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๋งค๊ฐœ ๋ณ€์ˆ˜ ๊ฐ’๋“ค์„ ๋ชจ๋‘ ์ „๋‹ฌํ•ด ์ฃผ์—ˆ์–ด์š”.


UserService.java

 

UserServiceImpl.java

 

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ Model ๊ฐ์ฒด์— Key, Value Type์œผ๋กœ error ๋‚ด์šฉ๊ณผ exception ๋‚ด์šฉ์„ ์ €์žฅํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.



signin.html

 

์—ฌ๊ธฐ์—์„œ๋Š” parameter๊ฐ’์— error๊ฐ€ ์กด์žฌํ•˜๋ฉด <span> ๋‚ด์šฉ์ด ์ถœ๋ ฅ๋˜๊ฒŒ ํ•˜์˜€๋Š”๋ฐ, Text Type์œผ๋กœ exception ๋‚ด์šฉ์ด ๋ณด์ด๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.



WebSecurityConfigure.java

 

28๋ฒˆ์งธ ์ค„์— AuthenticationFailureHandler๋ฅผ ์ฃผ์ž…ํ•˜์˜€์–ด์š”.

WebSecurityConfigure.java


๊ทธ๋Ÿฐ ๋’ค 70๋ฒˆ์งธ ์ค„๊ณผ ๊ฐ™์ด ์ธ์ฆ ์‹คํŒจ ์ฒ˜๋ฆฌ Handler ์„ค์ •์„ ์™„๋ฃŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.




์œ„ Test๋Š” ์ด์šฉ์ž๊ฐ€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž˜ ๋ชป ์ž…๋ ฅํ–ˆ์„ ๋•Œ ์ƒํ™ฉ์ด์—์š”. ์ด๋ ‡๊ฒŒ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ‹€๋ฆฌ๋ฉด ํ•ด๋‹น
Exception์— ๋Œ€ํ•œ error Message๊ฐ€ ์ถœ๋ ฅ๋˜๋„๋ก ์ฒ˜๋ฆฌ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

    ๐Ÿ”ฝ  ์ธ์ฆ ๊ฑฐ๋ถ€ ์ฒ˜๋ฆฌ

        ๐Ÿ“ฆ Access Denied

์ธ์ฆ์„ ์‹œ๋„ํ–ˆ์„ ๋•Œ, ์ธ์ฆ ๊ด€๋ จ ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ AuthenticationFilter๊ฐ€ ํ•ด๋‹น ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ, ์ธ์ฆ์€ ์„ฑ๊ณตํ–ˆ๋Š”๋ฐ, ์ธ์ฆ ์„ฑ๊ณต ๋’ค ์–ด๋–ค ์ž์›์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ์ž์› ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†์„ ๊ฒฝ์šฐ๋‚˜, ๊ถŒํ•œ์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ์ธ๊ฐ€ ๊ด€๋ จ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


์ธ๊ฐ€ ๊ด€๋ จ ์˜ˆ์™ธ๋Š” FilterSecurityInterceptor๊ฐ€ ๋ฐœ์ƒ์‹œํ‚ค๊ฒŒ ๋˜์š”.
๊ทธ๋ฆฌ๊ณ , ์ธ๊ฐ€ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ExceptionTranslationFilter๊ฐ€ ์ธ๊ฐ€ ๊ด€๋ จ ์˜ˆ์™ธ๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

CustomAccessDeniedHandler.java

 

์ด ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด AccessDeniedHandler๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๊ณ , Exception์ด ํ„ฐ์กŒ์„ ๊ฒฝ์šฐ ์ด๋™ํ•  Page ๊ฒฝ๋กœ๋ฅผ ๋‹ด์„ errorPage Member ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๊ณ , setter๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์–ด์š”.

๊ทธ๋Ÿฐ ๋’ค handle()๋ฅผ ์žฌ์ •์˜ ํ•˜๋„๋กํ•˜๊ณ , 22๋ฒˆ์งธ ์ค„์— ์ธ๊ฐ€ ๊ด€๋ จ Exception์ด ํ„ฐ์กŒ์„ ๊ฒฝ์šฐ ์ด๋™ํ•  Page ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ด ์ฃผ๋Š”๋ฐ, Member ๋ณ€์ˆ˜ errorPage(denied์ด๋ผ๋Š” ๋ฌธ์ž์—ด)๊ณผ ?authorization-exception ๊ทธ๋ฆฌ๊ณ , ํ•ด๋‹น Exception์— ๋Œ€ํ•œ Message๊ฐ€ ๋‹ด๊ธฐ๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.

๊ทธ๋Ÿฐ ๋’ค ํ•ด๋‹น URI๋กœ ์‘๋‹ต๊ฐ’์„ ๋ณด๋‚ด ์ด๋™ํ•˜๋„๋ก ์ฒ˜๋ฆฌ ํ•˜์˜€์–ด์š”.


UserController.java

์ธ๊ฐ€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ์‹œ ํ•ด๋‹น ๋‚ด์šฉ์„ ์ฒ˜๋ฆฌํ•  API๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์–ด์š”.
์ธ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น Exception์„ ๋ฐ›์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— URI๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ 59๋ฒˆ์งธ ์ค„์— ์„ค์ •์„ ํ•ด์ฃผ์—ˆ๊ณ , Map ํ˜•์‹์œผ๋กœ ๊ฐ’์„ ๋ฐ›๊ธฐ ์œ„ํ•ด Model ๊ฐ์ฒด๋ฅผ ๊ฐ™์ด ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐ›๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.

๊ทธ๋Ÿฐ ๋’ค ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ Service์—๊ฒŒ ์œ„์ž„ํ•˜๋„๋ก ํ•˜์˜€๊ณ , /error ๋ฐ‘์— ์œ„์น˜ํ•œ denied.html์— ๋Œ€ํ•œ Page Rendering ๋˜๋„๋ก ํ•˜์˜€์–ด์š”.



UserService.java

UserServiceImpl.java


63๋ฒˆ์งธ ์ค„์— ํ•ด๋‹น ์ž์› ์ ‘๊ทผ ์š”์ฒญ ์ด์šฉ์ž์— ์ •๋ณด๋ฅผ ๊บผ๋‚ด๊ธฐ ์œ„ํ•ด ContextHolder ๊ฐ์ฒด ์•ˆ Context์•ˆ์— ์ธ์ฆ ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด๊ณ , ๊ทธ ๊ฐ์ฒด ์•ˆ์— Principal(์ด์šฉ์ž ID ์ •๋ณด)๋ฅผ ๊บผ๋‚ด๋„๋ก ํ•˜์˜€๋Š”๋ฐ, ํ•ด๋‹น ๋‚ด์šฉ์€ Object Type์ด๋ผ Member Entity Type์œผ๋กœ ํ˜•๋ณ€ํ™˜์„ ํ•ด์„œ ๋ฐ›์•˜์–ด์š”.

๊ทธ๋Ÿฐ ๋’ค model ๊ฐ์ฒด์— ์ด์šฉ์ž ID์ •๋ณด์™€ Exception ๋‚ด์šฉ์„ ๋‹ด์•„ Client์—๊ฒŒ ์ „๋‹ฌ๋˜๋„๋ก ์ฒ˜๋ฆฌ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.



WebSecurityConfigure.java


SpringSecurity Config ์•ˆ์— 62 ~ 64๋ฒˆ์งธ ์ค„๊ณผ ๊ฐ™์ด ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์œ„์™€ ๊ฐ™์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์–ด์š”.


WebSecurityConfigure.java


์ด ๋ฌธ์ œ๋Š” 77๋ฒˆ์งธ ์ค„๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฑด๋ฐ, authenticationDetailsSource๋Š” Interface์ธ๋ฐ, ์—ฌ๊ธฐ๋‹ค๊ฐ€ ๊ทธ๋ƒฅ ๋„ฃ์–ด๋ฒ„๋ ค์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด์—์š”.


WebSecurityConfigure.java


๋จผ์ € ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ตฌํ˜„ํ–ˆ๋˜ ๊ตฌํ˜„์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›๋„๋ก ์ฒ˜๋ฆฌํ•˜์˜€์–ด์š”.



WebSecurityConfigure.java


๊ทธ๋ฆฌ๊ณ , ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ 76๋ฒˆ์งธ ์ค„์— ๋„ฃ์–ด์ฃผ๊ฒŒ ๋˜๋ฉด ๋ฌธ์ œ๋Š” ์‚ฌ๋ผ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


์ฐธ๊ณ ๋กœ denied.html์€ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค์–ด์กŒ๊ณ , ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์ฃผ๋‹ˆํ•˜๋ž‘ Git Hub์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 


User ๊ณ„์ •์œผ๋กœ ์ตœ์ดˆ ์ธ์ฆ์„ ๋ฐ›๋„๋ก ํ• ๊ฒŒ์š”.




user ๊ณ„์ •์— ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ๋Š” Mypage๋Š” ์ •์ƒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.





ํ•˜์ง€๋งŒ Admin ๊ถŒํ•œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ์„ค์ • Page์— ์ ‘๊ทผ ์š”์ฒญ์„ ํ–ˆ์„ ์‹œ ์œ„์™€ ๊ฐ™์ด Error Page๋ฅผ ๋งŒ๋‚˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.






์ด์ „ ๊ธ€ : [Stpring Boot] Spring Security ์‹ค์ „ ํ”„๋กœ์ ํŠธ - ์ธ์ฆ ํ”„๋กœ์„ธ์Šค Form ์ธ์ฆ ๊ตฌํ˜„(1)

๋‹ค์Œ ๊ธ€ : [Stpring Boot] Spring Security ์‹ค์ „ ํ”„๋กœ์ ํŠธ - ์ธ์ฆ ํ”„๋กœ์„ธ์Šค Ajax ์ธ์ฆ ๊ตฌํ˜„



 

 

 

 

 

์Šคํ”„๋ง ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ์ฝ”๋”ฉ ๊ณต์ž‘์†Œ ๊ฐœ์ • 2ํŒ

COUPANG

www.coupang.com

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."

 

 

728x90
๋ฐ˜์‘ํ˜•