- ์ ์ ๋ ํ์๊ฐ์
์ ํตํด ํ์๊ฐ์
์ ํ ์ ์๋ค.
- ์ ์ ๋ Google ๊ฐํธ ๋ก๊ทธ์ธ์ ํ ์ ์๋ค. (OAuth2.0)
- Google๋ก๋ถํฐ ๋ฐ์์ฌ ๊ฐ์ธ์ ๋ณด๋ ์ด๋ฆ, email์ด๋ค.
- ํ๋ก ํธ์๋์์ ๊ฐ์ธ์ ๋ณด๋ฅผ ์กฐํํ ์ ์๋ค.
- GET localhost:8080/api/v1/user/me
- ๋ธ๋ผ์ฐ์ ํค๋์ JWT๊ฐ ํ์ํ๋ค.
- JWT๊ฐ ์์ผ๋ฉด
401 Unauthorized403 Forbidden๋ฅผ ๋ฐํํ๋ค. - JWT๊ฐ ์ ํจํ์ง ์์ผ๋ฉด
401 Unauthorized403 Forbidden๋ฅผ ๋ฐํํ๋ค.
- MySQL RDB์ ์ ์ ๊ฐ์ธ ์ ๋ณด๊ฐ ์ ์ฅ๋์ด ์๋ค.
- RDB์์ ์ ์ ๊ฐ์ธ ์ ๋ณด๋ฅผ ์กฐํํ ์ ์๋ค.
- ์ ์ id๋ก_๊ฐ์ธ_์ ๋ณด๋ฅผ_์กฐํํ _์_์์ผ๋ฉด_์์ธ๊ฐ_๋ฐ์ํ๋ค
- ์ ์ ๋ฅผ_์์ฑํ _์_์๋ค
- GET localhost:8080/api/v1/user/me
- ํ๋ก ํธ์๋์ ๊ตฌ๊ธ ์ธ๊ฐ ์๋ฒ์ ๋ณด๋ผ ๋ฐ์ดํฐ๋ฅผ HTTP API๋ก ์ ๊ณตํ๋ค.
- GET/POST localhost:8080/api/v1/auth/google/login
- ์ด๋ฏธ ๋ก๊ทธ์ธ๋ ์ฌ์ฉ์๊ฐ ์์ฒญํ๋ฉด 400 Bad Request๋ฅผ ๋ฐํํ๋ค.
- ์ด๋ฏธ ๋ก๊ทธ์ธ๋์๋ค๋ ๊ธฐ์ค์ JWT๊ฐ ์ ํจํ์ง ์ฌ๋ถ์ด๋ค. (์ด ๋ถ๋ถ ํ ์คํธ ์ด๋ป๊ฒ ํ ์ง ๊ณ ๋ฏผ ์ค)
- ๋ณด๋ด์ค ๋ฐ์ดํฐ ์์
- client_id: ์ ํ๋ฆฌ์ผ์ด์ ์ ํด๋ผ์ด์ธํธ ID.
- redirect_uri: ์ธ์ฆ ํ ์ฌ์ฉ์๊ฐ ๋์์ฌ URI.
- response_type: ๋ฐํ๋๋ ์ธ์ฆ ์ฝ๋(code).
- scope: ์์ฒญํ๋ ๊ถํ(์: openid, email, profile).
- state(์ ํ): CSRF ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํ ์์์ ๋ฌธ์์ด.
- ์ ์ ๋ Google ๊ฐํธ ๋ก๊ทธ์ธ์ ํ ์ ์๋ค. (OAuth2.0)
- ์์
GET HTTP/1.1 302 Found
Location: https://accounts.google.com/o/oauth2/v2/auth?
client_id=YOUR_CLIENT_ID&
redirect_uri=http://localhost:8080/api/v1/auth/google/redirect
response_type=code&
scope=openid%20email%20profile&
state=xyz
ใ ค
- ์ฌ์ฉ์๊ฐ ๊ตฌ๊ธ ์ธ๊ฐ ํ์ด์ง์์ ๋ก๊ทธ์ธ์ ์ฑ๊ณต์์ผฐ์ผ๋ฉด, ๊ตฌ๊ธ์ด ํ๋ก ํธ ์๋ฒ๋ฅผ ํตํด http://localhost:8080/api/v1/auth/google/redirect ๋ก ๋ณด๋ด๋ ๋ฆฌ๋ค์ด๋ ํธ๋ฅผ ๋ฐ๋๋ค.
- ์ด ์์ฒญ์๋ ๊ตฌ๊ธ ์ธ๊ฐ ์๋ฒ์์ ๋ฐ๊ธํ ์ ์ ์ Access Token๊ณผ Refresh Token์ด ๋ด๊ฒจ์๋ค.
- ๊ตฌ๊ธ ๋ฐ์ดํฐ ์๋ฒ์ Access Token์ ํตํด ์ ์ ์ ์ ๋ณด๋ฅผ ์์ฒญํ๊ณ ๋ฐ์์จ๋ค.
POST https://oauth2.googleapis.com/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=AUTH_CODE&redirect_uri=YOUR_REDIRECT_URI&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET
-
JWT๋ฅผ ๋ฐํํ๋ค.
-
JWT๋ฅผ response body์ ๋ด์ jsonํํ๋ก ๋ฐํํ๋ค.
-
API๋ Swagger์์ ํ์ธ ๊ฐ๋ฅํ๋ค.
-
์ ์ ๋ ์๋ ๋ก๊ทธ์ธ์ ํ ์ ์๋ค.
- refresh token์ ๋ฐ๊ธํ ์ ์๋ค.
- refresh token์ ํตํด access token์ ์ฌ๋ฐ๊ธ ๋ฐ๋๋ค.
- ํ๋ก ํธ์์ access token ๋ณด๋ผ ๋ 403 => refresh token ์๋ณด๋(์ฌ์ฉ์๊ฐ ์ง์ ๋ก๊ทธ์์/๋ธ๋๋ฆฌ์คํธ ๋ฑ)
- ํ๋ก ํธ์์ access token ๋ณด๋ผ ๋ 401 => refresh token์ด ์์ผ๋ฉด ๋ณด๋ด์ฃผ์ธ์ฅ(๋ชจ์ข ์ ์ด์ ๋ก ํ ํฐ์ด ์ฌ๋ฐ๋ฅด์ง ์์. ์ฌ์ธ์ฆ ํ์) //TODO: Expired๋ฉด refresh ๋ณด๋ด๋ผ๋ ์๋ฌ์ฝ๋ ๋ง๋ค๊ธฐ
-
์ ์ ๋ ๋ก๊ทธ์์์ ํ ์ ์๋ค.
-
์ ์ ๋ ํ์ํํด๋ฅผ ํ ์ ์๋ค.
-
(์ ์ ๋ ํ์์ ๋ณด๋ฅผ ์์ ํ ์ ์๋ค.)
-
๋ธ๋๋ฆฌ์คํธ๋ฅผ ์ง์ ๋ฑ๋กํ์ฌ ์ฐจ๋จํ ์ ์๋ค.
-
์ ๊ท ์ ์ ์๊ฒ 5์ฅ์ ๋ฌด๋ฃ AI ํ ํ๋ฆฟ ์์ฑ๊ถ์ ์ง๊ธํ๋ค