๋ฐฉ๋ ํ ํ๋ก์ ํธ์์๋ ์นด์นด์ค ๋ก๊ทธ์ธ์ ํตํด ์ฌ์ฉ์์ ์ธ์ฆ/์ธ๊ฐ๋ฅผ ๊ตฌํํ๋ค. ์นด์นด์ค ๋ก๊ทธ์ธ์ ์นด์นด์ค ๊ณ์ ์ ์ฌ์ฉํด ๋ค์ํ ์๋น์ค์ ๋ก๊ทธ์ธํ ์ ์๋๋ก ํ๋ OAuth 2.0 ๊ธฐ๋ฐ์ ์์ ๋ก๊ทธ์ธ ์๋น์ค์ด๋ค. ๋จ์ํ ์นด์นด์ค์์ ์ ๊ณตํ๋ ๋ฌธ์์ ๋ฐ๋ผ ๊ตฌํํ๋ ๊ฒ์ ๋์ด OAuth ๊ธฐ์ ์ ๋ํ ์ดํด๋๋ฅผ ๋์ด๊ณ ์ ๊ธ์ ์์ฑํ๋ค.
OAuth ํ๋กํ ์ฝ์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฆฌ์์ค ์ค๋๋ฅผ ๋์ ํด ์๋ฒ์ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ธฐ์ ์ด๋ค.
OAuth ํ๋กํ ์ฝ์ ๋ณดํธ๋์ด์๋ ๋ฆฌ์์ค์ ๋ํ ์ ๊ทผ ๊ถํ์ ์์ํ๋ ๊ณผ์ ์์ ๋ฐ์ํ๋ ๊ณตํต์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ํ ์น์ฌ์ดํธ ๋ฐ ์ธํฐ๋ท ์๋น์ค์ ์น ๊ฐ๋ฐ์๋ค๋ก ๊ตฌ์ฑ๋ ์๊ท๋ชจ ์ปค๋ฎค๋ํฐ์์ ๋ง๋ค์ด์ก๋ค. OAuth ํ๋กํ ์ฝ์ ์ฒซ ๋ฒ์งธ ๋ฒ์ (1.0)์ 2007๋ ์ ์์ ํ๋์๊ณ OAuth 2.0์ 2012๋ ์ ํ์คํ๋์๋ค.
OAuth ์ฉ์ด๋ OAuth ๊ฐ๋ ์ด๋ ๋์ ํ๋ฆ์ ์ดํดํ ๋ ์ค์ํ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ ์ ๋ฆฌํ๊ณ ๋์ด๊ฐ๋ค.
| ์ฉ์ด | ์ค๋ช |
|---|---|
Protected Resource(๋ณดํธ๋ ๋ฆฌ์์ค) | OAuth ์ธ์ฆ ์์ฒญ์ ์ฌ์ฉํด์ ์๋ฒ์์ ๊ฐ์ ธ์ฌ ์ ์๋ ์ ํ๋ ๋ฆฌ์์ค โ ์นด์นด์ค ์๋ฒ์ ์ ์ฅ๋์ด์๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ปํ๋ค |
Resource Owner(๋ฆฌ์์ค ์์ ์) | ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ ๊ทผํ๊ฑฐ๋ ํต์ ํ ์ ์๋ ์ฃผ์ฒด โ ์๋น์ค๋ฅผ ์ด์ฉํ๊ณ ์ํ๋ ์ฌ์ฉ์๋ฅผ ๋ปํ๋ค |
Client(ํด๋ผ์ด์ธํธ) | OAuth ์ธ์ฆ ์์ฒญ์ ๋ณด๋ด๋ HTTP ํด๋ผ์ด์ธํธ โ ์ฐ๋ฆฌ๊ฐ ๊ตฌํํ ์๋น์ค๋ฅผ ๋ปํ๋ค |
Server(์๋ฒ) | OAuth ์ธ์ฆ ์์ฒญ์ ์๋ฝํ๋ HTTP ์๋ฒ โ ์นด์นด์ค ์๋ฒ๋ฅผ ๋ปํ๋ค |
Credentials(์๊ฒฉ ์ฆ๋ช
) | ์ ํ๋ฆฌ์ผ์ด์ ๋๋ ์ฌ์ฉ์ ๊ถํ์ ์ฆ๋ช ํ๋ ์ ๋ณด |
Token(ํ ํฐ) | ์๋ฒ์ ์ํด ๋ฐํ๋๊ณ ํด๋ผ์ด์ธํธ์ ์ํด ์ฌ์ฉ๋๋ ๊ณ ์ ํ ์๋ณ์ |
์ ํต์ ์ธ ํด๋ผ์ด์ธํธ-์๋ฒ ์ธ์ฆ ๋ชจ๋ธ์์๋ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ๋ฆฌ์์ค ์์ ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ฌ ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ๋ฐฉ์์ด ์ฌ์ฉ๋์๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ ํด๋ผ์ด์ธํธ์ ๋น๋ฐ๋ฒํธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ ํด๋ผ์ด์ธํธ๋ฅผ ์ด๋ฅผ ์ด์ฉํด ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์์ฒญํ๋ค. ์ด ๋ฐฉ์์ ์ฌ๋ฌ ๋ฌธ์ ๊ฐ ์๋ค.
์๋ํํฐ(Third-Party) ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฆฌ์์ค ์์ ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํด์ผ ํ๋ฉฐ ๋๋ถ๋ถ์ด ๊ฒฝ์ฐ ์ด ์ ๋ณด๋ฅผ ํ๋ฌธ์ผ๋ก ์ ์ฅํด ๋ณด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์๋ํํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฆฌ์์ค ์์ ์๋ก๋ถํฐ ์ง๋์น๊ฒ ๋ง์ ์ ๊ทผ ๊ถํ์ ๋ถ์ฌ๋ฐ๊ฒ ๋์ด ํ์ ์ด์์ผ๋ก ๋ง์ ๊ถํ์ ํ์ฌํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ํํฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ณด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํด ๋น๋ฐ๋ฒํธ๊ฐ ์ ์ถ๋๋ฉด๊ทธ ๋น๋ฐ๋ฒํธ๋ก ๋ณดํธ๋๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๋ ธ์ถ๋ ์ํ์ด ์๋ค.
์ด๋ฌํ ๋ณด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด OAuth ๊ธฐ์ ์ด ๋์ ๋์๋ค. OAuth๋ ๊ถํ ๋ถ์ฌ ๊ณ์ธต์ ๋์ ํด ํด๋ผ์ด์ธํธ์ ๋ฆฌ์์ค ์์ ์์ ์ญํ ์ ๋ถ๋ฆฌํ๋ค. OAuth๋ฅผ ํตํด ํด๋ผ์ด์ธํธ๋ ๋ฆฌ์์ค ์์ ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๋์ ์ก์ธ์ค ํ ํฐ์ด๋ผ๋ ์ธ์ฆ ์๋จ์ ์ฌ์ฉํ๊ฒ ๋๋ค. ์ก์ธ์ค ํ ํฐ์ ๋ฆฌ์์ค ์์ ์์ ์น์ธ ํ์ ์๋ํํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ๊ธ๋๋ฉฐ ์ด ํ ํฐ์ ํตํด ์๋ํํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ค.
OAuth 2.0 ํ๋กํ ์ฝ์ OAuth 1.0๊ณผ ํ์ ํธํ๋์ง ์์ผ๋ฉฐ ๋งค์ฐ ๋ค๋ฅธ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ๊ฐ์ง๊ณ ์๋ค. ์นด์นด์ค๋ฅผ ๋น๋กฏํด ๋๋ถ๋ถ์ ์๋น์ค์์ OAuth 2.0์ ์ง์ํ๋ค. ๋ ๋ฒ์ ๊ฐ์ ๋ช ๊ฐ์ง ์ค์ํ ์ฐจ์ด์ ์ ์ดํด๋ณด๋ฉฐ OAuth 2.0 ํ๋กํ ์ฝ์ ํน์ง์ ์ดํดํ๊ณ ์ ํ๋ค.
OAuth 1.0์ ์์ฒญ๋ง๋ค ์ํธํ๋ ์๋ช ์ ์๊ตฌํ๋ ๋ณต์กํ ๋ฐฉ์์ด์๋ค. ํด๋ผ์ด์ธํธ๋ HMAC-SHA1 ๋๋ RSA-SHA1๊ณผ ๊ฐ์ ์๋ช ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด ๊ฐ ์์ฒญ์ ์ํธํํด์ผ ํ๋ค. ๋ฐ๋ฉด OAuth 2.0์์๋ ์๋ช ์ ์๊ตฌํ์ง ์๊ณ TLS/SSL์ ํตํด ํต์ ๋ณด์์ ๋ณด์ฅํจ์ผ๋ก์จ ์ธ์ฆ ์ ์ฐจ๋ฅผ ๋จ์ํํ๋ค. OAuth 2.0์ ๊ตฌํ๊ณผ ์ฌ์ฉ์ด ํจ์ฌ ๊ฐํธํด์ก๋ค.
Scope ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๋ฉด์ ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค ์๋ฒ์ ์์ฒญํ๋ ๊ถํ์ ์ธ๋ถํํด์ ์ ์ํ ์ ์๋ค. ๋ฆฌ์์ค ์์ ์๊ฐ ์๋ํํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ํ ์ต์ํ์ ๊ถํ๋ง์ ์์ํ ์ ์๋ค. ์ด ๊ธฐ๋ฅ์ ๋ณด์ ์ธก๋ฉด์์ ๋งค์ฐ ์ค์ํ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ์ํ ๊ถํ๋ง ์์ฒญํจ์ผ๋ก์จ ๋ฆฌ์์ค ์์ ์์ ๋ถํ์ํ ๊ถํ ๋ ธ์ถ์ ๋ฐฉ์งํ ์ ์๋ค.
์๋ฒ์ ์ค์ํ ์ญํ ๋ณํ๊ฐ ์์๋ค. Authorization Server(๊ถํ ์๋ฒ)์ Resource Server(๋ฆฌ์์ค ์๋ฒ)์ ์ญํ ์ด ๋ช ํํ๊ฒ ๋ถ๋ฆฌ๋์๋ค. OAuth 1.0์์๋ ์๋ฒ๊ฐ ๋ชจ๋ ์ญํ ์ ๋ด๋นํ๋ค. OAuth 2.0์์๋ ๊ถํ ์๋ฒ๊ฐ ์ฃผ๋ก ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ๋ฅผ ๋ด๋นํ๋ฉฐ ๋ฆฌ์์ค ์์ ์์ ์ธ์ฆ ์ ๋ณด์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๊ฒ์ฆํ ํ ๊ทธ ์์ฒญ์ ๋ง๋ ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธํ๋ค. ๋ํ ๋ฆฌ์์ค ์๋ฒ๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ ์ก์ธ์ค ํ ํฐ์ ์ ํจ์ฑ์ ํ์ธํ๊ณ ์ ํจํ ํ ํฐ์ด๋ผ๋ฉด ์์ฒญ๋ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํ๊ฒ ๋๋ค. ์ด๋ฅผ ํตํด ๋ณด์, ํ์ฅ์ฑ, ์ ์ฐ์ฑ์ ๋์์ผ๋ฉฐ ๋ค์ํ ํด๋ผ์ด์ธํธ ๋ฐ ์๋น์ค ํ๊ฒฝ์ ๋ ๋์ ์ธ์ฆ/์ธ๊ฐ ๊ฒฝํ์ ์ ๊ณตํ ์ ์๊ฒ ํ๋ค.
์ก์ธ์ค, ๋ฆฌํ๋ ์ ํ ํฐ ๊ฐ๋ ์ ๋ง์ด ๋ค์ด๋ดค์ ๊ฒ์ด๋ค. OAuth๋ก๋ถํฐ ํ์๋ ๊ฐ๋ ์ด๋ค. ์ก์ธ์ค ํ ํฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์์ค์ ์ ๊ทผํ ์ ์๋ ์ธ์ฆ ์๋จ์ด๋ค. ํด๋ผ์ด์ธํธ๊ฐ ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ค๋ฉด ์ด ํ ํฐ์ ์ฌ์ฉํด ์ธ์ฆ์ ๋ฐ์์ผ ํ๋ค. OAuth 1.0์์๋ ์ฃผ๋ก ์ก์ธ์ค ํ ํฐ์ ๊ธด ์๊ฐ ๋์ ์ฌ์ฉํ๊ฑฐ๋ ๊ฐฑ์ ์์ด ์ฌ์ฌ์ฉํ๋ค. OAuth 2.0๋ถํฐ๋ ๋ฆฌํ๋ ์ ํ ํฐ ๊ฐ๋ ์ด ๋์ ๋๋ฉด์ ์ก์ธ์ค ํ ํฐ์ ๋ง๋ฃ ์๊ฐ์ ์งง๊ฒ ์ค์ ํ๊ณ ์๊ฐ์ด ๋ง๋ฃ๋๋ฉด ๋ฆฌํ๋ ์ ํ ํฐ์ ํตํด ์๋ก์ด ์ก์ธ์ค ํ ํฐ์ ๋ฐ์ ์ ์๊ฒ ํ๋ค.
OAuth 2.0์ OAuth 1.0์ ๋นํด ๋ ์ ์ฐํ๊ณ ๋ค์ํ ์ฌ์ฉ ํ๊ฒฝ์ ์ ์ฉ๋ ์ ์๋๋ก ๋ง์ ๊ฐ์ ์ด ์ด๋ฃจ์ด์ก๋ค. OAuth 1.0์์๋ ํ ๊ฐ์ง ๋ฐฉ์์ ๊ถํ ๋ถ์ฌ๋ง ์ง์ํ๋ค. ๋ชจ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋์ผํ ๋ฐฉ์์ผ๋ก ๊ถํ์ ์์ฒญํ๊ณ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ๋ฐฉ์์ด์๊ธฐ ๋๋ฌธ์ ์ํฉ์ ๋ง๋ ์ต์ ํ๋ ๊ถํ ์์ฒญ ๋ฐฉ์์ ์ ํํ ์ ์์๋ค. OAuth 2.0์์๋ Authorization Code, Implicit, Resource Owner Password Credentials, Client Credentials๋ผ๋ ๊ถํ ๋ถ์ฌ ๋ฐฉ์์ ๋์ ํด ๋ค์ํ ์๋๋ฆฌ์ค์ ๋ง๋ ๊ถํ ๋ถ์ฌ๊ฐ ๊ฐ๋ฅํด์ง๋๋ก ํ๋ค.

A. ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค ์์ ์์๊ฒ ๊ถํ์ ์์ฒญํ๋ค.
B. ํด๋ผ์ด์ธํธ๋ ๊ถํ ๋ถ์ฌ๋ฅผ ๋ฐ๋๋ค. ๊ถํ ๋ถ์ฌ๋ ๋ฆฌ์์ค ์์ ์์ ๊ถํ์ ๋ํ๋ด๋ ์๊ฒฉ ์ฆ๋ช
์ผ๋ก 4๊ฐ์ง์ ๊ถํ ๋ถ์ฌ ์ ํ์ด ์์ง๋ง ์ด๋ ํด๋ผ์ด์ธํธ๊ฐ ๊ถํ์ ์์ฒญํ๋ ๋ฐฉ์๊ณผ ๊ถํ ์๋ฒ์์ ์ง์ํ๋ ์ ํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
C. ํด๋ผ์ด์ธํธ๋ ์ธ์ฆ ์๋ฒ์ ์ธ์ฆ์ ํ๊ณ ๊ถํ ๋ถ์ฌ๋ฅผ ์ ์ถํ์ฌ ์ก์ธ์ค ํ ํฐ์ ์์ฒญํ๋ค.
D. ๊ถํ ์๋ฒ๋ ํด๋ผ์ด์ธํธ๋ฅผ ์ธ์ฆํ๊ณ ๊ถํ ๋ถ์ฌ๋ฅผ ๊ฒ์ฆํ ํ ์ ํจํ๋ฉด ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธํ๋ค.
E. ํด๋ผ์ด์ธํธ๋ ๋ฆฌ์์ค ์๋ฒ์ ๋ณดํธ๋ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๊ณ ์ก์ธ์ค ํ ํฐ์ ์ ์ํ์ฌ ์ธ์ฆ์ ์งํํ๋ค.
F. ๋ฆฌ์์ค ์๋ฒ๋ ์ก์ธ์ค ํ ํฐ์ ๊ฒ์ฆํ๊ณ ์ ํจํ๋ฉด ์์ฒญํ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํ๋ค.
Kakao Developers ๋ฌธ์๊ฐ ์น์ ํ๊ณ ๊ผผ๊ผผํ๊ฒ ์์ฑ๋์ด ์์ด ์ดํดํ๊ธฐ ์ฝ๋ค.

