์ด๋ฒ ์ฑ์ผ์์ ๊ฐ์ฅ ๋จผ์ ๋ง๊ฒ ๋ ํํธ์ด์, ๋ด๊ฐ ์์ ๋ฌธ์ธํ์ธ ์นด์นด์ค ๋ก๊ทธ์ธ์ ๊ตฌํํ๋ ค ํ๋ค.
๋จผ์ OAuth2.0 ๊ฐ๋
์ ์ดํด๋ฅผ ์ํด ์ํ์ฝ๋ฉ ์ ํ๋ธ ์์์ ์ฐธ๊ณ ํด ๊ณต๋ถํ์๋ค.
Resource Owner, Resource Server, Client๋ก ๊ตฌ๋ถ์ง์๋ค.
์ดํ resource๋ ์๋ตํ๊ณ ์์ฑํ์๋ค.
OAuth2.0์ ๊ธฐ๋ณธ ์์ด๋์ด
- client๋ server์ ๋ฑ๋ก, id์ secret์ ์ ๊ณต ๋ฐ์
- client๊ฐ owner์๊ฒ ๋ก๊ทธ์ธ ์น์ธ ๋ฒํผ ์ ๊ณต
- server๊ฐ owner์๊ฒ ์ ๋ณด ์ ๊ณต ๋์ ๋ฒํผ ์ ๊ณต
- server๊ฐ client์๊ฒ 'code'๋ผ๋ owner๊ฐ ๋์ํ์์ ๋ํ๋ด๋ ์ ๋ณด๋ฅผ ์ ๊ณต
- client๊ฐ server์๊ฒ id์ secret์ code์ ํจ๊ป ๋ฐํ, ์ด๋ก์ access token์ ์ ๊ณต ๋ฐ์
- ์ดํ client๋ access token์ ์ด์ฉํด ์์ฒญ, server๋ ์์ ์ด ๋ถ์ฌํ๋ ํ ํฐ์ด๋ฉด ์๋ฝ ๋ฐ resource ์ ๊ณต
- client๋ ๋ฐ์ resource๋ฅผ ์๋ง๊ฒ ๊ฐ๊ณตํด owner์๊ฒ ์ ๊ณต
์ด ์ค 5๋ฒ๋ถํฐ๊ฐ ๋ด๊ฐ ๊ตฌํํด์ผํ๋ ๋ถ๋ถ์ด์๋ค.
์ฐ๋ฆฌ๋ ์นด์นด์ค ๋ก๊ทธ์ธ๋ง ๊ตฌํํ๊ธฐ ๋๋ฌธ์, ์์น๋๋ก provider๋ ๋๋ ค ๋ฐ๊ธด ํ์ง๋ง ์์ง ์ฐ์ง๋ ์์๊ณ
authentication code, client id, client secret์ ํตํด ์ ๋ณด๋ฅผ ๋ฐ์์ค๋ api๋ฅผ ์์ฑํ๋ค.
๋จผ์ ์๋ํ๋ ํ์ด์ด๋ฒ ์ด์ค ์ธ์ฆ!
๊ธฐ๋ณธ์ ์ผ๋ก firebase authentication์ด ์ ๊ณตํ๋ ๋ก๊ทธ์ธ ๋ฐฉ๋ฒ์ด ๊ฝค ์๋ค.
google, facebook, twitter, github ๋ฑ๋ฑ.. ๊ทธ๋ ์ง๋ง ์นด์นด์คํก์ ์๋ค.
๋์ ์ปค์คํ
ํ ํฐ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
access token์ผ๋ก Kakao API์ ์ ๋ณด ์์ฒญ์ ํด์ ์ ์๋ํ๋์ง ํ์ธ ํ firebase admin SDK๋ฅผ ์ฌ์ฉํด firebase authentication์ user๋ฅผ ์์ฑํ๋ค.
์์ฑ๋ ํ์ด์ด๋ฒ ์ด์ค ์ฌ์ฉ์์ UID๋ฅผ ํตํด firebase custom token์ ์๋ฒ์์ ์์ฑํ๋ค. ๊ธฐ๊ธฐ์ ์ ๋ฌ ํ signInWithCustomToken ๋ฉ์๋์ ์ด๋ฅผ ๋๊ฒจ ๋ก๊ทธ์ธ ํ๋ค. ์๊ฐ๋ณด๋ค ์์ฒญ ๊ฐํธํ๋ค.
์ค์ ๋ก ํ์ด์ด๋ฒ ์ด์ค ์ ์ ๋ฅผ ๋ฑ๋กํ๊ณ UID๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฑ์ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด์์ง๋ง ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค.
ํด๋น ํ๋ก์ ํธ์์๋ Firebase์์ ์ ์ ๋ฅผ ์๋ณํ๋๋ฐ ์ฌ์ฉํ๋ ์ด๋ฉ์ผ์ ์นด์นด์ค๋ก๋ถํฐ ๋ฐ์์ค์ง ์์๋ค. ๊ทธ์ ์๋ณ์์ ๋๋ค์ ์ ๋์ ์ ๋ณด๋ง ์๊ตฌํ๋ค. ๋ฐ๋ผ์ ์ด๋ป๊ฒ ์ ์ ๋ฅผ ๋ฑ๋กํ๊ณ ์ด๋ป๊ฒ ํ ํฐ์ ์์ฑํ ์ง ๊ณ ๋ฏผ์ด ๋์๋ค.
firebase auth๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ๋ก ํ๋ค.
๋ฌผ๋ก firebase authentication์ ์ฅ์ ๋ ์์๊ณ ์๋์ ๊ฐ๋ค.
ํ์๊ฐ์ ์์ ์ ์ ๋ ฅ๋ฐ์ ์ฌ์ฉ์์ ์์ด๋๋ก ์์๋ก ์ด๋ฉ์ผ ํํ์ ๋ฌธ์์ด์ ์์ฑํด์ ์ฌ์ฉํ๊ฑฐ๋, ์นด์นด์ค ์ธก์ ์ด๋ฉ์ผ์ ์๊ตฌํ ์๋ ์์์ผ๋ ๋ฒ๊ฑฐ๋กญ๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ์๋ ๋ฒ์ ์์์ ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๊ณ ์ถ์๋ค.
๋ฐ๋ผ์ ์นด์นด์ค์๊ฒ ๋๋ ค๋ฐ์ ํ์ ์๋ณ ๋ฒํธ๋ง์ผ๋ก ์ ์ ๋ฅผ ์๋ณํ๊ณ , ์ฐ๋ฆฌ ์๋ฒ ๋ด์์๋ ํด๋น ์ ์ ์ ๋ณด๋ฅผ ์ง๋ JWT ํ ํฐ์ผ๋ก ์ฌ์ฉ์๋ฅผ ์๋ณํ๋ ๋ฐฉ์์ ์ ํํ๋ค.
์ธ๊ฐ ์ฝ๋์ provider๋ฅผ ๋๊ฒจ์ฃผ๋ ๊ฒ ๊น์ง๋ ํด๋ผ์ด์ธํธ์ ๋ฒ์์ด์ง๋ง, ๋๋ ์ผ๋จ ๊ณต๋ถ๊ฒธ ํด๋ผ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋๊ฒธ ํผ์ ์ฐ์ตํด๋ณด์๋ค.
๊ฒ์ํ๋ฉด ๋ง์ด ๋์ค๋ ๋ฐฉ์์ผ๋ก KAKAO DEVELOPERS์์ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ฑ๋กํ๊ณ ,
<https://kauth.kakao.com/oauth/authorize?response_type=code&redirect_uri=>{๋ด ์ฝ๋ฐฑ URI}&client_id={๋ด ์นด์นด์ค ํด๋ผ์ด์ธํธ ์์ด๋}
ํด๋น uri๋ก ์ด๋ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ์ด์ง๊ฐ ๋ฑ์ฅํ๋ค.
์ ํ์ด์ง์์ ๋ก๊ทธ์ธ์ ํ๋ฉด ์๋์ ๊ฐ์ URI์ ํ์ด์ง๋ก ์ด๋ํ๋ค.
{๋ด ์ฝ๋ฐฑ URI}?code={์ธ๊ฐ์ฝ๋}
๋ก ์ธ๊ฐ ์ฝ๋๋ฅผ ์ป์ ์ ์๋ค.
์ด๋ ๊ฒ ์ป์ ํด๋น ์ธ๊ฐ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ๋ก๊ทธ์ธ API์์ https://kauth.kakao.com/oauth/token
๋ก POST๋ฅผ ๋ ๋ฆฌ๋ฉด, ์ด์ธ์คํ ํฐ, ๋ฆฌํ๋ ์ํ ํฐ์ ๋๋ ค์ค๋ค.
์ดํ ๋๋ ค ๋ฐ์ ๋๊ฐ์ ํ ํฐ์ผ๋ก https://kapi.kakao.com/v2/user/me
์ GET์ ๋ ๋ฆฐ๋ค.
๊ทธ๋ฌ๋ฉด ์ ์ ์ ์นด์นด์ค ํ๋กํ์ ๋๋ ค์ฃผ๋๋ฐ ์ด ๋ ์นด์นด์ค์์ ์ ๊ณตํ๋ ์ ์ ID๊ฐ ์์์ ๋งํ ์ ์ ์ ์๋ณ๋ฒํธ ์ญํ ์ด๋ค.
๋๋์ด ์ป์ ์ ์ ์๋ณ๋ฒํธ๋ก DB๋ฅผ ์กฐํํ๋ค.
์๋ฒ ์ค๋ฅ๋ผ๋๊ฐ ํ์ํ ๊ฐ์ด ์๋ค๊ฑฐ๋ ๋ญ ๊ทธ๋ฐ ๊ฑธ ์ ์ธํ๊ณ ํฌ๊ฒ ์ธ๊ฐ์ง response๊ฐ ์กด์ฌํ๋ค.
๋จผ์ ์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ์๋ ํด๋น ์ ์ ์ JWT ํ ํฐ (access, refresh)์ ๋ง๋ค์ด ๋ฐํํ์๋ค.
๋ ๋ฒ์งธ ๊ฒฝ์ฐ์๋ ํ์๊ฐ์ ์ ์ํด ํ์ํ ์ ๋ณด๋ฅผ ๋๋ ค์ฃผ์๋ค.
์ด ์ ๋ณด์ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋๋ค์ ๋ฑ์ ๊ฐ์ง๊ณ ํ์๊ฐ์
API์ ์์ฒญํ๋ค.
ํ์๊ฐ์
์ ์ฑ๊ณตํ๊ณ ๋๋ฉด ๋ง์ฐฌ๊ฐ์ง๋ก JWT ํ ํฐ(access, refresh)์ ๋ง๋ค์ด ๋ฐํํ๋ค.
์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ ์ฌ์ฉ์ ํ๋กํ ์์ด๋(์ธ์คํ ์์ด๋ ๋๋)๋ง ์ค๋ณต์ฒดํฌ ํด์ฃผ์๋ค.
์ธ ๋ฒ์งธ ๊ฒฝ์ฐ์๋ ๋ก๊ทธ์ธ ์คํจ ๋ฉ์์ง๋ฅผ ๋๋ ค์ค๋ค.
์์ ๋ฐฉ์์ด ์๋ชป๋์๋ค๋ ์ฌ์ค์ ๊นจ๋ซ๊ฒ ๋์ด, ๋ก์ง์ ์๋ง๊ฒ ๋ฐ๊พธ๊ณ ์ ํ์ ๋ฆฌํฉํ ๋ง์ ์ ์ํ๊ฒ ๋์๋ค. ๊ฐ์ด ์์ ๋ก๊ทธ์ธ์ ๋ด๋นํ๋ ํ๋ก ํธ ํ์์ด ํ์ ๋๊ฐ ๋ฐ๋์, ๋ฐ๊พธ๊ณ ์ถ์ง๋ง ๊ณ ๋ฏผํ๋ ์ค์ ๋ค๋ฅธ ํ๋ก ํธ ํ์์ด ์ ๋ป ์ข๋ค๊ณ ํด์ฃผ์ด์ ์งํํ ์ ์์๋ค.
2๋ฒ ์ผ์ด์ค์์ ํ์ ๊ฐ์ ์ด ํ์ํ ๋ ํด๋ผ์๊ฒ ๊ณ ์ค๋ํ ๋๊ฒจ์คฌ๋ accesstoken, refreshtoken ์ด ๋ ๊ฐ์ง ํ ํฐ ์ ๋ณด๋ ๋ ธ์ถ๋์๋ ์๋๋ ์ ๋ณด์๊ณ , ์ด ๋๋ฌธ์ ๋ก์ง ์์ฒด๋ฅผ ๋ณ๊ฒฝํ์๋ค.
๊ฐ์
ํ์ ๋ก๊ทธ์ธ ์ฑ๊ณต -> ํ์ ์ ๋ณด ๋ฐํ
๋ฏธ๊ฐ์
ํ์ ๋ก๊ทธ์ธ ์ฑ๊ณต -> ์นด์นด์ค aT, rT ๋ฐํ
๋ก๊ทธ์ธ ์คํจ -> ์๋ฌ ์ฒ๋ฆฌ
๊ฐ์ ํ์๊ณผ ๋ฏธ๊ฐ์ ํ์์ ๋ถ๋ฆฌํ์ง ์๊ณ , ๋ก๊ทธ์ธ ์ฑ๊ณต ์ ๋ฌด์กฐ๊ฑด ๊ฐ์ ๋ ๊ฒ์ผ๋ก ์ทจ๊ธํ์๋ค. ํด๋น ํ๋ก์ ํธ์์๋ ๊ฐ์ ์ดํ์๋ ํ์ผ๋ก ์ด๋ํ๊ธฐ ์ ์ ์ ๊ฐ ์ง์ ์ ๋ ฅํด์ผํ๋ ์ ๋ณด๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ํตํด ๋ ํ์ ๊ทธ๋ฃน์ ๊ตฌ๋ถํ์๋ค.
๊ฐ์
ํ์ ๋ก๊ทธ์ธ ์ฑ๊ณต -> DB ์กฐํ ์ดํ ํ์ ์ ๋ณด ๋ฐํ -> ํ
๋ฏธ๊ฐ์
ํ์ ๋ก๊ทธ์ธ ์ฑ๊ณต -> DB์ ํ์ ์์ฑ ์ดํ ํ์ ์ ๋ณด ๋ฐํ
-> ํ์ ์
๋ ฅ ๋ด์ฉ ์์ฑ -> ํ
์ด๋ฅผ ํตํด ๋ ํ ํฐ์ด ๋ ธ์ถ๋๋ ์ผ์ ๋ง์ ์ ์์๋ค. ๋ ํ์ ๊ฐ์ ์์ฒด์ ๋ก์ง์ ํ๋๋ก ํต์ผ ๋๋ฉด์ ์ค๋ณต ์ฝ๋๋ ์ฌ๋ผ์ก๋ค.
๋ชจ๋ ๋ก๊ทธ์ธ์ด ํ์ํ ํ์ด์ง์์ ๋งค๋ฒ JWT ์ด์ธ์ค ํ ํฐ์ ํค๋๋ก ๋๊ธด๋ค. ์ ์ ๋ฅผ ์๋ณํ๋๋ฐ ์ฌ์ฉํ์ง๋ง ์ธ์ ๊น์ง๋ ์ธ ์ ์๋ค.
๋ง๋ฃ๋๋ฉด ํด๋ผ์ด์ธํธ ์ธก์์ ๊ฐ๊ณ ์๋ JWT ๋ฆฌํ๋ ์ ํ ํฐ์ ํจ๊ป ์๋ฒ์ ๋๊ฒจ์ฃผ๊ณ , ์๋ฒ์์ ์ ํจํ ๋ฆฌํ๋ ์ ํ ํฐ์ธ์ง ํ์ธํ ๋ค ๋ค์ JWT ํ ํฐ์ ๋ฐ๊ธํด์ ๋ฐํํ๋ค.
์ฌ๊ธฐ์ ํ์ํ๊ฑด JWT ํ ํฐ์ด ๋ง๋ฃ๋์์ ๋ ์๋ ค์ฃผ๋ ๋ฆฌ์คํฐ์ค์, ์ด ๋ ํ๋ก ํธ์์ ๋ฆฌํ๋ ์ ํ ํฐ๊ณผ ํจ๊ป JWT ํ ํฐ ์ฌ๋ฐ๊ธ์ ์์ฒญํ๋๋ก ํ๋ API์ด๋ค.
๊ทธ๋ฌ๋ ์ฑ์ผ ๋์์๋ ์ด์ธ์ค ํ ํฐ ๊ธฐ๊ฐ์ ๋๋ ค ๋จ์ํ ์ด๊ฒ๋ง์ ๊ฐ์ง๊ณ ๋ก๊ทธ์ธ์ ๊ตฌํํ์๋ค.
๋ณดํต ์ด์ธ์ค ํ ํฐ์ 1์๊ฐ, ๋ฆฌํ๋ ์ ํ ํฐ์ 2์ฃผ ์ ๋๋ก ์ค์ ํ๋ ๋ฏ ํ๋ค. ์ฑ์ผ ๊ธฐ๊ฐ๋์ ๊ฐ๋ฐ์ ์ํด 7์ผ๋ก ์ค์ ํด ๋์์ง๋ง, ๋ฆด๋ฆฌ์ฆ ์์ ์๋ ์ ๋ ๊ฒ ๋ฐ๊พธ์ด์ผ ๊ฒ ๋ค.
์์ ๊ฐ์ด Access Token ๊ธฐ๊ฐ์ ๋ฌด์์ ๋๋ ค ์ฌ์ฉํ๋ ๊ฒ์ ๋ณด์์ ์ธ ์ธก๋ฉด์์ ์ข์ง ์๋ค. ๋, Refresh Token์ ์ฌ์ฉํ์ง ์์ ์๋ ๋ก๊ทธ์ธ ๊ธฐ๊ฐ์ ์ฐ์ฅํ ์ ์์๋ค.
๋ฐ๋ผ์, Access Token์ด ๋ง๋ฃ๋๋ฉด ํ๋ก ํธ์์ Refresh Token๊ณผ ํจ๊ป ์์ฒญํ๋ ๋ฆฌํ๋ ์ API๋ฅผ ์์ฑํ์๋ค. ๋ฐ์ Refresh Token์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๊ณ ์ ํจํ ๊ฒฝ์ฐ ๋ค์๊ธ ํด๋น ์ ์ ์ ID๋ก ๋ ๊ฐ์ง ํ ํฐ์ ๋ฐ๊ธํ์ฌ ๋๋ ค์ฃผ์๋ค.