๐ OAuth 2.0 ๊ฐ๋ - ๊ทธ๋ฆผ์ผ๋ก ์ดํดํ๊ธฐ ์ฝ๊ฒ ์ค๋ช
OAuth๋?
์น ์ํ์ ํ๋ค ๋ณด๋ฉด Google๊ณผ Facebook ๋ฑ์ ์ธ๋ถ ์์ ๊ณ์ ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐํธํ ํ์๊ฐ์ ๋ฐ ๋ก๊ทธ์ธํ ์ ์๋ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ์ฐพ์๋ณผ ์ ์๋ค.
ํด๋ฆญ ํ ๋ฒ์ผ๋ก ๊ฐํธํ๊ฒ ๋ก๊ทธ์ธํ ์ ์์ ๋ฟ๋ง ์๋๋ผ,
์ฐ๋๋๋ ์ธ๋ถ ์น ์ดํ๋ฆฌ์ผ์ด์ ์์ Facebook ๋ฐ Twitter ๋ฑ์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
์๋ฅผ ๋ค์ด, Google๋ก ๋ก๊ทธ์ธํ๋ฉด API๋ฅผ ํตํด ์ฐ๋๋ ๊ณ์ ์ Google Calendar ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค ์ ์๋ค.
์ด ๋ ์ฌ์ฉ๋๋ ํ๋กํ ์ฝ์ด ๋ฐ๋ก OAuth๋ค.
OAuth์ ๋ํ ์ ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
OAuth๋ ์ธํฐ๋ท ์ฌ์ฉ์๋ค์ด ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๊ณตํ์ง ์๊ณ ๋ค๋ฅธ ์น์ฌ์ดํธ ์์ ์์ ๋ค์ ์ ๋ณด์ ๋ํด ์น์ฌ์ดํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ทผ ๊ถํ์ ๋ถ์ฌํ ์ ์๋ ๊ณตํต์ ์ธ ์๋จ์ผ๋ก์ ์ฌ์ฉ๋๋, ์ ๊ทผ ์์์ ์ํ ๊ฐ๋ฐฉํ ํ์ค์ด๋ค.
OAuth 2.0์ 1.0์์ ์๋ ค์ง ๋ณด์ ๋ฌธ์ ๋ฑ์ ๊ฐ์ ํ ๋ฒ์ ผ์ด๋ค.
OAuth ๊ตฌ์ฑ ์์
๊ตฌ๋ถ | ์ค๋ช |
Resource Owner | ์น ์๋น์ค๋ฅผ ์ด์ฉํ๋ ค๋ ์ ์ , ์์(๊ฐ์ธ์ ๋ณด)์ ์์ ํ๋ ์, ์ฌ์ฉ์ 'Resource' ๋ ๊ฐ์ธ์ ๋ณด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. |
Client | ์์ฌ ๋๋ ๊ฐ์ธ์ด ๋ง๋ ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ ํด๋ผ์ด์ธํธ ๋ผ๋ ์ด๋ฆ์ client๊ฐ Resource server์๊ฒ ํ์ํ ์์์ ์์ฒญํ๊ณ ์๋ตํ๋ ๊ด๊ณ์ฌ์ ๊ทธ๋ ๋ค. |
Authorization Server | ๊ถํ์ ๋ถ์ฌ(์ธ์ฆ์ ์ฌ์ฉํ ์์ดํ
์ ์ ๊ณต์ฃผ๋)ํด์ฃผ๋ ์๋ฒ๋ค. ์ฌ์ฉ์๋ ์ด ์๋ฒ๋ก ID, PW๋ฅผ ๋๊ฒจ Authorization Code๋ฅผ ๋ฐ๊ธ ๋ฐ์ ์ ์๋ค. Client๋ ์ด ์๋ฒ๋ก Authorization Code์ ๋๊ฒจ Token์ ๋ฐ๊ธ ๋ฐ์ ์ ์๋ค. |
Resource Server | ์ฌ์ฉ์์ ๊ฐ์ธ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ ํ๋ฆฌ์ผ์ด์
(Google, Facebook, Kakao ๋ฑ) ํ์ฌ ์๋ฒ Client๋ Token์ ์ด ์๋ฒ๋ก ๋๊ฒจ ๊ฐ์ธ์ ๋ณด๋ฅผ ์๋ต ๋ฐ์ ์ ์๋ค. |
Access Token | ์์์ ๋ํ ์ ๊ทผ ๊ถํ์ Resource Owner๊ฐ ์ธ๊ฐํ์์์ ๋ํ๋ด๋ ์๊ฒฉ์ฆ๋ช |
Refresh Token | Client๋ Authorization Server๋ก ๋ถํฐ access token(๋น๊ต์ ์งง์ ๋ง๋ฃ๊ธฐ๊ฐ์ ๊ฐ์ง) ๊ณผ refresh token(๋น๊ต์ ๊ธด ๋ง๋ฃ๊ธฐ๊ฐ์ ๊ฐ์ง)์ ํจ๊ป ๋ถ์ฌ ๋ฐ๋๋ค. access token์ ๋ณด์์ ๋ง๋ฃ๊ธฐ๊ฐ์ด ์งง๊ธฐ ๋๋ฌธ์ ์ผ๋ง ์ง๋์ง ์์ ๋ง๋ฃ๋๋ฉด ์ฌ์ฉ์๋ ๋ก๊ทธ์ธ์ ๋ค์ ์๋ํด์ผํ๋ค. ๊ทธ๋ฌ๋ refresh token์ด ์๋ค๋ฉด access token์ด ๋ง๋ฃ๋ ๋ refresh token์ ํตํด access token์ ์ฌ๋ฐ๊ธ ๋ฐ์ ์ฌ ๋ก๊ทธ์ธ ํ ํ์์๊ฒ๋ ํ๋ค. |
์ง์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ํ๋๊ฒ์ด ์๋, ์์ ๋ฏธ๋์ด๋ก ๋ก๊ทธ์ธ์ ํ ๊ฒฝ์ฐ,
client(๊ฐ์ธ ์๋น์ค)๋ Resource Owner(์ฌ์ฉ์)๋ฅผ ๋์ ํด ๋ก๊ทธ์ธ ํ๋๋ฐ, ์ด๋ ํ์ํ ์ ๋ณด๋ฅผ Resource Server(kakao, naver, ...)์์ ์ป์ด ์๋ก ๋น๊ตํด ์ ํจ์ฑ์ ํ๋จํ๋ค.
client๊ฐ ์ ์ ์ (๋ก๊ทธ์ธ)์ ๋ณด/์์(resource)์ Resource Server์ ์์ฒญํด ๋์ ๋ก๊ทธ์ธ ํ๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ์ํด์ client๋ ๋ค์ ๋จ๊ณ๋ค์ ๊ฐ์ง๋ค.
- Resource Owner๋ก ๋ถํฐ ๋์(ํ์ฉ)
- Resource Server๋ก ๋ถํฐ client ์ ์ํ์ธ
์ ๊ทธ๋์ผ ํ ๊น?
๊ฐ๊ฐ์ ์
์ฅ์์ ์๊ฐํด๋ณด์.
Resource Owner(์ ์ ) ์ ์ฅ
์์ ์ ์ ๋ณด๋ฅผ ๋์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ client๊ฐ ์ด๋ค ์ ๋ณด๋ฅผ ํ์ฉํ๋์ง, ์ด๋ค ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋์ง ๋ชจ๋ฅธ๋ค.
๋์ ๋ง์์ ๊ฐ์ง๋ฉด ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ง๊ตฌ์ก์ด๋ก ์
์ฉํ ์ ์์ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก client๋ Resource Owner์ ๋์๋ฅผ ๊ตฌํด์ผ ํ๋ค.
Resource Server(kakao) ์ ์ฅ
๋ค๋ฅธ ์ฌ๋์ ์ผ์ ๋์ ํด์ฃผ๋ ์ฌ๋์ด ์ ๋ง ๊ทธ ์ฌ๋์ผ์ง ๊ถ๊ธํ ์ ์๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก Resource Owner์ ์ผ์ ์ํ ํด์ฃผ๋ client๊ฐ ์ ๋ง ๊ทธ client์ผ๊น ํ๋ ๋ฌผ์์ด ์๋ค.
์ด๋ฐ ์๋ฏธ์์ Resource Server๋ Resource Owner์ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด client๋ฅผ ๊ตฌ๋ถํ๋ ๊ฐ(code)๋ฅผ ์ ๋ฌํ๋ค.
OAuth ์๋น์ค ๋ฑ๋กํด๋ณด๊ธฐ (๋ค์ด๋ฒ ๋ก๊ทธ์ธ)
callbackURL ๋ฐ ๋ค์ด๋ฒ๋ก ์์ฒญํ ์ ๋ณด(scope) ์ค์ ํ๊ธฐ
๋ฑ๋ก์ ์๋ฃํ๋ฉด ํด๋น ํด๋ผ์ด์ธํธ ์์ด๋์ ๋น๋ฒ ์ ๋ณด๊ฐ ๋์จ๋ค.
Client ID, Client Secret , Authorized redirect URIs๋ ์๋น์ค๋ฅผ ๋ฑ๋กํ๋ฉด ๋ฐ๊ฒ ๋๋ ํ์ ์์๋ก ํน์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
Client ID
- ์ดํ๋ฆฌ์ผ์ด์ (์๋น์ค)์ ์๋ณํ๋ ์๋ณ์ID๋ฅผ ์๋ฏธํ๋ค.
- ๋ค์ํ ์๋น์ค๊ฐ ์กด์ฌํ๋๋ฐ, Resource Server ์ ์ฅ์์ ์ด๋ค ์๋น์ค์๊ฒ ์ ๊ณตํ ๊ฒ ์ธ์ง ๊ตฌ๋ถํ๋ ID๋ฅผ ์๋ฏธํ๋ค.
Client Secret
- Client ID์ ๋ํ ๋น๋ฐ๋ฒํธ๋ก ์ธ๋ถ์ ๋ ธ์ถ๋๋ฉด ์๋๋ค.
- ID์ PASSWORD๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
- Resource Server๋ง ๊ฐ๋ ์ ๋ณด๋ก, client์ ๊ถํ์ ๋ถ์ฌํ๋ ๊ณผ์ ์์ ๋์ค์ Authorized code๋ฅผ ์ ๋ฌํ๋ ํต๋ก๋ค.
- ๋์ค์ client <-> Resource Server ์ ํจ์ฑ ๊ฒ์ฌ์์ ์ด redirect URIs๋ ์ฒดํฌ๋๋ฉฐ ํด๋น์ฃผ์๊ฐ ์๋ ๊ฒฝ์ฐ Resource Server๋ ํด๋น client๊ฐ ์๋๋ผ๊ณ ํ๋จํ๋ค.
- ์ฆ, ์๋ฅผ๋ค์ด ๋ค์ด๋ฒ ์๋ฒ๊ฐ ์ฌ์ฉ์์ ๊ฐ์ธ์ ๋ณด๋ฅผ ์ฝ๋ฐฑํ ์ฃผ์๋ฅผ ์ ๋ ๊ณณ์ด๋ค.
scope
- Resource Server์์ ์ฌ์ ์ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ๋ฏธ๋ฆฌ ์ ์ํ ๊ธฐ๋ฅ
- ๊ธ ์์ฑํ๊ธฐ, ID์๊ธฐ, Email ์๊ธฐ, ์บ๋ฆฐ๋ ์ผ์ ์ ๋ ฅํ๊ธฐ ๋ฑ๋ฑ
- ํ์ด์ค๋ถ์ด๋ ๊ตฌ๊ธ์ด๋ ๋ก๊ทธ์ธ ๋์๋ค๋ฉด, ๊ทธ ์๋น์ค ์์์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ๊ธฐ๋ฅ
Resource owner ์น์ธ๊ณผ์
๊ฐ์์์ ์ดํด๋ฅผ ์ข๋ ์ฝ๊ฒ ๋๊ธฐ ์ํด Resource Server์ Authorization Server์ ํฉ์ณ์ ์ค๋ช ํ๊ฒ ๋ค.
1. ์ฌ์ฉ์(Resource Owner)๋ ์๋น์ค(client)๋ฅผ ์ด์ฉํ๊ธฐ ์ํด ๋ก๊ทธ์ธ ํ์ด์ง์ ์ ๊ทผํ๋ค.
2. ๊ทธ๋ผ ์๋น์ค(client)๋ ์ฌ์ฉ์(Resource Owner)์๊ฒ ๋ก๊ทธ์ธ ํ์ด์ง๋ฅผ ์ ๊ณตํ๊ฒ ๋๋ค. ๋ก๊ทธ์ธ ํ์ด์ง์์ ์ฌ์ฉ์๋ "ํ์ด์ค๋ถ/๊ตฌ๊ธ ์ผ๋ก ๋ก๊ทธ์ธ" ๋ฒํผ์ ๋๋ฅธ๋ค.
3. ๋ง์ผ ์ฌ์ฉ์๊ฐ Login with Facebook ๋ฒํผ์ ํด๋ฆญํ๊ฒ ๋๋ฉด, ํน์ ํ url ์ด ํ์ด์ค๋ถ ์๋ฒ์ชฝ์ผ๋ก ๋ณด๋ด์ง๊ฒ ๋๋ค.
๋ธ๋ผ์ฐ์ ์๋ต(response) ํค๋๋ฅผ ํ์ธํ๋ฉด ๋ค์ url๋ด์ฉ์ ํ์ธ ํ ์ ์๋ค.
https://resource.server/?client_id=1&scope=B,C&redirect_uri=https://client/callback
์ด๋, ์ฌ์ฉ์๊ฐ ์ง์ ํ์ด์ค๋ถ์ผ๋ก ์ด๋ํด์ ๋ก๊ทธ์ธ์ ์ ๋ ฅํด์ผ ํ๋๋ฐ,
์ ๋งํฌ๊ฐ ๋์ ๋ก๊ทธ์ธ์ผ๋ก ์ด๋ ํ๊ฒ๋ ๋์์ค๋ค.
๊ตฌ์ฒด์ ์ผ๋ก ์์ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด ์๋์ง ์์๋ณด์
์ฝ๋๋ฅผ ๋๋์ด ์ค๋ช ํด๋ณด์๋ฉด,
https://resource.server/? # ๋ฆฌ์์ค ์๋ฒ(๋ค์ด๋ฒ, ์นด์นด์ค ์ฌ์ดํธ url)
client_id=1 # ์ด๋ค client์ธ์ง๋ฅผ id๋ฅผ ํตํด Resouce Owner์๊ฒ ์๋ ค์ฃผ๋ ๋ถ๋ถ
&scope=B,C # Resource Owner๊ฐ ์ฌ์ฉํ๋ ค๋ ๊ธฐ๋ฅ, ๋ฌ๋ฆฌ ๋งํด client๊ฐ ์์ ์๋น์ค์์ ์ฌ์ฉํ๋ ค๋ Resource Server ๊ธฐ๋ฅ์ ํํํ ๋ถ๋ถ
&redirect_uri=https://client/callback # ๊ฐ๋ฐ์ ํํ์ด์ง์ ์๋น์ค ๊ฐ๋ฐ์๊ฐ ์
๋ ฅํ ์๋ต ์ฝ๋ฐฑ.
ํฅํ redirect_uri ๊ฒฝ๋ก๋ฅผ ํตํด์ Resource Server๋ client์๊ฒ ์์๋น๋ฐ๋ฒํธ์ธ Authorization code๋ฅผ ์ ๊ณตํ๋ค.
4. ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ณด๋ธ ์๋น์ค ์ ๋ณด์, ๋ฆฌ์์ค ๋ก๊ทธ์ธ ์๋ฒ์ ๋ฑ๋ก๋ ์๋น์ค ์ ๋ณด๋ฅผ ๋น๊ตํ๋ค.
4.1 ํ์ธ์ด ์๋ฃ๋๋ฉด, Resource Server๋ก ๋ถํฐ ์ ์ฉ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ํ์ฌ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค๋ค.
5. ID/PW๋ฅผ ์ ์ด์ ๋ก๊ทธ์ธ์ ํ๊ฒ๋๋ฉด, client๊ฐ ์ฌ์ฉํ๋ ค๋ ๊ธฐ๋ฅ(scope)์ ๋ํด Resource Owner์ ๋์(์น์ธ)์ ์์ฒญํ๋ค.
์ ์ด๋ฏธ์ง์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ๋ค.
"c9users.io๋ผ๋ client(์๋น์ค,application)๋ Resoure Owner๋ฅผ ๋์ ํด ํด๋น ๊ธฐ๋ฅ(scope)๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํฉ๋๋ค.
๋์ํ์๊ฒ ์ต๋๊น?"
๋์(Allow)๋ฅผ ๋๋ฅด๋ ๊ฒ์ Resoure Owner๋ Client๊ฐ ํด๋น ๊ธฐ๋ฅ ์ฌ์ฉ์ ์์(delegation)ํ๋ค๋ฅผ ์๋ฏธํ๋ค.
5.1 Resource Owner๊ฐ Allow ๋ฒํผ์ ๋๋ฅด๋ฉด Resource Owner๊ฐ ๊ถํ์ ์์ํ๋ค๋ ์น์ธ์ด Resource Server ์ ์ ๋ฌ๋๋ค.
์ด๋ก์จ Resource Sever๊ฐ ๊ฐ๋ ์ ๋ณด๋ ๋ค์๊ณผ ๊ฐ๋ค.
- Client Id : Resource Owner์ ์ฐ๊ฒฐ๋ client๊ฐ ๋๊ตฐ์ง
- Client Secret: Resource Owner์ ์ฐ๊ฒฐ๋ client์ ๋น๋ฐ๋ฒํธ
- Redirect URL : (์ง์ง)client์ ํต์ ํ ํต๋ก
- user id : client์ ์ฐ๊ฒฐ๋ Resource Owner์ id
- scope : client๊ฐ Resource Owner ๋์ ์ ์ฌ์ฉํ ๊ธฐ๋ฅ๋ค
6. ํ์ง๋ง, ์ด๋ฏธ Owner๊ฐ Client์๊ฒ ๊ถํ ์น์ธ์ ํ๋๋ผ๋ ์์ง Server๊ฐ ํ๋ฝํ์ง ์์๋ค. ๋ฐ๋ผ์, Resource Server ๋ Client์๊ฒ ๊ถํ ์น์ธ์ ํ๊ธฐ์ํด Authorization code๋ฅผ Redirect URL์ ํตํด ์ฌ์ฉ์์๊ฒ ์๋ตํ๊ณ
7. ๋ค์ ์ฌ์ฉ์๋ ๊ทธ๋๋ก Client์๊ฒ ๋ค์ ๋ณด๋ธ๋ค.
8. ์ด์ Client๊ฐ Resource Server์๊ฒ ์ง์ url(ํด๋ผ์ด์ธ๋ ์์ด๋, ๋น๋ฒ, ์ธ์ฆ์ฝ๋ ...๋ฑ)์ ๋ณด๋ธ๋ค.
9. ๊ทธ๋ผ Resource Server๋ Client๊ฐ ์ ๋ฌํ ์ ๋ณด๋ค์ ๋น๊ตํด์ ์ผ์นํ๋ค๋ฉด, Access Token์ ๋ฐ๊ธํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ํ์์์ด์ง Authorization code๋ ์ง์ด๋ค.
10. ๊ทธ๋ ๊ฒ ํ ํฐ์ ๋ฐ์ Client๋ ์ฌ์ฉ์์๊ฒ ์ต์ข ์ ์ผ๋ก ๋ก๊ทธ์ธ์ด ์๋ฃ๋์๋ค๊ณ ์๋ตํ๋ค.
OAuth์ ๋ชฉ์ ์ ์ต์ข ์ ์ผ๋ก Access Token์ ๋ฐ๊ธํ๋ ๊ฒ์ด๋ค.
11 ~ 14. ์ด์ client๋ Resource server์ api๋ฅผ ์์ฒญํด Resource Owner์ ID ํน์ ํ๋กํ ์ ๋ณด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
15. Access Token์ด ๊ธฐ๊ฐ์ด ๋ง๋ฃ๋์ด 401์๋ฌ๊ฐ ๋๋ฉด, Refresh Token์ ํตํด Access Token์ ์ฌ๋ฐ๊ธ ํ๋ค.
Refresh Token
Refresh Token์ ๋ฐ๊ธ ์ฌ๋ถ์ ๋ฐฉ๋ฒ ๋ฐ ๊ฐฑ์ ์ฃผ๊ธฐ ๋ฑ์ OAuth๋ฅผ ์ ๊ณตํ๋ Resource Server๋ง๋ค ์์ดํ๋ค.
Access Token์ ๋ง๋ฃ ๊ธฐ๊ฐ์ด ์์ผ๋ฉฐ, ๋ง๋ฃ๋ Access Token์ผ๋ก API๋ฅผ ์์ฒญํ๋ฉด 401 ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
Access Token์ด ๋ง๋ฃ๋์ด ์ฌ๋ฐ๊ธ๋ฐ์ ๋๋ง๋ค ์๋น์ค ์ด์ฉ์๊ฐ ์ฌ ๋ก๊ทธ์ธํ๋ ๊ฒ์ ๋ค์ ๋ฒ๊ฑฐ๋ก์ธ ๊ฒ์ด๋ค.
๋ณดํต Resource Server๋ Access Token์ ๋ฐ๊ธํ ๋ Refresh Token์ ํจ๊ป ๋ฐ๊ธํ๋ค.
Client๋ ๋ Token์ ๋ชจ๋ ์ ์ฅํด๋๊ณ , Resource Server์ API๋ฅผ ํธ์ถํ ๋๋ Access Token์ ์ฌ์ฉํ๋ค.
Access Token์ด ๋ง๋ฃ๋์ด 401 ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด, Client๋ ๋ณด๊ด ์ค์ด๋ Refresh Token์ ๋ณด๋ด ์๋ก์ด Access Token์ ๋ฐ๊ธ๋ฐ๊ฒ ๋์ด ๋ก๊ทธ์ธ ์ธ์ฆ์ ์ ์ง ํ ์ ์๊ฒ ๋๋ค.
์นด์นด์ค OAuth ์ธ์ฆ ์ค์ตํด๋ณด๊ธฐ (Node.js)