์ฌ์ฉ์ ํด๋ผ์ด์ธํธ์์ ์ฌ์ฉ์๊ฐ ์นด์นด์ค ๋ก๊ทธ์ธ ๋ฒํผ์ ์ ํํ๋ฉด, ์๋น์ค๋ ์นด์นด์ค API ํ๋ซํผ ์๋ฒ๋ก ์ธ๊ฐ ์ฝ๋ ๋ฐ๊ธ์ ์์ฒญํฉ๋๋ค. ์ธ๊ฐ ์ฝ๋๋ ์๊ฒฉ ์ฆ๋ช
์ ํด๋นํ๋ค.
// ์์ฒญ ์์
https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}
์นด์นด์ค API ํ๋ซํผ ์๋ฒ๋ ์ฌ์ฉ์์๊ฒ ์ธ์ฆ์ ์์ฒญํ๊ณ ์ฑ๊ณต ์ ์ฌ์ฉ์์๊ฒ ๋์ ํ๋ฉด์ผ๋ก ์ธ๊ฐ๋ฅผ ์์ฒญํ๋ค. ์ฌ์ฉ์๋ ID/PW๋ฅผ ์ ๊ณตํด ๋ฆฌ์์ค ์์ ์์์ ์ธ์ฆํ๊ณ ๋์ ํ๋ฉด์ ํตํด ์๋น์ค์ ๊ถํ์ ์ธ๊ฐํ๋ค.
์ธ๊ฐ ์๋ฃ ํ ์นด์นด์ค API ํ๋ซํผ ์๋ฒ๋ ์ธ๊ฐ ์ฝ๋๋ฅผ ํฌํจํ Redirect URI๋ก ์ฌ์ฉ์๋ฅผ ๋ฆฌ๋ค์ด๋ ํธ ํ๋ค.
// ์๋ต ์์
HTTP/1.1 302 Found
Content-Length: 0
Location: ${REDIRECT_URI}?code=${AUTHORIZE_CODE}
์๋น์ค๊ฐ Redirect URI์ ํฌํจ๋ ์ธ๊ฐ ์ฝ๋๋ก ํ ํฐ ๋ฐ๊ธ์ ์์ฒญํ๋ฉด ์นด์นด์ค API ํ๋ซํผ์ ์ฌ์ฉ์์ ์๋น์ค ์ฑ์ย ์ฐ๊ฒฐํ๊ณ ์๋น์ค์ ์ฌ์ฉ์์ ํ ํฐ์ ๋ฐ๊ธํฉ๋๋ค.
// ์์ฒญ ์์
curl -v -X POST "https://kauth.kakao.com/oauth/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code" \
-d "client_id=${REST_API_KEY}" \
--data-urlencode "redirect_uri=${REDIRECT_URI}" \
-d "code=${AUTHORIZE_CODE}"
// ์๋ต ์์
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
"token_type":"bearer",
"access_token":"${ACCESS_TOKEN}",
"expires_in":43199,
"refresh_token":"${REFRESH_TOKEN}",
"refresh_token_expires_in":5184000,
"scope":"account_email profile"
}
์๋น์ค๊ฐ ๋ฐ๊ธ๋ฐ์ ์ฌ์ฉ์์ย ํ ํฐ์ผ๋ก ์ฌ์ฉ์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ API๋ฅผ ์์ฒญํ๋ฉด, ์นด์นด์ค API ํ๋ซํผ ์๋ฒ์์ ํด๋น ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์๋ตํฉ๋๋ค.
// ์์ฒญ ์์
curl -v -G GET "https://kapi.kakao.com/v2/user/me" \
-H "Authorization: Bearer ${ACCESS_TOKEN}"
// ์๋ต ์์
HTTP/1.1 200 OK
{
"id":123456789,
"connected_at": "2022-04-11T01:45:28Z",
"kakao_account": {
"profile_nickname_needs_agreement": false,
"profile": {
"nickname": "ํ๊ธธ๋"
}
},
"properties":{
"${CUSTOM_PROPERTY_KEY}": "${CUSTOM_PROPERTY_VALUE}",
...
}
}
1 - 3๋ฒ๊น์ง๋ ํ๋ก ํธ์์ 4 - 5๋ฒ๊น์ง๋ ๋ฐฑ์๋์์ ๊ตฌํํ๋ค. ์ฌ์ฉ์์ ์ํตํด์ ๋ฆฌ์์ค ์์ ์์์ ์ธ์ฆํ๊ณ ๊ถํ์ ์ธ๊ฐํ๋ ๊ณผ์ ์ ํ๋ก ํธ์์ ์งํํ๊ณ ์ดํ ํ ํฐ์ผ๋ก ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ฐฑ์๋์์ ๊ตฌํํ๋ค. ํ ํฐ์ผ๋ก ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๋ถ๋ถ๊น์ง ๋ชจ๋ ํ๋ก ํธ์์ ๊ตฌํํด๋ ๋์ง ์์๊น?๋ผ๋ ์๋ฌธ์ด ์์๋ค. ํ์ง๋ง ์ธ์ฆ ์๋ฒ์์ ํ ํฐ์ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์ ๋ฌํ๋ ๊ณผ์ ์์ ๋ฐ์ดํฐ๊ฐ ๊ณง๋ฐ๋ก ๋ ธ์ถ๋ ์ ์๋ค๋ ์ํ์ด ์๋ค. ์ด๋ฌํ ๋ณด์ ์ฌ๊ณ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํ๋ก ํธ์ ๋ฐฑ์๋์ ๊ตฌํ์ ๋๋ด๋ค.
์์์ OAuth 2.0์ ํน์ง์ ์ค๋ช ํ๋ฉฐ ๊ถํ ์์ฒญ ๋ฐฉ์์ ๋ํด ์ค๋ช ํ๋ค. Authorization Code Grant๋ ๊ถํ ์๋ฒ๋ก๋ถํฐ ์ธ๊ฐ ์ฝ๋๋ฅผ ๋จผ์ ๋ฐ๊ณ ์ด ์ฝ๋๋ฅผ ์ด์ฉํด ๊ถํ ์๋ฒ์ ์ง์ ํต์ ํ์ฌ ์ก์ธ์ค ํ ํฐ์ ๊ตํํ๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ๋ ์ฌ์ฉ์๋ฅผ ํตํด ์๋ฒ์ ์ง์ ํต์ ํ๋ฏ๋ก ์๋ฒ ์ธก์์ ์ก์ธ์ค ํ ํฐ์ ์์ ํ๊ฒ ํ๋ํ ์ ์๋ค. ์ด์ ๋น๊ตํ์ฌ Implicit Grant ๋ฐฉ์์ ๊ถํ ์๋ฒ๊ฐ ์ก์ธ์ค ํ ํฐ์ ์ง์ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๋ค. ํด๋ผ์ด์ธํธ๋ ์ด ํ ํฐ์ URL์์ ํ์ฑํด ์ฌ์ฉํ๋ค. ์ด๋ ์ก์ธ์ค ํ ํฐ์ด ๋ธ๋ผ์ฐ์ URL์ ํตํด ์ง์ ์ ๋ฌ๋๋ฏ๋ก ํ ํฐ์ด ์ ์ถ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ํ์ฌ Implicit Grant ๋ฐฉ์์ ๊ถ์ฅ๋์ง ์์ผ๋ฉฐ Authorization Code Grant์ PKCE๋ฅผ ๊ฒฐํฉํ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค. ์นด์นด์ค ๋ก๊ทธ์ธ์์๋ Grant Type์ authorization_code๋ก ๊ณ ์ ํ๋ค.

