Demonstration.video.mp4
sequenceDiagram
participant A as Fronted App (Web, Mobile, Desktop)
participant B as Backend App
participant C as External Auth Services (Kakao, Naver, Google, etc)
A->>B: 1. Request social login
B->>A: 2. Redirect to social login page
A->>C: 3. Login with social account
C->>B: 4. Send Authorize Code to Redirect URI
B->>C: 5. Request exchange Authorize Code for Token
C->>B: 6. Send Access Token and Refresh Token
B->>C: 7. Request user information with Access Token
C->>B: 8. Send user information containing unique Social ID
B->>B: 9. Issue JWT-based Access Token and Refresh Token
B->>A: 10. Redirect to app with Access Token and Refresh Token <br> (Both set in cookie)
A->>B: 11. Make any requests with JWT cookie
โป RTR(Refresh Token Rotation) ์ ๋ต ์ฌ์ฉ
๐จ Kakao OAuth
-
https://developers.kakao.com/console/app > ์ ํ๋ฆฌ์ผ์ด์ ์ถ๊ฐํ๊ธฐ
-
์ ํ๋ฆฌ์ผ์ด์ ์ ํ
-
๋ด ์ ํ๋ฆฌ์ผ์ด์ > ์ฑ ์ค์ > ์์ฝ ์ ๋ณด
- ์ฑ ํค > REST API ํค (์ธ๊ฐ ์ฝ๋ ์์ฒญ ์ ํ์)
-
ํ๋ซํผ > ํ๋ซํผ ์ค์ ํ๊ธฐ > Web > ์ฌ์ดํธ ๋๋ฉ์ธ: https://localhost:3000
-
Redirect URI ๋ฑ๋กํ๋ฌ ๊ฐ๊ธฐ
- ํ์ฑํ ์ค์ : ON
- Redirect URI ๋ฑ๋ก > Redirect URI: http://localhost:3001/api/auth/kakao/callback
-
๋ด ์ ํ๋ฆฌ์ผ์ด์ > ์ ํ ์ค์ > ์นด์นด์ค ๋ก๊ทธ์ธ > ๋ณด์ > Client Secret > ์ฝ๋ ์์ฑ (์ ํ)
- ํ์ฑํ ์ํ: ์ฌ์ฉํจ
-
๋ด ์ ํ๋ฆฌ์ผ์ด์ > ์ ํ ์ค์ > ์นด์นด์ค ๋ก๊ทธ์ธ > ๋์ํญ๋ชฉ
- ๋๋ค์
- ํ๋กํ ์ฌ์ง
- ์นด์นด์ค๊ณ์ (์ด๋ฉ์ผ) ์ค์ ๐ ๋น์ฆ์ฑ์ผ๋ก ์ ํํด์ผ ๋์ํญ๋ชฉ ์ค์ ์ด ๊ฐ๋ฅํ๋ค.
์ถํ ์ธ๊ฐ ์ฝ๋๋ฅผ ๋ฐ์ ๋ scope์ ๊ด๋ จ ์๋ค.
Kakao Developers์์ ์ ๊ณตํ๋ ์นด์นด์ค ๋ก๊ทธ์ธ ๊ณผ์ ์ ๋ํ๋ธ ์ํ์ค ๋ค์ด์ด๊ทธ๋จ
- Server์์ Kakao Auth Server๋ก ์ธ๊ฐ ์ฝ๋ ๋ฐ๊ธฐ ์์ฒญ์ ๋ณด๋ด๋ฉด Client์ ์นด์นด์ค๊ณ์ ๋ก๊ทธ์ธ ํ๋ฉด์ด ๋จ์ง ์๋๋ค. Server์์ ์์ฒญ์ ๋ณด๋๊ธฐ ๋๋ฌธ์ ์ด์ฉ๋ฉด ๋น์ฐํ๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ฒ์์ ์ธ๊ฐ ์ฝ๋ ๋ฐ๊ธฐ URL๋ก redirect๋ฅผ ์์ผ๋ณด๋ ค๊ณ ํ์ผ๋ ํ๋ก ํธ์๋์ ๋ฐฑ์๋์ port๊ฐ ๋ฌ๋ผ CORS ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ๊ฒฐ๊ตญ ํด๊ฒฐํ์ง ๋ชปํ๋ค. ๊ทธ๋์ ์ฒ์์๋ Client์์ ์ง์ Kakao Auth Server๋ก ์ฝ๋ ๋ฐ๊ธฐ ์์ฒญ์ ๋ณด๋ด๋๋ก ํ๋ค. ์ถ๊ฐ๋ก ์ฐพ์๋ณด๋ CORS ์ค๋ฅ๋ Ajax ๋ฐฉ์์ผ๋ก ์์ฒญํ ๊ฒฝ์ฐ ๋ฐ์ํ๊ณ a ํ๊ทธ๋ก ์ด๋ํด์ผ ํ๋ค๊ณ ํ๋ค. a ํ๊ทธ๋ก ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ฒ์์ ๋ค์ redirect๋ฅผ ํ๋ ์ ์์ ์ผ๋ก ๋์ํ๋ค.
- REDIRECT_URI๋ฅผ server api๋ก ์ค์ ํ์ ๋ client๋ ํด๋น URI๋ก ์ด๋ํ๋ ์ด์๊ฐ ์์๋๋ฐ server์์ redirectํ๋๋ก ํด์ ํด๊ฒฐํ๋ค.
๐ฉ Naver OAuth
- https://developers.naver.com/apps/#/wizard/register > ์ฝ๊ด๋์ > ๊ณ์ ์ ๋ณด ๋ฑ๋ก > ์ ํ๋ฆฌ์ผ์ด์
๋ฑ๋ก
- ์ฌ์ฉ API: ๋ค์ด๋ฒ ๋ก๊ทธ์ธ
- ๊ถํ: ํ์์ด๋ฆ, ์ฐ๋ฝ์ฒ ์ด๋ฉ์ผ ์ฃผ์, ๋ณ๋ช , ํ๋กํ ์ฌ์ง โ๏ธ
- ๋ก๊ทธ์ธ ์คํ API ์๋น์ค ํ๊ฒฝ: PC ์น
- ์๋น์ค URL: http://localhost:3000
- ๋ค์ด๋ฒ ๋ก๊ทธ์ธ Callback URL: http://localhost:3001/api/auth/naver/callback
- ์ฌ์ฉ API: ๋ค์ด๋ฒ ๋ก๊ทธ์ธ
- ๋ด ์ ํ๋ฆฌ์ผ์ด์
> ๊ฐ์
- ์ ํ๋ฆฌ์ผ์ด์
์ ๋ณด
- Client ID
- Client Secret
- ๋ค์ด๋ฒ ๋ก๊ทธ์ธ
- ๊ฐ๋ฐ ์ํ (๊ฐ๋ฐ ์ค)
์ ํ๋ฆฌ์ผ์ด์ ์ด โ๊ฐ๋ฐ ์คโ ์ํ์ด๋ฉด [๋ฉค๋ฒ๊ด๋ฆฌ] ํญ์์ ๋ฑ๋กํ ์์ด๋๋ง ๋ค์ด๋ฒ ๋ก๊ทธ์ธ์ ์ด์ฉํ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์ด ์๋ฃ๋์ด ์ค ์๋น์ค์ ์ ์ฉํ๊ณ ์ ํ์ ๋ค๋ฉด ๊ฒ์๋ฅผ ์์ฒญํด ์ฃผ์ธ์. ๊ฒ์๊ฐ ์น์ธ๋๋ฉด ๋ชจ๋ ์์ด๋๋ก ๋ค์ด๋ฒ ๋ก๊ทธ์ธ์ ์ด์ฉํ ์ ์์ต๋๋ค.
- ๊ฐ๋ฐ ์ํ (๊ฐ๋ฐ ์ค)
- ์ ํ๋ฆฌ์ผ์ด์
์ ๋ณด
- ๋ด ์ ํ๋ฆฌ์ผ์ด์
> ๋ฉค๋ฒ๊ด๋ฆฌ (์ ํ๋ฆฌ์ผ์ด์
๊ฐ์ค์๋ ๋ฑ๋กํ ํ์๊ฐ ์๋ค.)
- ๊ด๋ฆฌ์ ID ๋ฑ๋ก
- ํ ์คํฐ ID ๋ฑ๋ก
๐ฆ Google OAuth
- https://console.cloud.google.com > ํ๋ก์ ํธ ์ ํ > ์ ํ๋ก์ ํธ
- ์ผ์ชฝ ํ์ ๋ฉ๋ด > API ๋ฐ ์๋น์ค
- OAuth ๋์ ํ๋ฉด > User Type: ์ธ๋ถ > ๋ง๋ค๊ธฐ
- OAuth ๋์ ํ๋ฉด (๊ทธ๋ฅ ๋์ด๊ฐ๋ ๋๋ ๋ฏ)
- ์ฑ ๋๋ฉ์ธ > ์ ํ๋ฆฌ์ผ์ด์ ํํ์ด์ง: http://localhost:3000
- ๋ฒ์ (์ถํ ์ธ๊ฐ ์ฝ๋ ๋ฐ๊ธ ์ scope์ ์ฌ์ฉ๋จ)
- ๋ฒ์ ์ถ๊ฐ ๋๋ ์ญ์ > email, profile โ๏ธ > ์ ๋ฐ์ดํธ
- ํ
์คํธ ์ฌ์ฉ์
- ๋ณธ์ธ ๋ฉ์ผ ์ถ๊ฐ
- OAuth ๋์ ํ๋ฉด (๊ทธ๋ฅ ๋์ด๊ฐ๋ ๋๋ ๋ฏ)
- ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด > ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๋ง๋ค๊ธฐ > OAuth ํด๋ผ์ด์ธํธ ID
- ์ ํ๋ฆฌ์ผ์ด์ ์ ํ: ์น ์ ํ๋ฆฌ์ผ์ด์
- ์น์ธ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์๋ณธ: http://localhost:3000
- ์น์ธ๋ ๋ฆฌ๋๋ ์ URI: http://localhost:3001/api/auth/google/callback
- ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด > OAuth 2.0 ํด๋ผ์ด์ธํธ ID > ๋ฐฉ๊ธ ๋ง๋ ์น ํด๋ผ์ด์ธํธ ํด๋ฆญ
- ํด๋ผ์ด์ธํธ ID
- ํด๋ผ์ด์ธํธ ๋ณด์ ๋น๋ฐ๋ฒํธ
- OAuth ๋์ ํ๋ฉด > User Type: ์ธ๋ถ > ๋ง๋ค๊ธฐ