[Spring boot] Spring boot Security๋ฅผ ์ด์šฉํ•œ OAuth2 ์ธ์ฆ ๊ตฌํ˜„ 3 - ๊ตญ๋‚ด ํฌํ„ธ ์ธ์ฆ

๋ฐ˜์‘ํ˜•

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ ๊ธฐ์กด์˜ User Entity ํ˜น์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ User Entity์™€ ์—ฐ๋™ํ•˜์—ฌ OAuth2 ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ดค์Šต๋‹ˆ๋‹ค.

 

Spring boot Security์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Google, Facebook ๋“ฑ์˜ ํ•ด์™ธ ์†Œ์…œ ๋กœ๊ทธ์ธ API๋ฅผ ์ง€์›ํ•˜๋ฉฐ ์šฐ๋ฆฌ๋Š” ์ง€์›ํ•ด์ฃผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ž˜ ์ด์šฉํ•˜์—ฌ Key์™€ Client ID๋งŒ ๋„ฃ์–ด์ฃผ๋ฉด ์‰ฝ๊ฒŒ OAuth2 ์ธ์ฆ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ, NAVER, Kakao ๋“ฑ ๊ตญ๋‚ด ํฌํ„ธ ์‚ฌ์ดํŠธ์˜ OAuth2 ์ธ์ฆ์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

 

 

 

NAVER, Kakao API๋ฅผ ์ด์šฉํ•œ OAuth2 ์ธ์ฆ

Spring boot Security์—์„œ๋Š” ๊ณต๊ต๋กญ๊ฒŒ๋„ ๊ตญ๋‚ด ํฌํ„ธ OAuth2 ์ธ์ฆ์— ๋Œ€ํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ณตํ•ด์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋“ค OAuth2 ์ธ์ฆ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํฌํ„ธ ์„œ๋ฒ„์—์„œ ์–ด๋–ค์‹์œผ๋กœ ์ธ์ฆ์ด ์ด๋ฃจ์–ด์ง€๊ณ , ํ†ต์‹ ์„ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ์•„๋ž˜์˜ ๊ธ€์—์„œ ๋‹ค๋ค˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

2020/08/07 - [Programming/Spring] - [Spring boot] Spring boot Security๋กœ ์‹œ์ž‘ํ•ด๋ณด๋Š” ์ธ์ฆ

 

[Spring boot] Spring boot Security๋กœ ์‹œ์ž‘ํ•ด๋ณด๋Š” ์ธ์ฆ

Spring Framework๋ฅผ ์ด์šฉํ•˜์—ฌ ์›น ์„œ๋น„์Šค๋‚˜ REST API ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐ€์žฅ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์€ ๋ฐ”๋กœ ์ธ์ฆ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์ธ์ฆ์ด๋ž€, ๋‚ด๊ฐ€ ๊ฐœ๋ฐœํ•œ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‹๋ณ„ํ•˜๊ณ ์ž ๏ฟฝ๏ฟฝ

blog.neonkid.xyz

๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณต์Šต์„ ํ•ด๋ณด์ž๋ฉด, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ†ตํ•ด ์–ด๋– ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ–ˆ์„ ๊ฒฝ์šฐ, ๊ทธ์— ๋Œ€ํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•ด๋‹น ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ•˜๋ฉฐ, OAuth2 ์ธ์ฆ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ฒค๋”์˜ ๊ถŒํ•œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์šฐ๋ฆฌ ๋ฒค๋”์˜ OAuth2 ์ธ์ฆ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ณ , ์ด์— ๋Œ€ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ถ€์—ฌํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

Using ClientRegistration

ClientRegistration ํด๋ž˜์Šค๋Š” Spring boot Security์—์„œ ์ œ๊ณตํ•˜๋Š” OAuth2 Client ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ Google OAuth2 ์ธ์ฆ ๊ตฌํ˜„ ์—ญ์‹œ ์ด ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„๋œ Google OAuth2 Provider๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๊ธฐ๋ณธ์ ์œผ๋กœ CommonOAuth2Provider์—์„œ ์ œ๊ณตํ•˜๋Š” ์†Œ์…œ ๋กœ๊ทธ์ธ์—๋Š” Google, Facebook, Github๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋„ค์ด๋ฒ„์™€ ์นด์นด์˜ค ๋“ฑ์€ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ์ด Provider ์ฝ”๋“œ๋ฅผ ๋ฒ ์ด์Šค๋กœ ํ•˜์—ฌ, ์นด์นด์˜ค ์ธ์ฆ์„ ์œ„ํ•œ ๋กœ๊ทธ์ธ ๋นŒ๋”๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์œ„์™€ ๊ฐ™์ด ์นด์นด์˜ค ๋กœ๊ทธ์ธ API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์„œ ์นด์นด์˜ค์˜ ๊ฐœ์ธ์ •๋ณด ์ค‘ ๋‹‰๋„ค์ž„๊ณผ ํ”„๋กœํ•„ ์‚ฌ์ง„๋งŒ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ scope๋ฅผ profile๋กœ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ ๋‹ค์Œ, SecurityConfig์—์„œ ClientRegistration์„ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ถ€๋ถ„์— ์นด์นด์˜ค ๋ถ€๋ถ„์„ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ Builder์— ๋“ค์–ด์žˆ๋Š” ์ธ์ž๋Š” ์นด์นด์˜ค ๋กœ๊ทธ์ธ์„ ์œ„ํ•œ Redirect URI์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

 

