[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 ์ฃผ์๋ฅผ ํตํด์ ์ฐธ๊ณ ํ ์ ์์ต๋๋ค.