OAuth 2.0
OAuth 2.0
์ธ๊ฐ ํ๋ ์ ์ํฌ
Authorization(์ธ๊ฐ)
์ธ์ฆ์ ๋ฐ์ ์ฌ์ฉ์๊ฐ ์ดํ ์ธ์ฆ์ด ํ์ํ ์๋น์ค๋ฅผ ์ด์ฉํ ๋ ์๋ฒ์์ ๋ก๊ทธ์ธ(์ธ์ฆ๋ ์ฌ์ฉ์)์ธ์ง ํ์ธ ํ ํ๊ฐ๋ฅผ ํด์ฃผ๋ ๊ฒ
๋์ ๋ฐฉ์
์ ์ฒด์ ์ธ Flow
์๋ฒ์์ ์ฌ์ฉ์์ ์๋น์ค ๊ถํ์ ํ์ธ
๊ถํ์ด ์์ผ๋ฉด, ์ธ๊ฐ๊ฐ ํ์ํ๋ค๋ ์๋ฆผ์ ์ฌ์ฉ์์๊ฒ ๋ ธํฐ
์ฌ์ฉ์๋ ์๋น์ค์ ์ธ๊ฐ ์์ฒญ
์๋น์ค๋ ์ธ๊ฐ๊ฐ ์๋ฃ๋์๋ค๋ ์์ ์ฝ๋๋ฅผ ๋ฐ๊ธ
์ฌ์ฉ์๋ ๋ฐ์ ์์ ์ฝ๋๋ฅผ ์๋ฒ์ ์ ๋ฌ
์๋ฒ๋ ์ด ์ฝ๋๋ฅผ ์ด์ฉํด ์๋น์ค ์ ๊ทผ ๊ถํ์ ๊ฐ๋ ํ ํฐ์ ์์ฑํ๊ณ ์ ์ฅ
์ฌ์ฉ์๋ ํด๋น ํ ํฐ์ ํตํด ์๋น์ค๋ฅผ ์ด์ฉ
ID์ PW๋ ๋ฐ๊ธ๋ฐ์ ํ ๋ณ๊ฒฝํ์ง ์๋ ํ ๋ฌด๊ธฐํ ์ฌ์ฉํ ์ ์๋ ๋ฐ๋ฉด, ํ ํฐ์ ๋ฐ๊ธ ์์ ์ดํ ์ ํ๋ ์๊ฐ ๋์๋ง ์ ํจํ์ฌ ํน์ ๊ถํ์ ๋ฌด๊ธฐํ ํ์ฉํ์ง ์์ต๋๋ค.
ํ ํฐ์ ์์ ํ๊ฒ ๋ณด๊ดํ๋ ๊ฒ๋ ์ค์ํ์ง๋ง, ๋ง์ฝ ์์ด๋ฒ๋ ธ์ ๋ ํผํด๊ฐ ์ ๋๋ก ํด์ผ ํฉ๋๋ค.
์ธ๋ถ์ ์ธ Flow
์ธ์ฆ ํ ํฐ์ ์ป๊ธฐ ์ํด์ ํด๋ผ์ด์ธํธ(์๋ฒ)์๊ฒ ์์ฒญ
ํด๋ผ์ด์ธํธ๊ฐ ์ฑ์ด๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ง์ด ๊ฐ๋ฆฌ์ผ์ ํท๊ฐ๋ฆด ์ ์์. OAuth 2.0 ์ธ๊ฐ ๊ณผ์ ์์ ์ฃผ์ฒด๊ฐ ๋๋ ๊ฒ์ ๊ฐ๋ฆฌํค๋ ๋ง
์ธ๊ฐ๋ฅผ ์์ํ๋ฉด ์๋ฒ๋ ์ธ์ฆ์ ํด์ผํ ์์น๋ก ๋ฆฌ๋ค์ด๋ ํธ ์๋ต์ ๋ณด๋
์์น์๋ ์ธ๊ฐ์ ํ์ํ ํ๋ผ๋ฏธํฐ๋ค์ ์ถ๊ฐ
client_id
: ํด๋ผ์ด์ธํธ์ ์๋ณ์response_type
: ์ด๋ค ์ธ๊ฐ ๋ฐฉ๋ฒ์ผ๋ก ๋ณด๋ผ์ง ๋ช ์.code
๋ OAuth 2.0์ ๊ฐ์ฅ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ธ ์ธ๊ฐ ์ฝ๋ ํ๋ก์ฐ๋ฅผ ๋ปํจ.
scope
: ์ธ๊ฐํ ์ ๊ทผ ๊ถํredirect_uri
: ์ธ๊ฐ๋ฅผ ๋ง์น ํ ๋ค์ ๋์์ฌ URL
๋ฆฌ๋ค์ด๋ ํธ ์๋ต์ ๋ฐ์ ๋ธ๋ผ์ฐ์ ๋ ํด๋น Location์ผ๋ก ๋ฆฌ๋ค์ด๋ ํธ.
์ธ๊ฐ ์๋ฒ๋ ์ฌ์ฉ์๊ฐ ์ธ์ฆํ ์ ์๋ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค.
์ธ์ฆ์ด ์๋ฃ๋์๋ค๋ฉด ๋ธ๋ผ์ฐ์ ์์ ์ ๊ทผ ๊ถํ์ ํ์ธํ๊ณ ์ฌ์ฉ์๊ฐ ์น์ธ
์ธ๊ฐ ์๋ฒ์์ ์น์ธ์ด ์๋ฃ๋๋ฉด ์ธ๊ฐ ์ฝ๋๋ฅผ ๋ฐ๊ธํ์ฌ ์ฒ์ ์์ฒญํ ๋ ์ ์กํ๋
redirect_uri
๋ค์ ์ถ๊ฐ์ ์ธ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์ถ๊ฐํด์ ๋ธ๋ผ์ฐ์ ์๊ฒ ๋ฆฌ๋ค์ด๋ ํธ ์๋ต์ ๋ณด๋๋ฆฌ๋ค์ด๋ ํธ ์๋ต์ ๋ฐ์ ๋ธ๋ผ์ฐ์ ๋ Location์ผ๋ก ๊ทธ๋๋ก ๋ฆฌ๋ค์ด๋ ํธ
์์ฒญ์ ๋ฐ์ ํด๋ผ์ด์ธํธ ์๋ฒ๋ ์ ๋ฌ๋ฐ์
code
์client_id
๊ทธ๋ฆฌ๊ณclient_secret
์ ๊ฐ์ด ์ธ๊ฐ ์๋ฒ์ ์ ์กํ์ฌ ํ ํฐ์ ๋ฐ๊ธ
์ธ๊ฐ ์๋ฒ๋ ์ด๋ฅผ ๊ฒ์ฆํ๊ณ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด ์ ๊ทผ ๊ถํ ํ ํฐ์ ์๋ต
OAuth 2.0 ๋ณด์ ์ทจ์ฝ์
์ฌ์ฉ์๊ฐ ์๋ํ์ง ์์ ํ๋์ ํ๋๋ก ํ์ฌ ์ธ์ ์ ํ์ทจํ๊ฑฐ๋ ๊ณต๊ฒฉ์์ ์ธ์ ์ ์ง์ด ๋ฃ๋ ๊ณต๊ฒฉ
OAuth๋ ๋ ๊ฐ์ง์ ์ฑ๋์ ์ฌ์ฉ
Front Chanel: ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ
๋ฆฌ๋ค๋ ํธ๋ฅผ ํตํด์ ์ธ๊ฐ ์๋ฒ๋ก ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ณ , ์ธ๊ฐ ์ฝ๋๋ ๋ฆฌ๋ค๋ ํธ๋ฅผ ํตํด์ ์ ๋ฌ
ํ๋ก ํธ ์ฑ๋์ ์ด์ฉํ๋ ์ด์ ๋ ์ฌ์ฉ์๊ฐ ์ 3์ ์๋น์ค(์ธ๊ฐ ์๋ฒ)์ ์ง์ ์ธ์ฆ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ
ํ๋ก ํธ ์ฑ๋์ ํตํด ์ ์ก๋๋ ๋ชจ๋ ์ ๋ณด๋ ๊ณต๊ฐ๋๊ณ ์ ์ถ๋ ์ ์๊ธฐ์ ์ ์ ํ ๋ณดํธํ์ง ์๋๋ค๋ฉด ์ฌ์ฉ์์ ์ ๋ณด๊ฐ ์ํ์ ๋ ธ์ถ๋๋ค.
client_id, scope(์ ๊ทผ ๊ถํ), redirect_uri, code(์ธ๊ฐ ์ฝ๋) ๋ชจ๋๊ฐ ๊ณต๊ฐ๋๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ์ ์ ์ ํ๊ฒ ๋ณดํธํด์ผ ํ๋ค.
๋ธ๋ผ์ฐ์ ํ์คํ ๋ฆฌ, ์์ด์ด ์คํฌ ํจํท ๋ถ์๊ธฐ ๋ฑ
URL์ ์ํธํ๊ฐ ์๋๊ธฐ ๋๋ฌธ
scope: ๊ถํ์ ๋ํ๋
Github OAuth์ ๊ฒฝ์ฐ ์ฒ์ ๋ฑ๋กํ ๋์ ๊ถํ๊ณผ ๋ค๋ฅด๋ฉด ๊ฑฐ์ ํ๋ ๋ฑ์ผ๋ก ์ฒ๋ฆฌ
client_id ์๋ณ์
๊ฐ์ง ์ฌ์ดํธ๋ฅผ ๋ง๋ค์ด ํ์ฉ๋ client_id๋ฅผ ๊ฐ์ ธ์ ์ธ์ฆํ๋๋ก ํ๋ฉด ๋ง์น ๋ด๊ฑฐ์ธ๊ฑฐ๋ง๋ ์์ด๋๋ฅผ ํ๋ด๋ผ ์ ์์
client_secret์ backend chanel๋ก๋ง ์ ์ก๋๊ณ ๋ฏธ๋ฆฌ ๋ฑ๋กํ๊ธฐ ๋๋ฌธ์ ํ ํฐ์ ๊ตํํ๋ ๊ณผ์ ์์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ client_id ์ฃผ์ธ ์๋ณ๊ฐ๋ฅ
redirect_uri: code๋ฅผ ์ป๊ณ ๋์ ์ด๋๋ก ๋์์ฌ์ง์ ๋ํ ๋ฐ์ดํฐ
์ ์์ ์ผ๋ก ๊ฒฝ๋ก๋ฅผ ๋ฐ๊พผ ์์ฒญ์ ๋ณด๋ด์ ์ธ๊ฐ ์ฝ๋๋ฅผ ํ์ทจ
redirect_mismatch -> ์ฒ์ ๋ฑ๋ก๋๊ฒ๊ณผ ๋ค๋ฅด๋ฉด ๊ฑฐ์
์์ ์ผ์น ๊ฒ์ฌ, ํ์ URL ํ์ฉ, ๋๋ฉ์ธ ๊ฒ์ฌ ๋ฑ ์ ์ฐํ๊ฒ ์ฒ๋ฆฌํ๊ฒ ์ค์ ํ ์ ์์ง๋ง ๋ณด์์ ์ผ๋ก๋ ์ทจ์ฝํด์ง
code: ํ ํฐ์ ๊ตํํ๊ธฐ ์ํ ์ฝ๋
์ธ๊ฐ ์ฝ๋๋ ์ ์ผ ์ค์ํ ์ ๋ณด๋ก ํ์ทจ๋์ด์๋ ์๋๋ค.
๊ทธ๋์ ์ธ๊ฐ ์๋ฒ๋ ํ ๋ฒ ์ฌ์ฉํ ์ฝ๋๋ ๋ ๋ฒ ๋ค์ ์ฌ์ฉํ ์ ์๋๋ก ํ๊ธฐํด์ผ ํ๋ค
stateํ๋ผ๋ฏธํฐ๋ฅผ ์ถ๊ฐํ์ฌ CSRF ๊ณต๊ฒฉ์ ๋ฐฉ์ง
state: ์๊ธฐ ์ด๋ ค์ด ๋ฌธ์์ด, ์์ฒญํ์ฌ๋๊ณผ ์ธ๊ฐํ์ฌ๋์ด ๊ฐ์์ง ํ๋ณ (CSRF ๋ฐฉ์งํ๊ธฐ ์ํจ)
ํด๋ผ์ด์ธํธ(์๋ฒ)๊ฐ ์ธ๊ฐ ์๋ฒ๋ก ๋ฆฌ๋ค์ด๋ ํธ ํ๊ธฐ ์ ์ ์ฌ์ฉ์์ ์ธ์ ์ state๋ผ๋ ์์์ ๋ณ์๋ฅผ ํ๋ ์์ฑํด์ ๊ฐ์ด ์ ๋ฌ
์ธ๊ฐ ์๋ฒ๋ ์ธ๊ฐ ์ฝ๋์ ํจ๊ป state๋ฅผ ๋ฐ์ ๊ทธ๋๋ก ๋๋ ค์ค์ ์ฒ์์ ์ธ์ ์ ๋ฑ๋กํ๋ state์ ๋น๊ต
๋ง์ฝ ์ด state๊ฐ ์๊ฑฐ๋ ๋ค๋ฅด๋ค๋ฉด ์์ฒญ์ ๊ฑฐ๋ถ
state๋ฅผ ๋ณ๊ฒฝํด์ ๊ณต๊ฒฉํ๋๋ผ๋ ์๋ฒ์ ์ธ์ ์ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ ์ ์๋ค.
Backend Chanel: ์๋ฒ์ ์๋ฒ๊ฐ ํต์ ํ๋ ์ฑ๋
์ฌ์ฉ์์๋ ์๊ด์์ด ์์คํ ์ ํตํด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ
ํ๋ก ํธ ์ฑ๋์ ํตํด ๋ฐ์ ์ธ๊ฐ ์ฝ๋๋ฅผ ์ด์ฉํด์ ์ ๊ทผ ๊ถํ ํ ํฐ์ ์์ฒญ
HTTPS๋ฅผ ํตํด ์ํธํ๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๊ฐ ์ ์ถ๋ ๊ฐ๋ฅ์ฑ์ด ์ ์
OAuth ์ธ์ฆ
OAuth 2.0์ด ์ฃผ๋ก ๊ฐํธ ๋ก๊ทธ์ธ์ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค ๋ณด๋, ์ฌ๋๋ค์ OAuth 2.0์ ์ธ์ฆ ํ๋ฅดํ ์ฝ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง OAuth 2.0์ ์ธ์ฆ ํ๋กํ ์ฝ์ด ์๋๋๋ค.
OAuth 2.0์์ ํ ํฐ์ ๋ถํฌ๋ช ํฉ๋๋ค. ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ ํ ํฐ์ ์ธ๊ฐ ์๋ฒ์์ ๋ฐ์ ๊ทธ๋๋ก ์ ์ฅํ๊ณ ๊ทธ๋๋ก ์ ๋ฌํ์ฌ ๋ฆฌ์์ค๋ฅผ ์ป๋ ๋ฐ ์ฐ์ ๋๋ค. ์ด ํ ํฐ์ด ์ด๋ค ํ์์ธ์ง๋ OAuth 2.0 ์์ฒด์์ ์ ์๋์ด ์์ง๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ค ๋ณด๋ ์ด ํ ํฐ์ ๋ถํฌ๋ช ํ๊ฒ ๊ด๋ฆฌ๋ฉ๋๋ค.
์ด ํ ํฐ์ ๊ฐ์ง๊ณ ๋ฌด์ธ๊ฐ๋ฅผ ํ ์ ์๋ค๊ณ ํด์ ๊ทธ ์ฌ๋์ด ํ์ธ๋๋ ๊ฒ์ ์๋๋๋ค. ์๋ฅผ ๋ค์ด์ ์ํํธ ํ๊ด ๋ฌธ์ ํ๋ฐฐ๊ธฐ์ฌ๋๋ค์ด ์ด ์ ์๋ค๊ณ ํด์ ํ๋ฐฐ๊ธฐ์ฌ๋์ด ์ฐ๋ฆฌ ์ํํธ ์ฃผ๋ฏผ์ด ๋๋ ๊ฒ์ ์๋์ฃ . ์ฐ๋ฆฌ๋ ๋จ์ํ ํ๋ฐฐ๋ฅผ ๋ฐ๊ธฐ ์ํด์ ๋ฌธ์ ์ด ์ ์๋ ๊ถํ์ ์ธ๊ฐํ ๊ฒ ๋ฟ์ ๋๋ค.
OAuth๋ ์ธ๊ฐ๋ฅผ ์ํ ํ๋ ์์ํฌ, ์ธ์ฆ์ ๋์ ํด์ฃผ๊ธฐ ์ํด ์ฐ๋๊ฒ์ ์๋
์ธ์ฆ๊ณผ ์ธ๊ฐ๋ ๋ค๋ฅด๋ค.
์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋๋ก ์ธ๊ฐ๋ ํ์ง๋ง ์ธ์ฆ์ ์๋ฒ์์ ์ฒ๋ฆฌํด์ผํจ
์ฆ, OAuth๋ ์ธ์ฆ์ ์ํ๊ฒ์ด ์๋ ์ธ๊ฐ๋ฅผ ํจ์ผ๋ก์จ "์ด๊ฑธ ํ ์ ์์ผ๋๊น ์ด ์ฌ๋์ด ๋ง๊ฒ ์ง" ์ ๋๋ก ํํํ๋๊ฒ
์ฌ์ฉ์๋ฅผ ์ป๋๊ฒ ๊น์ง๋ง OAuth ์๋น์ค๋ฅผ ์ด์ฉํ๊ณ ๊ทธ๊ฑธ ๊ฐ์ ธ์์ ์ฐ๋ฆฌ ๋ฐ์ดํฐ์ ์ฌ์ฉ์๊ฐ ์ ์ฅ์ด๋๋ฉด ์ดํ๋ถํฐ ํด๋น ๋ฐ์ดํฐ๋ก ์ฃผ๊ณ ๋ฐ์ ์ธ์ฆ์ฒ๋ฆฌ๋ฅผ ํจ
OpenID Connect Protocol
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ
์ธ์ฆ ํ๋กํ ์ฝ
OpenID Connect๋ OAuth 2.0 ์ธ๊ฐ ํ๋ ์์ํฌ๋ฅผ ํ์ฅ
๋ค๋ฅธ ์๋น์ค๊ฐ ์ธ์ฆ์ ๋์ ์ํํ๋๋ก ํ๋ ํ๋กํ ์ฝ
OAuth๋ฅผ ํ์ฅํ๊ฒ์ด๋ผ ํ ํฐ์ ์ป๋ ๊ณผ์ ์ ์์ ํ ๋์ผํจ
ํ ํฐ์ ๋ฐ์ ๋ ์ธ๊ฐ์ ๊ด๋ จ๋ ํ ํฐ ๋ฟ๋ง ์๋๋ผ
id_token
์ด๋ผ๊ณ ํด์ ์ธ์ฆ๋ฐ์ ํ ํฐ์ ์ถ๊ฐ๋ก ๋ฐ๋๋ค.ํด๋น ํ ํฐ์๋ ๋๊ฐ ๋ฐํํ๊ณ ์ธ์ ๋ง๋ฃ๋๋์ง, ๋๊ตฌ์ธ์ง์ ๋ํ ๋ฐ์ดํฐ๊ฐ JWT ํ์์ผ๋ก ์ ์ฅ๋์ด์์
ํด๋น ํ ํฐ์ ์๋ฒ๋ ์ฌ์ฉ์๊ฐ ๊ด๋ฆฌํ๋ฉด ๋จ
JWT ํ์์ด๋ผ ์๋ฌด๋ ๋ง๋ค ์ ์์ง๋ง ๋๊ตฌ๋ ๊ฒ์ฆ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ
Last updated