ํด๋ผ์ด์ธํธ๋ ์ธ๊ฐ ์๋ฒ์ ํ ํฐ์ ์์ฒญํ ๋ ์ฌ์ฉ์ ์ธ์ฆ์ ํ์ํ ๋ค์ํ ์ ๋ณด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ํฌํจํด ์ ์กํ๋ค. ์ด ๊ณผ์ ์์ Redirect URI๊ฐ ๊ฒ์ฆ์์ด ์ ๋ฌ๋ ๊ฒฝ์ฐ ๊ณต๊ฒฉ์๊ฐ ์ด๋ฅผ ์ ์ฉํด ์ ์ฑ ์ฌ์ดํธ๋ก ๋ฆฌ๋ค์ด๋ ์ ๋๋๋ก ํ ์ ์๋ค. ๋ฐ๋ผ์ ์ธ๊ฐ ์๋ฒ๋ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ๋ณ๋ก ๋ช ํํ๊ฒ ํ์ฉ๋ Redirect URI๋ง์ ๋ฑ๋กํ๊ณ ์ธ๊ฐ ์์ฒญ์ ์ฒ ์ ํ ๊ฒ์ฆํด์ผ ํ๋ค. ๋ํ ์์ผ๋ ์นด๋ ํจํด์ ์ฌ์ฉ์ ๋ณด์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ์ ์ต์ํํ์ฌ ๋ณด์์ฑ์ ๊ฐํํด์ผ ํ๋ค. ์นด์นด์ค์์๋ ์นด์นด์ค ๋๋ฒจ๋กํผ์ค์ ๋ฏธ๋ฆฌ ๋ฑ๋ก๋ ๊ฐ๊ณผ ์ผ์นํด์ผ ๊ธฐ๋ฅ์ด ์ ์ ๋์ํ๋ค.

๋ํ OAuth 2.0์์๋ ๋ณด์์ ์ํด Redirect ์ค๋ํฌ์ธํธ์ TLS(Transport Layer Security)๋ฅผ ๊ถ์ฅํ๋ค. TLS๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ๋ ธ์ถ๋ ์ํ์ด ๋งค์ฐ ์ปค์ง๋ฉฐ ํนํ OAuth๋ฅผ ์ฌ์ฉํด ์ฌ์ฉ์ ์ธ์ฆ์ ๋๋ฆฌ ์ํํ๋ ์๋น์ค์์ ๋ณด์ ๋ฌธ์ ๊ฐ ์ฌ๊ฐํด์ง ์ ์๋ค. ์ด์ ์นด์นด์ค๋ ์ธ๊ฐ ์ฝ๋ ๋ฐ ํ ํฐ ๋ฐ๊ธ ์์ฒญ์ ์ฌ์ฉ๋๋ Redirect URI๋ ํน๋ณํ ์ด์ ๊ฐ ์๋ ํ HTTPS๋ฅผ ์ฌ์ฉํ๋๋ก ๊ฐ์ ํ๊ณ ์๋ค.
ํ ํฐ ๋ฐ๊ธฐ์ ํ ํฐ ๊ฐฑ์ ํ๊ธฐ API ์์ฒญ์ ๋ฏธ๋ฆฌ ๋ฐ๊ธ๋ฐ์ Client Secret์ฝ๋๋ฅผ ํ๋ผ๋ฏธํฐ์ ํฌํจํ ๊ฒฝ์ฐ์๋ง ์ฑ๊ณต ์๋ตํ๋๋ก ์ค์ ํ๋ ๋ณด์ ๊ธฐ๋ฅ์ด๋ค. Client ID ์ธ์๋ ์ธ์ฆ ์๋จ์ ํ๋ ๋ ์ถ๊ฐํจ์ผ๋ก์จ ๋ณด์์ ๊ฐํํ๋ค.
์ฑ ํค ์ ์ถ๊ณผ ๊ฐ์ ๋ณด์ ์ฌ๊ณ ์ ๋๋นํด ์นด์นด์ค API ์๋ฒ๊ฐ ๋ฑ๋ก๋ IP ์ฃผ์์ ์์ฒญ๋ง ํ์ฉํ๋๋ก ์ค์ ํ๋ ๊ธฐ๋ฅ์ด๋ค.
CSRF๋ ๊ณต๊ฒฉ์๋ ์ฌ์ฉ์์ ์๋์๋ ๋ฌด๊ดํ๊ฒ ์ ์์ ์ธ ์์ฒญ์ ์๋ฒ์ ๋ณด๋ด๋๋ก ์ ๋ํ๋ ๊ณต๊ฒฉ ๋ฐฉ์์ด๋ค. CSRF ๊ณต๊ฒฉ์ด ํด๋ผ์ด์ธํธ์ Redirect URI๋ฅผ ๋์์ผ๋ก ํ ๊ฒฝ์ฐ ๊ณต๊ฒฉ์๋ ์์ ์ ์ธ์ฆ ์ฝ๋๋ ์ก์ธ์ค ํ ํฐ์ ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ๋๋ก ์ฃผ์ ํ ์ ์๋ค. ์ด๋ ๊ฒ ๋๋ฉด ํด๋ผ์ด์ธํธ๋ ํผํด์๊ฐ ์๋ ๊ณต๊ฒฉ์์ ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ฐ๊ด๋ ์ก์ธ์ค ํ ํฐ์ ์ฌ์ฉํ๊ฒ ๋ ์ํ์ด ์๋ค.
state ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด CSRF ๊ณต๊ฒฉ์ ๋ฐฉ์งํ ์ ์๋ค. ๋ก๊ทธ์ธ์ ์๋ํ๋ ๊ฐ ์ฌ์ฉ์์ ๋ก๊ทธ์ธ ์์ฒญ์ ๋ํ state ๊ฐ์ ์ค๋ณต๋์ง ์๋ ๊ณ ์ ํ ๋์๋ก ์ค์ ํ๊ณ , Redirect URI์ ์ ๋ฌ๋ ๊ฐ๊ณผ ์ผ์นํ๋์ง ๊ฒ์ฆํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ค.
๐ย OpenID Connect ๊ฐ๋ ์ถ๊ฐ ๊ณต๋ถ ์์
์ฐธ๊ณ
The OAuth 2.0 Authorization Framework
OAuth 2.0 ๊ฐ๋ ๊ณผ ๋์์๋ฆฌ
Kakao Developers
Spring Security
์ธ์ ๊น์ง ์์ฑ ์์ ์ธ๊ฐ์ฅ ๐