๐Ÿ๏ธ Spring/Security

๐Ÿง SecurityBuilder & SecurityConfigurer SecurityBuilder๋Š” ์›น ๋ณด์•ˆ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋นˆ ๊ฐ์ฒด์™€, ์„ค์ • ํด๋ž˜์Šค๋“ค์„ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ๊ทธ ์ข…๋ฅ˜๋กœ๋Š” WebSecurity, HttpSecurity๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. SecurityConfigurer์€ Http ์š”์ฒญ๊ณผ ๊ด€๋ จ๋œ ๋ณด์•ˆ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ํ•„ํ„ฐ๋“ค์„ ์ƒ์„ฑํ•˜๊ณ , ์—ฌ๋Ÿฌ ์ดˆ๊ธฐํ™” ์ž‘์—…์— ๊ด€์—ฌํ•ฉ๋‹ˆ๋‹ค. SecurityBuilder๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด SecurityConfigurer๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ธ์ฆ ๋ฐ ์ธ๊ฐ€ ์ดˆ๊ธฐํ™” ์ž‘์—…์€ SecurityBuilder ๋‚ด๋ถ€์—์„œ SecurityConfigurer๋ฅผ ํ†ตํ•ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ดˆ๊ธฐํ™” ์ž‘์—…์€ SecurityBuilder์˜ build() ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ์•„๋ž˜์™€ ๊ฐ™์ด init()๊ณผ ..
@WebMvcTest๋ฅผ ํ†ตํ•ด Controller์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ Spring Security๋ฅผ ์ ์šฉํ•˜์˜€๋‹ค๋ฉด Security๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ Filter๋“ค์— ๋Œ€ํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ๋Œ€์‘ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฑฑ์ •์ด ๋  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ํ…Œ์ŠคํŠธ ์ง„ํ–‰ ๋„์ค‘ Error creating bean~~๋“ฑ์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‚˜์š”? ๐Ÿง ์•„๋ž˜๋Š” ์ œ๊ฐ€ ๋ฐœ์ƒ์‹œ์ผฐ๋˜ ์˜ค๋ฅ˜์ด๋ฉฐ, ์ œ๊ฐ€ ์ž‘์„ฑํ•œ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์ด๋‚˜ Directory์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋Š” ~~ ๋กœ ์ฒ˜๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name '~~..
์ฒ˜์Œ ํ•ด๋‹น ์ฝ”๋“œ ์ž‘์„ฑํ•  ๋•Œ, ์ •๋ง ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค ๊ด€๋ จ๋œ ์ž๋ฃŒ๊ฐ€ ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋žœ๋”๋ง์„ ํ†ตํ•ด ํšŒ์›๊ฐ€์ž…์„ ์ง„ํ–‰ํ•˜๋Š” ์˜ˆ์‹œ๋ฐ–์— ์—†์—ˆ๊ณ , REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹ ํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ž๋ฃŒ๊ฐ€ ์—†์–ด์„œ ๋˜๊ฒŒ ๊ณ ์ƒ ๋งŽ์ดํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ €์™€ ๊ฐ™์€ ์‚ฌ๋žŒ์ด ๋งŽ์„๊นŒ๋ด ์ด๋ ‡๊ฒŒ ์ง€๊ธˆ๊นŒ์ง€ ํ–ˆ๋˜ ๊ฒƒ๋“ค์„ ์จ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋™์ž‘ ์›๋ฆฌ ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  (๋ฆฌ์•กํŠธ๊ฐ€ ์•„๋‹ˆ์–ด๋„ ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค), ๋ฐฑ์—”๋“œ๋กœ๋Š” ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ์„ ์ง„ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ๋Š” ํ•˜๋Š”๋ฒ•์„ ๋ชจ๋ฅด๊ธฐ์— ๋„˜์–ด๊ฐ€๊ณ , ๋ฐฑ์—”๋“œ์˜ ๊ตฌ์„ฑ ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ํ”„๋ก ํŠธ์—์„œ ์†Œ์…œ ๋กœ๊ทธ์ธ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ AccessToken์„ ๋ฐ›์•„์˜ค๋Š” ์ฝ”๋“œ๊นŒ์ง€๋Š” ์ž‘์„ฑํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—์„œ๋Š” AccessToken์„ ๋ฐœ๊ธ‰๋ฐ›์•„ ์„œ๋ฒ„์— ์ „๋‹ฌํ•ด์ฃผ๊ณ , ์„œ๋ฒ„์—์„œ๋Š” ํ•ด๋‹น..
๐Ÿง JSON์œผ๋กœ ๋กœ๊ทธ์ธ์ฒ˜๋ฆฌ ํ•˜๊ธฐ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์˜ formLogin()์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋กœ์ง€ Content-Type์ด x-www-form-urlencoded์ธ ๋ฐฉ์‹์œผ๋กœ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. formLogin์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , JSON์œผ๋กœ username๊ณผ password๋ฅผ ๋ฐ›์•„์„œ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿง formLogin()์˜ ์ž‘๋™๋ฐฉ์‹ ์‹œํ๋ฆฌํ‹ฐ์˜ formLogin()์„ ํ™œ์„ฑํ™” ์‹œํ‚ค๋ฉด ๋‹ค์Œ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด FormLoginConfigurer๊ฐ€ ํ™œ์„ฑํ™” ๋˜๋Š”๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ FormLoginConfigurer ์—์„œ๋Š” UsernamePasswordAuthenticationFilter๋ž€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ด์— ๋Œ€ํ•œ ์ž‘๋™๋ฐฉ์‹์„ ํ™•์ธํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿง Username..
Login์ด ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ํ›„์ฒ˜๋ฆฌ ํ•˜๋Š” ๋ฐฉ๋ฒ• Spring Security๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋กœ๊ทธ์ธ์„ ์†์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋กœ๊ทธ์ธ ์ดํ›„, ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•œ๋‹ค๋˜๊ฐ€ ํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ์ƒํ™ฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ๋‹ค. AuthenticationSuccessHandler ๊ตฌํ˜„ ํ›„์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ๊ฐ„๋‹จํ•œ๋ฐ, Spring Security์— ์กด์žฌํ•˜๋Š” AuthenticationSuccessHandler ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. AuthenticationSuccessHandler ์€ ์ด 2๊ฐœ์˜ ๋ฉ”์†Œ๋“œ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ  ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” default ๋ฉ”์†Œ๋“œ์ด๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” Handler ํด๋ž˜์Šค๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ž‘์„ฑํ•˜์ž. @Slf4j @Component public class CustomLo..
์š”์ฆ˜์€ OAuth2๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ํ†ตํ•ด ๊ฐ€์ž…์ด ๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค๋“ค์ด ๊ต‰์žฅํžˆ ๋งŽ๋‹ค. ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์—์„œ๋„ OAuth2๋ฅผ ์ด์šฉํ•œ ์†Œ์…œ ๋กœ๊ทธ์ธ ๋ฐฉ์‹์„ ์ง€์›ํ•˜๋Š”๋ฐ, ํ•„์ž๋Š” ๋งจ ์ฒ˜์Œ ์ด๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ๋„ˆ๋ฌด ์–ด๋ ค์› ์—ˆ๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ ์‹œํ๋ฆฌํ‹ฐ์—์„œ OAuht2๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž. ์˜์กด์„ฑ ๊ด€๋ฆฌ ์šฐ์„  OAuth2๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด OAuth2-client ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค. build.gradle ์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์ž. implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' oauth2Login() ์˜ ์ž‘๋™๋ฐฉ์‹ WebSecurityConfigurerAdapter ๋ฅผ ์ƒ์†๋ฐ›์€ Security Config ํŒŒ์ผ์—์„œ oauth2 ๋กœ๊ทธ์ธ..
๋ง ๋ž‘
'๐Ÿ๏ธ Spring/Security' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก