๐ ๊ฐ์
์น ๊ฐ๋ฐ์ ํ๋ฉด์ ์ ์ ๊ฐ ์๋ค๋ฉด ์ธ์ฆ์ด๋ผ๋ ๊ฐ๋ ์ ์ ๋ ๋น ์ง์ง ์๋๋ค. ํ์ง๋ง ๋งค๋ฒ ํ ์ด ํ๋ก์ ํธ์ ๊ฐ์ด ์๊ท๋ชจ๋ก ์์ํ๋ ๊ฒฝ์ฐ ๋งค๋ฒ ์ธ์ฆ์ ์ง์ ๊ตฌํํ๊ธฐ์๋ ๋๋ฌด ์์๊ฐ ํฌ๋ค๋ ์๊ฐ์ด ๋ ๋ค.
๊ทธ๋ฌ๋ค ๋ค์ด๋ฒ, ์นด์นด์ค, ๊ตฌ๊ธ ๋ฑ ๋ค๋ฅธ ์ฌ์ดํธ ์์ด๋๋ฅผ ํตํด ๋ก๊ทธ์ธ์ด ๊ฐ๋ฅํ ๊ฒ๋ค์ ๋ณด๋ฉด์ ์ด๋ป๊ฒ ์ด๋ฐ ๊ฒ์ด ๊ฐ๋ฅํ์ง? ๋ผ๋ ์๋ฌธ์ ๊ฐ์ง๊ฒ ๋๋ค.
๊ด๋ จํด์ ๊ฒ์์ ํ๋ค๋ณด๋ OAuth2.0 ์ด๋ผ๋ ๊ฐ๋ ์ ์ ํ๊ฒ ๋์๊ณ , ๋จ์ํ social login์ ์ฌ์ฉํ๊ธฐ ์ ์ ์ด๊ฒ์ ์๊ณ ๊ฐ์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ๊ทธ๋์ OAuth2.0์ ๋ํ ๋ด์ฉ์ ๊ฐ๋ตํ๊ฒ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
์ ๊ธ๋ง์ผ๋ก ๋ถ์กฑํ ์ ์์ผ๋ references ๋ด์ฉ๋ค ๊ผญ ์ฝ์ด๋ณด์๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค ๐
OAuth2.0
๐ง OAuth2.0 ์ด๋?
OAuth2.0์ ๋ํ rfc ๋ฌธ์ : https://datatracker.ietf.org/doc/html/rfc6749
์ ๋ฆฌ๋ฅผ ์ํด๋ ํ์ปด์ธํ
๋ฆฌ์ ์ค ๋ธ๋ก๊ทธ๊ฐ ์์ด์ ์ฐธ๊ณ ํ์ฌ ์์ฑํ์๋ค.
OAuth2.0์ rfc ๋ฌธ์์ ์ ๋ชฉ์์ Authorization Framework์ด๋ผ ์ง์นญ๋๋ค. ํต์ฌ์ Third-Party ํ๋ก๊ทธ๋จ์๊ฒ ๋ฆฌ์์ค ์์ ์(Resource Owner)๋ฅผ ๋์ ํ์ฌ ๋ฆฌ์์ค ์๋ฒ(Resource Server)์์ ์ ๊ณตํ๋ ์์์ ๋ํ ์ ๊ทผ ๊ถํ์ ์์ํ๋ ๋ฐฉ์์ ์ ๊ณตํ๋ค.
๋ญ๊ฐ ์ข์์ ์ฐ๋ ๊ฑธ๊น?
ํฐ ์ฅ์ ์ผ๋ก ๋จ์์ฑ์ ๊ผฝ์ ์ ์๋ค. ๊ตฌํ์์ ๊ด์ ์์ ๋ณผ ๋ OAuth 2๋ฅผ ์ด์ฉํ๋ค๋ฉด ๋ค์ด๋ฒ๋ ์นด์นด์ค ๋ฑ ๋ค๋ฅธ ์ฌ์ดํธ ๋ก๊ทธ์ธ์ ํตํด ์ธ์ฆ์ ํ๊ณ ์ ๊ทผ ๊ถํ์ ์ป๋ ๊ฒ์ด๋ฏ๋ก, ๋ณต์กํ ์ธ์ฆ ์ ์ฐจ๋ฅผ ์ง์ ๊ตฌํํ๊ณ ์ ๊ณตํ ํ์๊ฐ ์์ด์ง๋ค.
๋ฆฌ์์ค ์์ ์๋ ๋ญ๊ณ ๋ฆฌ์์ค ์๋ฒ๋ ๋ญ์ง?
์ฌ๊ธฐ์ ๋์ค๋ ์ญํ ๋ค์ ๋ํด ์ ๋ฆฌํ๊ณ ๋์ด๊ฐ์.
- Resource Owner : ๋ฆฌ์์ค ์์ ์ ๋๋ ์ฌ์ฉ์. ๋ณดํธ๋ ์์์ ์ ๊ทผํ ์ ์๋ ์๊ฒฉ์ ๋ถ์ฌํด ์ฃผ๋ ์ฃผ์ฒด. ์ฆ id/password๋ฅผ ์ ๋ ฅํ๋ ์ฌ์ฉ์๊ฐ ๋๋ค. ์ธ์ฆ์ด ์๋ฃ๋๋ฉด ๊ถํ ํ๋ ์๊ฒฉ(Authorization Grant)์ Client์๊ฒ ๋ถ์ฌํฉ๋๋ค.
- Client : ๋ณดํธ๋ ์์์ ์ฌ์ฉํ๋ ค๊ณ ์ ๊ทผ ์์ฒญ์ ํ๋ Application (ex. ๋ด fastapi server)
- Resource Server : ์ฌ์ฉ์์ ๋ณดํธ๋ ์์์ ํธ์คํ ํ๋ server (ex. ๊ตฌ๊ธ, ๋ค์ด๋ฒ, ์นด์นด์ค ๋ฑ)
- Authorization Server : ๊ถํ ์๋ฒ. ์ธ์ฆ/์ธ๊ฐ๋ฅผ ์ํํ๋ ์๋ฒ๋ก ํด๋ผ์ด์ธํธ์ ์ ๊ทผ ์๊ฒฉ์ ํ์ธํ๊ณ Access Token์ ๋ฐ๊ธํ์ฌ ๊ถํ์ ๋ถ์ฌํ๋ ์ญํ ์ ์ํ (ex. ๊ตฌ๊ธ, ๋ค์ด๋ฒ, ์นด์นด์ค ๋ฑ)
์ง๊ธ๊น์ง์ ํต์ฌ์ ๋ด fastapi ์๋ฒ๋ ์ฌ์ฉ์๊ฐ authorization server(ex. ๋ค์ด๋ฒ)์ ์ธ์ฆํ๋๋ก ํ๊ณ , ์ธ์ฆ ์๋ฃ ์ ๊ถํ์ ์ป์ด Resource Server(ex. ๋ค์ด๋ฒ)์์ ๋ก๊ทธ์ธํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ป์ด ๋ด ์๋น์ค์ ์ด์ฉํ๋ฉด ๋๋ค.
๊ถํ์ ์ป์๋ ์ง ์ด๋ป๊ฒ ์์ง?
์ธ์ฆ์ ์ฑ๊ณตํ๋ฉด authorization server๊ฐ Access token / Refresh token(Optional)์ ๋ฐ๊ธํด์ค๋ค.
์ด๊ฒ๋ค์ ๋ญ๋.. ๊ฐ๋จํ ๋งํ์๋ฉด Access token์ Resource Server(ex. ๋ค์ด๋ฒ)์๊ฒ์ ์ฌ์ฉ์์ ๋ณดํธ๋ ์์์ ํ๋ํ ๋ ์ฌ์ฉ๋๋ ๋ง๋ฃ ๊ธฐ๊ฐ์ด ์๋ token์ด๊ณ , Refresh token์ Access token ๋ง๋ฃ ์ ์ด๋ฅผ ๊ฐฑ์ ํ๊ธฐ ์ํ ์ฉ๋๋ก ์ฌ์ฉํ๋ token์ด๋ค.
๋ค์ด๋ฒ์ ์นด์นด์ค์ ๊ฒฝ์ฐ Access Token์ ๋ง๋ฃ ๊ธฐ๊ฐ์ 1~2์๊ฐ ์ ๋์ด๋ค. Refresh Token์ ๊ฒฝ์ฐ ๋ ๋ค ์กด์ฌํ๊ณ ์นด์นด์ค๋ ๊ธฐ๊ฐ์ด ๋ช ๋ฌ ์ ๋ ๋์ง๋ง, ๋ค์ด๋ฒ๋ ๋ฑํ ๋ช ์๋์ด์์ง ์์๊ณ , ์๋ต์๋ ๋ง๋ฃ๊ธฐ๊ฐ์ด ์๋ ๋ฏํ๋ค..?(Refresh token ๋ง๋ฃ๊ธฐ๊ฐ ๊ด๋ จ ๋ค์ด๋ฒ ๋ฌธ์ ๋งํฌ ๋ค์ด๋ฒ ํ...! ๋ต ์ข ๋ฌ์์ค๋ผ...)
์ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋์ํ๋ ๊ทธ๋ฆผ์ ํตํด ์ ์ฒด ํ๋ฆ์ ์ดํด๋ณด๊ณ ์ดํดํด๋ณด์.
๐ OAuth2.0์ ์ ์ฒด์ ์ธ ํ๋ฆ
ํ๋ฆ์ ๋ณด๊ธฐ์ ์์ OAuth ํ๋กํ ์ฝ์์๋ ๋ค์ํ ํด๋ผ์ด์ธํธ ํ๊ฒฝ์ ์ ํฉํ๋๋ก ๊ถํ ๋ถ์ฌ ๋ฐฉ์์ ๋ฐ๋ผ 4๊ฐ์ง ์ข ๋ฅ๋ก ๊ตฌ๋ถํด์ ์ ๊ณตํ๋ค.
- Authorization Code Grant : ๊ถํ ๋ถ์ฌ ์น์ธ ์ฝ๋ ๋ฐฉ์
- Implicit Grant : ์๋ฌต์ ์น์ธ ๋ฐฉ์
- Resource Owner Password Credentials Grant : ์์ ์์ ์ ์๊ฒฉ์ฆ๋ช ์น์ธ ๋ฐฉ์
- Client Credentials Grant : ํด๋ผ์ด์ธํธ ์๊ฒฉ์ฆ๋ช ์น์ธ ๋ฐฉ์
๊ทธ์ค์์ 1๋ฒ Authorization Code Grant ๋ฐฉ์์ด ์์ฒด ์์ฑํ Authorization Code๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ผ๋ก ๋ง์ด ์ฐ์ด๊ณ ๊ธฐ๋ณธ์ด ๋๋ ๋ฐฉ์์ด๊ธฐ์ ์ด๊ฒ๋ง ๋ค๋ฃจ๋๋ก ํ๊ฒ ๋ค. (๋ค์ด๋ฒ, ์นด์นด์ค ๋ ๋ค ์ด ๋ฐฉ์์ ์ฌ์ฉํจ.)
๊ทธ๋ฆผ์ ์์๋๋ก ๋ด๊ฐ ์ดํดํ ๊ฒ์ ๋ค์ด๋ฒ ๋ก๊ทธ์ธ์ fastapi์๋ฒ๋ก ๊ตฌํํ๋ค๋ ๋๋์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ํ์ ์ค๋ช ํด๋ณด๊ฒ ๋ค.
๊ทธ๋ฆผ์์ App XYZ = ๋ด ์ฑ ์๋ฒ(fastapi)
๊ทธ๋ฆผ์์ service ABC Authorization server = ๋ค์ด๋ฒ ์ธ์ฆ ์๋ฒ
๊ทธ๋ฆผ์์ service ABC Resource server = ๋ค์ด๋ฒ ๋ฆฌ์์ค ์๋ฒ
- 1~5 ์ฌ์ฉ์๊ฐ ๋ด ์ฑ์์ ์ ๊ณต๋ ๋ก๊ทธ์ธ ํ์ด์ง์ ์๋ ๋ค์ด๋ฒ ์์ด๋ ๋ก๊ทธ์ธ ๋ฒํผ์ ๋๋ฅธ ํ, ๋ค์ด๋ฒ ๋ก๊ทธ์ธ ํ์ด์ง๊ฐ ๋จ๋ฉด์ ID/PW๋ก ๋ก๊ทธ์ธ์ ์งํํ๋ค.
- 6 ๋ค์ด๋ฒ ์ธ์ฆ ์๋ฒ๊ฐ ID/PW๊ฐ ์ ํจํ ๊ฒ์ด ํ์ธ๋๋ฉด, ๋ด ์๋ฒ์ ์ธ์ฆ ์ฝ๋(authorization code)๋ฅผ ๋ณด๋ด์ค๋ค.
- 7~8 ๋ด ์๋ฒ์์ ๋ฐ์ ์ธ์ฆ์ฝ๋๋ก ๋ค์ด๋ฒ ์ธ์ฆ ์๋ฒ์ Access token ๋ฐ๊ธ์ ์์ฒญํ์ฌ ๋ฐ๊ธ๋ฐ๋๋ค.
- A~D ๋ฐ๊ธ๋ฐ์ Access token์ผ๋ก ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค.
๋ด ์ค๋ช ์ด ๋ง์ง ์๊ฑฐ๋ ์ดํด๊ฐ ์ ๋ ์ ์์ผ๋ rfc ๋ฌธ์์ ํด๋น ๋ถ๋ถ์ ๋งํฌ๋ก ๋ฌ์๋ ํ ๋ ํ์ธํด๋ณด๊ธธ ๋ฐ๋๋ค. 4.1. Authorization Code Grant
rfc ๋ฌธ์์ ๊ทธ๋ฆผ์ ๋ณด๊ณ ๋๋ ๊ฒ์ธ๋ฐ, ์์ ๊ทธ๋ฆผ์์ 1๋ฒ ๋ถ๋ถ์ App XYZ๋ rfc ๋ฌธ์์์ user-agent์ธ ๊ฒ ๊ฐ๊ณ , ์ดํ 6๋ฒ์ ๋์ค๋ App XYZ๋ rfc ๋ฌธ์์์๋ Client์ด์ง ์๋ ์๊ฐ์ด ๋ ๋ค.
์ ๊ทธ๋ฆผ์์๋ ํ๋์ App XYZ๋ก ํํ์ ํ์ง๋ง ํผ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด user-agent์ client๋ก ๋ฐ๋ก ํํ๋์ด์ผ ํ๋ ๊ฒ์ด ์๋๊ฐ ์ถ๋ค. ์ฌ๊ธฐ์ ๋งํ๋ App XYZ๊ฐ ๊ฒฐ๊ตญ ํ๋์ application์ ๋งํ๋ ๊ฒ์ด๋ฏ๋ก frontend/backend๋ฅผ ์ ๋ถ ํฌํจํ ๊ฐ๋ ์ด๋ผ ์๊ฐํ๋ฉด ๋ง๋ ๋ง ๊ฐ๊ธฐ๋ ํ๊ณ ์ ๋ชจ๋ฅด๊ฒ ๋ค.. ๋๋ง ํผ๋์ค๋ฝ๋..?
๐ ๋ง๋ฌด๋ฆฌ
ํต์ฌ ์ ๋ฆฌ
OAuth2.0์ ํต์ฌ์ ์์์ ๋ํ ์ ๊ทผ ๊ถํ์ ์์ํ๋ ๋ฐฉ์์ด๋ผ๋ ๊ฒ ๊ฐ๋ค.
์ฆ ๋ด app์ด ์๊ณ , ์ฌ์ฉ์๊ฐ ์๋ค๊ณ ํ ๋, ์ฌ์ฉ์๊ฐ ์์ ์ ๋ฐ์ดํฐ์ ๋ํ access ๊ถํ์ ๋ถ์ฌํด์ฃผ๋ ๊ฒ ๊ฐ๋ค. ๊ทธ ๊ณผ์ ์์ ์ฌ์ฉ์์ ๋ด app ์ฌ์ด์ ๋ค์ด๋ฒ๋ ์นด์นด์ค์ ๊ฐ์ ์ธ์ฆ ์๋ฒ๊ฐ ์ค๊ฐ๋ฅผ ํด์ฃผ๋ ๊ฒ์ด๋ค.
๊ทธ ๊ฒฐ๊ณผ ๋๋ app์ ๊ฐ๋ฐํ ๋ ์ธ์ฆ์ ๊ตฌํํ ํ์๊ฐ ์์ผ๋ฏ๋ก ๋น์ฆ๋์ค ๋ก์ง์ ์ข ๋ ์ง์คํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
๋ง๋ฌด๋ฆฌ ๋ฉํธ
์ข ๋ ๋ํ ์ผํ๊ฒ ๋ค์ด๊ฐ์๋ฉด ๋นผ๋จน์ ๋ด์ฉ์ด ๋ง๊ฒ ์ง๋ง, ์ฐ์ ์ปจ์ ์ ์์๊ฐ๋ ๊ฒ์ ๋ชฉ์ ์ผ๋ก ๊ธ์ ์จ๋ดค๋ค. ์์ผ๋ก ๋จ๋ค์ด ๋ค ์ฐ๋๊น ์ด๋ค๋ ์ด์ ๋ง๊ณ , ์ ํํ ์ ์ฐ๋ ๊ฑด์ง, ์ด๋ค ์ด์ ์ด ์๋์ง ์๊ณ ์ธ ์ ์๋๋ก ๋ ธ๋ ฅํ์.
references
- OAuth2.0 rfc ๋ฌธ์ : https://datatracker.ietf.org/doc/html/rfc6749
- OAuth2.0 ์ ๋ฆฌ (ํ์ปด์ธํ ๋ฆฌ์ ์ค ๋ธ๋ก๊ทธ) : https://blog.naver.com/mds_datasecurity/222182943542
- OAuth2.0 flow : https://darutk.medium.com/diagrams-and-movies-of-all-the-oauth-2-0-flows-194f3c3ade85