๋˜ํ•œ ์นด์นด์˜ค ๋กœ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Client ID๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, Google ๋กœ๊ทธ์ธ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ Secret key๊ฐ€ ํ•„์ˆ˜์ ์œผ๋กœ ํ•„์š”ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ClientRegistration์—์„œ Secret key๊ฐ€ NULL๋กœ ์„ค์ •๋  ๊ฒฝ์šฐ, ์˜ค๋ฅ˜๋ฅผ ์ถœ๋ ฅํ•˜๋ฏ€๋กœ ์•„๋ฌด๋Ÿฐ ๊ฐ’์„ ์ž…๋ ฅํ•ด์ฃผ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

Client ID๋Š” application.yml ํŒŒ์ผ์—์„œ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ๋Š” "custom.oauth2.kakao.client-id"๋กœ ์„ค์ •ํ•˜์—ฌ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์œผ๋ฏ€๋กœ application.yml ํŒŒ์ผ์— ์œ„์™€ ๊ฐ™์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์„ ์–ธํ•œ ํ›„, Client ID ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

ArgumentResolver๋ฅผ ์ด์šฉํ•˜์—ฌ ์นด์นด์˜ค ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•  ๊ฒฝ์šฐ, ๊ฐ€์ ธ์˜ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜ํ•  ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์ค๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ User Entity๋ฅผ ๋งŒ๋“ค์—ˆ๋˜ ๊ฒƒ ๊ทธ๋Œ€๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฉ”์ผ ์ฃผ์†Œ์™€ ๋‹‰๋„ค์ž„์„ ๊ฐ€์ ธ์˜ค๋„๋ก ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์นด์นด์˜ค ๋กœ๊ทธ์ธ API๋ฅผ ํ†ตํ•ด ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ด๋ฉ”์ผ ์ฃผ์†Œ ๋™์˜๋ฅผ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. (๊ฐœ์ • ์‚ฌํ•ญ)์ด ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•˜์‹œ์–ด ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์„ธ์š”. ๋งŒ์•ฝ, ์„ ํƒ ๋™์˜๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋™์˜ํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ํ•ธ๋“ค๋ง์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

์†Œ์…œ ํƒ€์ž…์— Kakao๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ View ๊ตฌ๊ฐ„์—์„œ ์นด์นด์˜ค ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๊ณ , ๊ถŒํ•œ์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ View ๋‹จ์— ์นด์นด์˜ค ๋กœ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋์ž…๋‹ˆ๋‹ค.

 

 

 

 

Test

์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•œ ํ›„ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ ๋‹ค์Œ ์นด์นด์˜ค ๋กœ๊ทธ์ธ์„ ํ†ตํ•ด ๋กœ๊ทธ์ธํ•˜๋ฉด...

 

์œ„์™€ ๊ฐ™์ด ๊ฒŒ์‹œํŒ์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ฐ์ดํ„ฐ๋„ ์ž˜ ๋‚˜์˜ค๋Š” ๊ตฐ์š” ^^;

 

 

 

๋งˆ์น˜๋ฉฐ...

์—ฌ๊ธฐ๊นŒ์ง€ Spring boot Security๋ฅผ ์ด์šฉํ•œ OAuth2 ์ธ์ฆ ๊ตฌํ˜„ 3๋ฒˆ์งธ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ดค์Šต๋‹ˆ๋‹ค. OAuth2 ์ธ์ฆ์ด ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ์ดํ•ดํ–ˆ๋‹ค๋ฉด, ์ด๋ฒˆ ํฌ์ŠคํŠธ๋Š” ๊ทธ๋ฆฌ ์–ด๋ ค์šด ๋‚ด์šฉ์€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

 

๋˜ํ•œ ๋งค๋ฒˆ ์†Œ์…œ์—์„œ ์ œ๊ณตํ•˜๋Š” API URI๋Š” ์–ธ์ œ๋“ ์ง€ ๋ฐ”๋€” ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ผ์€ ๋ฐ˜๋“œ์‹œ ์ฐธ๊ณ ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

https://github.com/NEONKID/Spring-OAuthExample

 

NEONKID/Spring-OAuthExample

Spring boot Security OAuth2 Example. Contribute to NEONKID/Spring-OAuthExample development by creating an account on GitHub.

github.com

๋งˆ์ง€๋ง‰์œผ๋กœ OAuth2 ์ธ์ฆ์— ๋Œ€ํ•œ ์†Œ์Šค ์ฝ”๋“œ๋Š” ์œ„ Github ์ฃผ์†Œ๋ฅผ ํ†ตํ•ด์„œ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments