๋ชฉ์ฐจ
- ๋ชฉ์ฐจ
- OAuth
- OAuth 1.0
- Request Token
- Direct & User Authorization
- OAuth 2.0
- ์ถ๊ฐ ๊ณต๋ถ ์๋ฃ
- References
OAuth
OAuth๋ ์ธ์ฆ์ ์ํ ์คํ ์คํ ๋๋ ํ๋กํ ์ฝ์ ์๋ฏธํ๋ค.
- OpenID : Authentication์ธ์ฆ์ด ์ฃผ์ ๋ชฉ์
- OAuth : Authorizationํ๊ฐ๊ฐ ์ฃผ์ ๋ชฉ์
ํน์ API๋ฅผ ํธ์ถํ ์ ์๋ ๊ถํ์ด ์๋ ์ฌ์ฉ์์ธ์ง ํ์ธํ๋ ๊ฒ์. ๊ฐ๋ น ํ์ด์ค๋ถ์์ ๊น๋๋ฑ์ด๋ผ๋ ์ฌ๋์ ๋ด๋ฒผ๋ฝ์ ๊ธ์ ์ธ ๊ถํ์ด ํด๋น ์ฌ์ฉ์์๊ฒ ์กด์ฌํ๋๊ฐ์ ์ฌ๋ถ๋ฅผ ํ์ ํ๋ ๊ฒ์ด๋ค.
OAuth 1.0
OAuth Dance
OAuth๋ฅผ ์ด์ฉํ์ฌ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ๋ ๊ณผ์ ์ OAuth Dance๋ผ๊ณ ํ๋ค. ์ง์ง ์ถค์ ์ถ๋ฏ์ด ๋ ๋ช ์ด ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ณผ์ ์ ์ฌ๋ฏธ์๊ฒ ๋ช ๋ช ํ ๊ฒ์ด๋ค.
- Consumer๊ฐ Request Token์ Requestํฉ๋๋ค.
- Service Provider๊ฐ Request Token์ ๋ถ์ฌ(Grant) ํด์ฃผ๊ณ , token ๊ด๋ จ๋ ์ ๋ณด๋ค์ Response๋ก ๋๊ฒจ์ค๋๋ค.
- Consumer๊ฐ Access Token์ ์์ฒญํฉ๋๋ค.
- Service Provider๊ฐ Access Token์ ๋ถ์ฌํฉ๋๋ค.
- Consumer๋ ์ด์ Protected Resources์ ์ ๊ทผ ๊ฐ๋ฅํด์ง๋๋ค.
์์ ๊ณผ์ ์์ ์ฃผ๊ณ ๋ฐ๋ Token๋ค์ ๋งค๊ฐ๋ณ์์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
Request Token
Consumer -> Service Provider
Consumer๊ฐ Service Provider์๊ฒ Request Token์ ์์ฒญํ ๋ ์ฌ์ฉ๋๋ ๋งค๊ฐ๋ณ์ (์์ ํ ์ฐธ์กฐ)
- oauth_consumer_key : Consumer๋ฅผ ๊ตฌ๋ณํ๋ ๊ณ ์ ํ ๊ฐ.
- oauth_signature_method : oauth_signature๋ฅผ ์ํธํํ๋ ๋ฐฉ๋ฒ. HMAC-SHA1, HMAC-MD5 ๋ฑ์ ์ฌ์ฉํ ์ ์๋ค.
- oauth_signature : ์๋ช ๊ฐ. OAuth ์ธ์ฆ ์ ๋ณด๋ฅผ ์ํธํํ๊ณ ์ธ์ฝ๋ฉํ์ฌ ๋ง๋ ๋ค. ์ธ์ฆ ์ ๋ณด๋ ๋งค๊ฐ๋ณ์ ์ค์์ oauth_signature๋ฅผ ์ ์ธํ ๋๋จธ์ง ๋งค๊ฐ๋ณ์์ HTTP ์์ฒญ ๋ฐฉ์์ ๋ฌธ์์ด๋ก ์กฐํฉํ ๊ฐ์ด๋ค.
- oauth_timestamp : ์์ฒญ์ ์์ฑํ ์์ ์ ํ์์คํฌํ. 1970-01-01 00:00:00 ์ดํ์ ์๊ฐ์ ์ด๋ก ํ์ฐํ ์ด ๋จ์์ ๋์ ์๊ฐ
- oauth_nonce : Consumer์์ ์์๋ก ์์ฑํ ๋ฌธ์์ด. timestamp์ ๊ฐ์ด ๊ฐ์ ์์ฒญ์์๋ ์ ์ผํ ๊ฐ์ด์ด์ผ ํ๋ค. (์ ์์ ์ธ ๋ชฉ์ ์ผ๋ก ๊ณ์ ์์ฒญ์ ๋ณด๋ด๋ ๊ฑธ ๋ง๊ธฐ ์ํด์๋ผ๋๋ฐ, ์ด๊ฒ Consumer์ ๊ณ ์ ๊ฐ์ผ๋ก์ Service Provider๊ฐ ๋ถ๋ณํ ์ ์๋๋ก ํด์ฃผ๊ฑฐ๋ ํ๋๋ฏ? ํน์ ํ Consumer๋ 1์ด์ 1๊ฐ์ ์์ฒญ๋ง ๋ณด๋ผ ์ ์๋ค๊ฑฐ๋?)
- oauth_version (optional) : 1.0a๋ 1.0์ด๋ผ๊ณ ๋ช ์ํด์ฃผ๋ฉด ๋๋ค.
- oauth_callback : ์ธ์ฆ์ ์๋ฃํ ํ ๋ฆฌ๋ค์ด๋ ํธํ ์น ์ฃผ์. (callback์ ๋ฐ์์ returnํด์ฃผ๋ฉด redirect๋๋๊น.) ๋ง์ฝ ๋ฆฌ๋ค์ด๋ ํธํ ์ฃผ์๊ฐ ์๋ค๋ฉด oob(Out Of Band)๋ฅผ ๋ณด๋ธ๋ค๊ณ ํ๋ค.
oauth_signature
๋น์ฐํ Consumer์ Service Provider๋ ๊ฐ์ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. oauth_signature๋ฅผ ๋ง๋๋ ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-
(oauth_signatrue๋ฅผ ์ ์ธํ๊ณ , oauth_๋ก ์์ํ๋) ์์ฒญ ๋งค๊ฐ๋ณ์๋ฅผ ๋ชจ๋ ๋ชจ์๋ค. POST body์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉด ์ด ๋งค๊ฐ๋ณ์๋ ๋ชจ์๋ค.
-
๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ทํํ๋ค.
- ๋งค๊ฐ๋ณ์ ์ฌ์ ์ ์ ๋ ฌํ๊ณ ,
- ๊ฐ๊ฐ์ key์ value์ URL ์ธ์ฝ๋ฉ(rfc3986)์ ์ ์ฉํ๋ค. URL ์ธ์ฝ๋ฉ์ ์ค์ํ ๊ฒฐ๊ณผ๋ฅผ = ํํ๋ก ๋์ดํ๊ณ ์ ์ฌ์ด์๋ &์ ๋ฃ๋๋ค.
- ์ด๋ ๊ฒ ๋์จ ๊ฒฐ๊ณผ ์ ์ฒด์ ํ ๋ฒ ๋ URL์ธ์ฝ๋ฉ์ ์ ์ฉํ๋ค.
-
Signature Base String์ ๋ง๋ ๋ค.
- HTTP Method + Consumer๊ฐ ํธ์ถํ URL ์ฃผ์ + ์ ๊ทํํ ๋งค๊ฐ๋ณ์๋ฅผ
&
์ ์ฌ์ฉํด ๊ฒฐํฉํฉ๋๋ค.
- HTTP Method + Consumer๊ฐ ํธ์ถํ URL ์ฃผ์ + ์ ๊ทํํ ๋งค๊ฐ๋ณ์๋ฅผ
-
ํค ์์ฑ
- ์์ ๊ณผ์ ์ ๊ฑฐ์ณ ์์ฑ๋ ๋ฌธ์์ด์ ์ํธํํฉ๋๋ค. ์ํธํํ ๋ Consumer Secret Key(Consumer๊ฐ Service Provider์ ์ฌ์ฉ ๋ฑ๋ก์ ํ ๋ ๋ฐ๊ธ๋ฐ๋ ๊ฐ์ผ๋ก, Consumer๋ฅผ ์๋ณํ๋ ๊ณ ์ ํ ๊ฐ)์ ์ฌ์ฉํ๊ฒ ๋๋ค.
- HMAC-SHA1 ๋ฑ์ ์ํธํ ๋ฐฉ๋ฒ์ ์ด์ฉํ์ฌ ์ต์ข oauth_signature๋ฅผ ์์ฑํ๋ค.
Service Provider -> Consumer
Service Provider๋ Consumer๊ฐ ๋ณด๋ธ Request Token์ Grant(์ธ์ฆ)ํด์ฃผ๊ณ , ๋ค์๊ณผ ๊ฐ์ ์๋ต์ ๋ณด๋ ๋๋ค.
- oauth_token : Consumer๊ฐ Request Token์ผ๋ก ์ฌ์ฉํ ํ ํฐ
- oauth_token_secret : Access Token์ผ๋ก ๊ตํํ๊ธฐ ์ํด Service Provider๊ฐ ์ ๋ฌํด์ค ๊ฐ (Consumer๋ ์ด ๊ฐ์ HTTP ์ธ์ ์ด๋ ์ฟ ํค ๋๋ DBMS ๋ฑ์ ์ ์ฅํด๋์ด์ผ ํฉ๋๋ค.)
- oauth_callback_confirmed
(์๋ฌธ : ๊ทผ๋ฐ ๊ทธ๋ผ Response๋ก ๋์ด์จ oauth_token_secret์.. ํ์น๋ฉด ์๋๋๊ฑด๊ฐ..?)
Direct & User Authorization
Consumer Directs User to Service Provider
- Request : oauth_token(optional)
oauth_token์ ์ด์ฉํด Service Provider๊ฐ ์ ํด๋์ ์ฌ์ฉ์ ์ธ์ฆ ํ์ด์ง๋ฅผ User์๊ฒ ๋ณด์ฌ์ฃผ๊ฒ ๋ฉ๋๋ค. Request Token์ ์์ฒญํ๊ณ ๋ฐํ๋ฐ์๋ oauth_token์ ๋งค๊ฐ ๋ณ์๋ก Service Provider๊ฐ ์ ํด๋ ์ฌ์ฉ์ ์ธ์ฆ ํ์ด์ง๋ฅผ ์ ์ ์๊ฒ ๋ณด์ฌ์ฃผ๊ฒ ๋ฉ๋๋ค.
์ฆ, ๊ฐ๋ น OAuth๋ฅผ ์ ๊ณตํ๋ Service Provider๊ฐ ์ฌ์ฉ์ ์ธ์ฆ ํ์ด์ง๋ฅผ https://auth.com
์ด๋ผ๊ณ ์ ํด๋์๋ค๋ฉด(์ค์ ๋ก๋ Service Provider๋ฅผ Host๋ก, ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋๊ฐ location์ ์ถ๊ฐํด์ ๋๋๊ฐ ํ๋ ๋ฏ), oauth_token์ ๋งค๊ฐ๋ณ์๋ก https://auth.com?oauth_token=goaigjieaWR2z
์๋ฐ ์์ผ๋ก redirect ๋๊ฒ ๋ฉ๋๋ค.
Service Provider Directs User to Consumer
- Request : oauth_token, oauth_verifier
์์์ ์ ๊ฐ ์๋ฌธ์ ๊ฐ์ก๋.. oauth_token_secret๊ณผ oauth_token์ ํ์ทจํ๋ฉด ์๋๋? ํ๋ ๋ฌธ์ ์ ๋ํ ๋ต์ด ๋๊ฒ ๋ค์. ํ์ทจํ๋๋ผ๋ OAuth๋ฅผ ํธ์ถ? ํ๋ ํด๋ผ์ด์ธํธ๊ฐ ์๋๊ธฐ๋๋ฌธ์, redirect ๊ณผ์ ์ ๊ฑฐ์น๋ฉฐ, OAUTH AUTHENTICATION FLOW์์ ๋ฑ์ฅํ๋ Obtain User Authorizaion
์ด ๋ถ๊ฐ๋ฅํ๊ฒ ๋ค์.
๋ค์ ์ฐจ๊ทผ์ฐจ๊ทผ ์์์๋ถํฐ ๋์ด์ผ ์๊ฐํด๋ณด๋ฉด, ํ์ฌ๊น์ง ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์ณ์์ต๋๋ค. ์ฐ๋ฆฌ๋ Service Provider ์ ์ฅ์์ ๊ฐ๋ฐํ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฏ๋ก, Service Provider๋ฅผ ์ฐ๋ฆฌ๋ผ๊ณ ์นญํ๋ฉฐ ์ดํดํด๋ณด๊ฒ ์ต๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ Request Token์ ์์ฒญ. ์ด๋ ๋ณธ์ธ์ ์ ๋ณด(oauth_consumer_key, oauth_timestamp, oauth_callback, โฆ)์ ์ฐ๋ฆฌ์ ์ฝ์ํ key ์ ๋ณด๋ค(oauth_signature_method, oauth_signature)์ ์ฐ๋ฆฌํํ ๋ฉ์ธ์ง์ ๋ฃ์ด ๋ณด๋ด์ค๋๋ค.
- ์ฐ๋ฆฌ๋ ๊ทธ๊ฑธ ์ฝ๊ณ , ์ ํฉํ ์ ๋ณด๊ฐ ๋ณด๋ด์ ธ์๋ค๋ฉด Grant๋ฅผ ํด์ค๋๋ค. ์ฆ, ํด์ฑ๋ ๊ฐ์ด ์ฐ๋ฆฌ๊ฐ ์๊ฐํ๋ ๊ทธ ๊ฐ๊ณผ ๊ฐ์์ง, ์ค๊ฐ์ ์๋ณ์กฐ๋์ง ์์๋์ง๋ฅผ ํ์ ํด์, validํ๋ค๋ฉด Grant๋ฅผ ์ค๋๋ค. ์ด๋ป๊ฒ ์ฃผ๋๋ฉด ์์ผ๋ก Consumer๊ฐ ํ ํฐ์ผ๋ก ์ฌ์ฉํ ๋๋ค(oauth_token, oauth_token_secret)์ ๋ด์์ Responseํด์ค๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ์์ฒญ์ ๋ณด๋๋ ์ ์ ๋ฅผ ์ง์ ์ฐ๋ฆฌ์๊ฒ ๋ณด์ฌ์ค๋๋ค. ์ด๋ป๊ฒ ๋ณด์ฌ์ฃผ๋๋ฉด, ์ฐ๋ฆฌ๊ฐ ์ ์ํ url์ oauth_token์ query๋ก ๋ด๊ณ ์ ์ ๊ฐ ์ด๋์ด๋ค! ํ๋ ๊ฑธ ์ฐ๋ฆฌํํ ๋ณด์ฌ์ฃผ๋ ๊ฒ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ๋ ์ํ, ์ด๋์ด ๊ทธ๋์ด๊ตฌ๋ง, ๊ทธ๋ ๋์ ํ ํฐ ์ด๊ฑฐ๊ตฌ๋~ ํ๊ณ ๋ค์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ ๋ฅผ ๋๋ ค๋ณด๋ ๋๋ค. ์ ์ ์ ์์ oauth_token๊ณผ oauth_verifier๋ฅผ ์ฅ์ด์ค์์. ์ด๋๋ก ๋๋ ค๋ณด๋ด์ฃผ๋๋ฉด, ํด๋ผ์ด์ธํธ ์ธก์์ ์ง์ ํ๋ oauth_callback์ผ๋ก ๋๋ ค๋ณด๋ด์ค๋๋ค. ์ด๋ ์ฅ์ด์ค oauth_token๊ณผ oauth_verifier๋ Access Token์ ์์ฒญํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
Access Token
Access Token๋ง ์๋ค๋ฉด ์ด์ ์ ์ ๋ ํด๋น ํ ํฐ์ ์ถ์ ์ฆ์ผ์ ์ ํ์ด ํ์ฉ๋ ๊ณณ๋ค์ ๋ค๋ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ด์ ์ถ์ ์ฆ์ ๋ฐ์ ์ ์๋๋ก ์ฐ๋ฆฌ์๊ฒ Access Token์ ์์ฒญํฉ๋๋ค. ์ด๋ ๋ฉ์์ง์ ๋ด๊ฒจ ์ฌ ๋งค๊ฐ๋ณ์๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Request
- oauth_consumer_key
- oauth_token
- oauth_signature_method
- oauth_signature
- oauth_timestamp
- oauth_nonce
- oauth_version (optional)
- oauth_verifier
์ฐ๋ฆฌ๋ ์์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๊ณ , ๋ค ์ ํฉํ๋ค๋ฉด Access Token์ ๋ฐ๊ธํด์ค๋๋ค. ์ด๋ Response๋ก ๋์ด๊ฐ๋ ๋งค๊ฐ๋ณ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Response
- oauth_token
- oauth_token_secret : Consumer Secret Key์ oauth_token_secret์ &ํ ๊ฐ์ ์ฌ์ฉํด oauth_token_secret์ ์์ฑํด ์ ๋ฌํด์ค๋๋ค. (์ํธํ ํค๋ฅผ ๋ณ๊ฒฝํ์ฌ ๋ณด์์ ๋ ๊ฐํํ๊ธฐ ์ํจ)
Consumer can access Protected Resources
์ด์ ํด๋ผ์ด์ธํธ๋ ๊ถํ์ด ํ์ํ ์คํ API๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. ๋ฌผ๋ก ํธ์ถํ ๋์ ํด๋ผ์ด์ธํธ ์ธก์์๋ ๋ฐ๊ธ๋ฐ์๋ ์ถ์ ์ฆ์ธ Access Token์ ๋ค๊ณ ๋ค๋ ์ผ๊ฒ ์ฃ ?
Request
- oauth_consumer_key
- oauth_token
- oauth_signature_method
- oauth_signature
- oauth_timestamp
- oauth_nonce
- oauth_version (optional)
OAuth 2.0
๋ผ ๋น ์ ธ๋ผ OAuth 1.0์ ๊ณต๋ถํ๋๋ OAuth 2.0์ด ๋ฑ์ฅํ๋ค์. OAuth 1.0์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ฌ์ฉํ๊ธฐ ๊ณค๋ํ๋ค๋ ๋จ์ ์ด ์๊ณ , ์ ์ฐจ๊ฐ ๋ณต์กํ์ฌ ์๋ฒ ์ธก์๋ ์ฐ์ฐ ๋ถ๋ด์ด ๋ฐ์ํ๋ค๋ ์ ์ ๊ฐ์ ์ํจ OAuth๋ผ๊ณ ํฉ๋๋ค.
OAuth 2.0์ HMAC ์ํธํ ๋์ HTTPS๋ฅผ ์ฌ์ฉํ๊ณ , URL ์ธ์ฝ๋ฉ ๋ฑ์ด ์๋ค๊ณ ํฉ๋๋ค. ๋ํ, Access Token์ Life-time์ ์ง์ ํ ์ ์๋ค๊ณ ํ๋ค์. ํด๋น ๊ฒ์๊ธ์ด 2012๋ ๋ ๊ฒ์๊ธ์ด๋, ์ง๊ธ ์ฐพ์๋ณด๋ฉด ์ด๋ฏธ OAuth 2.0์ด ๋์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ ๊ฒฝ์ฐ์๋ JWT๋ฅผ ๊น๊ฒ ์ดํดํ๊ณ ์ถ์ด OAuth 1.0๋ถํฐ ์ญ ํ์ด๋ณด์๋๋ฐ, ๋ง์ฝ ๋น ๋ฅธ ํ์ฉ์ด ํ์ํ์ ๋ถ๋ค์ด๋ผ๋ฉด OAuth 2.0์ ์ฌ์ฉ๋ฒ๊ณผ ๋์ ํ๋ฆ์ ๊ณต๋ถํ์๋ฉด ๋๊ฒ ์ต๋๋ค.
OAuth 2.0์ ๊ฒฝ์ฐ์๋ Request Token๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , Refresh Token ์ด๋ผ๋ ์ด๋ฆ์ ํ ํฐ + Access Token์ ์ฌ์ฉํฉ๋๋ค. JWT๋ฅผ ๊ณต๋ถํ ๋ ํฌ๋ฏธํ๊ฒ ๋ณด์๋ ๊ธฐ์ต์ด ๋ฉ๋๋ค. (Refresh Token์ Optional์ด๋ผ๋ ๋ง๋ ์๋๋ฐ, ์.. ์์ง์ ์ดํดํ๊ธฐ ์ด๋ ต๋ค์.)
OAuth 2.0์ ์ดํดํ๊ธฐ ์ํด ์ํ์ฝ๋ฉ OAuth 2.0์ ์๊ฐํ์์ต๋๋ค. (1.75๋ฐฐ์์ผ๋ก ๋ค์ผ๋ฉด 1์๊ฐ ์ ๋๋ฉด ์๊ฐ์ด ๊ฐ๋ฅํฉ๋๋ค.)
๊ตฌ๊ธ ํด๋ผ์ฐ๋ ํ๋ซํผ OAuth 2.0 ์ฌ์ฉํด๋ณด๊ธฐ
- Google Calendar API - API ๊ด๋ฆฌ์
- APIs Explorer์์ ๋ช
์ธ๋ฅผ ์ฝ๊ณ ์ฌ์ฉํ๋ค.
- scope : google calendar์ list๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ถ์ ๊ฒฝ์ฐ, ๊ตฌ๊ธ์ - ์บ๋ฆฐ๋์ - List๋ผ๋ Resource์ ๋ํ ํ๊ฐ๋ฅผ ๋ฐ์์ผ ํ๋ค. ์ด๋ฌํ ํ๊ฐ ๋ฒ์๋ฅผ scope์ด๋ผ ํ๋ค.
- ์ฌ์ฉํ๊ธฐ ์ํด์๋ API Key๋ฅผ request์ ํจ๊ป ๋ณด๋ด์ฃผ์ด์ผ ํ๋ค.
๋์ ํ๋ฆ
- ์ฌ์ฉ์๊ฐ ์ฐ๋ฆฌ์ ์๋ฒ(Client)์ ์ ์ํ๋ฉด
- ์ฌ์ฉ์์ ํ๋ฉด์ ์ธ์ฆ์ ์์ฒญํ๋ ํ๋ฉด์ด ๋ฌ๋ค.
- ์ฌ์ฉ์๊ฐ ํ์ธ ๋ฒํผ์ ๋๋ฅด๋ฉด Resource Server๋ก ์ ์ํ๊ฒ ๋๋ค.
- access_type=offline์ผ๋ก ์ค์ ์ ํ๋ฉด refresh token๋ ๊ฐ์ด ๋ณด๋ด์ค๋ค. ์ด๋ฅผ ์ฌ์ฉํด access token์ด ๋ง๋ฃ๋์์ ๋, ๋ค์ access token์ ๋ฐ๊ธ๋ฐ์ ์ ์๋๋ก ํ ์ ์๋ค.
- redirect_url : authorize code๊ฐ์ ํด๋ผ์ด์ธํธ์ ์ด๋ ์ฃผ์๋ก ์ด์ค๊น
- ์ฌ์ฉ์์ ํ๋ฉด์ ํด๋ผ์ด์ธํธ๊ฐ ํ์๋ก ํ๋ scope list๋ฅผ ๋ณด์ฌ์ฃผ๊ณ Resource Server๊ฐ Client์๊ฒ ๋์๋ฅผ ๊ตฌํ๋ค.
- ๋์๋ฅผ ํ๋ฉด, Resource Server๊ฐ Client์๊ฒ Authroize Code๋ฅผ ๋ณด๋ธ๋ค. (๊ฐ๋ น ๊ตฌ๊ธ์ list๋ฅผ ๋ณผ ์ ์๊ฒ ํด์ฃผ๊ฒ ๋ค ํ๋ ๋น๋ฐ๋ฒํธ)
- ํด๋ผ์ด์ธํธ๊ฐ code, client id, client secret์ Resource Server๋ก ๋ณด๋ธ๋ค.
- Resource Server๋ Access Token์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ธ๋ค.
- ํด๋ผ์ด์ธํธ๋ Access Token์ ์ฌ์ฉํด API๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
- refresh token์ ์ต์ด ๋ฐํ ์์๋ง ๋ฐ๊ธ๋ฐ์ ์ ์๋ค. ํด๋น refresh token์ ์ ๋ณด๊ดํ๋ค๊ฐ ์ถํ์ ๊ฐฑ์ ํ ๋์ ์ฌ์ฉํด์ผํจ.
์ถ๊ฐ ๊ณต๋ถ ์๋ฃ
URL ์ธ์ฝ๋ฉ(rfc3986)
rfc3986์ด๋ URI(Uniform Resource Identifier)์ ํ์ค ๋ฌธ๋ฒ์ ์๋ฏธํ๋ค.
์ธํฐ๋ท ์์ ์ ๋ณด ๋ฆฌ์์ค๋ฅผ ๊ณ ์ ํ๊ฒ ์๋ณํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค. ๋ฌธ๋ฒ์ ์ธ๋ถ ๋ด์ฉ์ ์์ ๊ฐ์ต๋๋ค.
- scheme : ๋ฆฌ์์ค์ ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ ํ๋กํ ์ฝ (ex. http:, https:, ftp:, โฆ)
- authority : ํธ์คํธ ์ ๋ณด์ ๋๋ค. ํธ์คํธ์ ๋๋ฉ์ธ + ํฌํธ๋ฒํธ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- path : ๋ฆฌ์์ค์ ์์น๋ฅผ ์๋ฏธํฉ๋๋ค.
- query : ? ๋ค๋ก query๊ฐ ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
- fragment : ์๋ฒ๋ก๋ ๋์ด๊ฐ์ง ์๋ ๋ถ๋ถ์ ๋๋ค. http ๋ด๋ถ ๊ฒ์ ๋ฑ์ ์ฌ์ฉ๋ฉ๋๋ค. (๋ชฉ์ฐจ๋ฅผ ๋๋ฅด๋ฉด ๊ฒ์๊ธ ๋ด๋ถ์ ์ด๋ค ๊ณณ์ผ๋ก ์ด๋ํ๋ ๋ฑ)
URI์ ์ฐฝ์์๊ฐ ๋ง๋ ์ ๊ท์์ ์๋์ ๊ฐ์ต๋๋ค. ์๋์ ์ ๊ท์์ ์ฌ์ฉํด ์๋ URL์ ์ ๋ URL๋ก ํ์ฑํ ์ ์์ต๋๋ค.
URL ์ธ์ฝ๋ฉ์ด๋, ๋ฌธ์๋ ํน์๋ฌธ์๋ฅผ ์น ์๋ฒ์ ๋ธ๋ผ์ฐ์ ์์ ๋ณดํธ์ ์ผ๋ก ํ์ฉ๋๋ ํ์์ผ๋ก ๋ณํ์ํค๋ ๋ฉ์ปค๋์ฆ์ ์๋ฏธํฉ๋๋ค. ASCII ๋ฌธ์ ์งํฉ๋ง์ ์ ์ก ๊ฐ๋ฅํ๋ฏ๋ก, ์์ ํ์ง ์์ ์ธ๋ถ ๋ฌธ์๋ %+16์ง์
ํํ๋ก ๋ณํ์ํต๋๋ค.
H-MAC
H-MAC(Hash-based Message Authentication Code)์ด๋ ๋ฉ์ธ์ง ์๋ณ์กฐ๋ฅผ ๋ง๋ ์ํธํ๊ธฐ๋ฒ ์ค ํ๋์ ๋๋ค.
๊ฐ๋จํ๊ฒ ๋งํด Hash๋ฅผ ์ฌ์ฉํ๋ ์ํธํ ๊ธฐ๋ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๊ฒ ์ต๋๋ค. ๋์์ ๊ฐ๋จํ๊ฒ ์ดํด๋ณด๋ฉด,
- ์์ ์๋ Shared Key(์์ ์์ ์ก์ ์๊ฐ ๋ณ๋ ์ฑ๋๋ก ๊ณต์ ํ๋ ํค)๋ฅผ ์ฌ์ฉํ์ฌ User ID๋ฅผ ํด์ํ๋ค.
- ์๋ณธ User ID์ ๊ทธ ํด์ ๊ฒฐ๊ณผ(HMAC)์ ์ฟผ๋ฆฌ์คํธ๋ง ๊ฐ์ผ๋ก ์ก์ ์์๊ฒ ์ ๋ฌํ๋ค.
- ์์ ์๋ ์ ๋ฌ๋ฐ์ User ID๋ฅผ Shared Key๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด์ํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ(Receiverโs HMAC)์ ๋ง๋ญ๋๋ค.
- Receiverโs HMAC๊ณผ ์ฟผ๋ฆฌ์คํธ๋ง์ผ๋ก ๋ฐ์ HMAC์ด ๊ฐ๋ค๋ฉด, User ID๋ ๋ณ๊ฒฝ๋์ง ์์๋ค๊ณ ์ ๋ขฐํ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ค์ ๋ถ์ด์๋ SHA1์ ๋ฌด์์ ์๋ฏธํ ๊น์? ํด์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก SHA1์ ์ฌ์ฉํ๋ค๋ ์๋ฏธ์ ๋๋ค. SHA๋ Secure Hash Algorithm์ ์ค์๋ง์ธ๋ฐ์. ์์ ๊ธธ์ด์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ 160 bits์ ์ถ๋ ฅ ๋ฐ์ดํฐ๋ก ๋ฐ๊พธ๋ ํด์ฑ ๊ธฐ๋ฒ์ ๋๋ค. ์ ๋ ฅํ ๊ธ์์์ ์๊ด ์์ด ์ผ์ ํ ๊ธธ์ด์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํฉ๋๋ค!
ํด๋น ๊ฒ์๊ธ์ 2013๋ ๋์ ๊ฒ์๊ธ์ ๋ฐํ์ผ๋ก ๊ณต๋ถํ ํฌ์คํ ์ธ ๊น๋ญ์ SHA1์ด ์ฃผ์ ์์๊ฐ ๋์๋๋ฐ, SHA1์ ๊ฒฝ์ฐ์๋ ํ์ฌ๋ ํด๋ ์ ๊ฐ๋ฅ์ฑ๊ณผ ํด์ ์ถฉ๋์ด ๋ฐ์ํ์๊ธฐ ๋๋ฌธ์ ์ฃผ์ ๋ธ๋ผ์ฐ์ ์์๋ ์ง์์ ์ค๋จํ ์ํฉ์ ๋๋ค.
SHA๋ ์ฌ๋ฌ ์๋ฆฌ์ฆ๊ฐ ์๋๋ฐ์. ์ข ์ข ๋ณด์ด๋ SHA-256์ ๊ฒฝ์ฐ์๋ SHA์ 2๋ฒ์งธ ์๋ฆฌ์ฆ, ๊ทธ ์ค ๋ค์ด์ ์คํธ์ ๊ธธ์ด๊ฐ 256byte์ธ ๊ฒ์ SHA-256์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. (๋นํธ์ฝ์ธ์์ ์ฌ์ฉ๋๋ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ด SHA-256์ ๋๋ค.) ๋ค์ด์ ์คํธ(Digest)๋ ํด์ฑ ํจ์๊ฐ ์ ์ฉ๋ ๊ฒฐ๊ณผ๋ฌผ์ ์๋ฏธํฉ๋๋ค.
(Input data๋ message๋ผ ๋ถ๋ฆฌ๊ณ , output์ message digest ํน์ the digest๋ผ๊ณ ๋ถ๋ฆฐ๋ค๊ณ ํฉ๋๋ค.)