์ฐธ๊ณ ํญ๋ชฉ
GitHub App ๋์ OAuth app์ ๋น๋ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
OAuth apps ๋ฐ GitHub Apps ๋ชจ๋ OAuth 2.0์ ์ฌ์ฉํฉ๋๋ค.
GitHub Apps์(๋) OAuth app๊ณผ(์) ์ ์ฌํ๊ฒ ์ฌ์ฉ์๋ฅผ ๋์ ํด ์๋ํ๊ฑฐ๋, ์์ฒด์ ์ผ๋ก ์๋ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์ ์ ๋ ฅ์ด ํ์ํ์ง ์์ ์๋ํ์ ์ ์ฉํฉ๋๋ค. ๋ํ GitHub Apps์(๋) ์ธ๋ถํ๋ ์ฌ์ฉ ๊ถํ์ผ๋ก ์ฌ์ฉ์๊ฐ ์ฑ์ด ์ก์ธ์คํ ์ ์๋ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ ์ ์ ์ดํ ์ ์์ผ๋ฉฐ ์๋ช ์ด ์งง์ ํ ํฐ์ ์ฌ์ฉํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ GitHub ์ฑ๊ณผ OAuth ์ฑ ๊ฐ์ ์ฐจ์ด์ ๋ฐ GitHub ์ฑ ๋ง๋ค๊ธฐ ์ ๋ณด์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
GitHub์ OAuth ๊ตฌํ์ ์น ๋ธ๋ผ์ฐ์ ์ ์ก์ธ์คํ ์ ์๋ ์ฑ์ ํ์ค ๊ถํ ๋ถ์ฌ ์ฝ๋ ๋ถ์ฌ ์ ํ ๋ฐ OAuth 2.0 ๋๋ฐ์ด์ค ๊ถํ ๋ถ์ฌ๋ฅผ ์ง์ํฉ๋๋ค.
์ฑ์ ํ ์คํธํ ๋์ ๊ฐ์ด ํ์ค ๋ฐฉ์์ผ๋ก ์ฑ์ ๋ํ ๊ถํ์ ๊ฑด๋๋ฐ๋ ค๋ฉด ๋น ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๋ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
OAuth app์ ๊ถํ์ ๋ถ์ฌํ๋ ค๋ฉด ์ฑ์ ๊ฐ์ฅ ์ ํฉํ ๊ถํ ๋ถ์ฌ ํ๋ฆ์ ๊ณ ๋ คํ์ธ์.
- ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๋ฆ: ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ ํ์ค OAuth apps์ ๋ํด ์ฌ์ฉ์์๊ฒ ๊ถํ์ ๋ถ์ฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. (์์์ ํ์ฉ ์ ํ์ ์ง์๋์ง ์์ต๋๋ค.)
- ๋๋ฐ์ด์ค ํ๋ฆ: CLI ๋๊ตฌ์ ๊ฐ์ ํค๋๋ฆฌ์ค ์ฑ์ ์ฌ์ฉ๋ฉ๋๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์ ํ๋ฆ
์ฐธ๊ณ ํญ๋ชฉ
GitHub ์ฑ์ ๋น๋ํ๋ ๊ฒฝ์ฐ OAuth ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๋ฆ์ ๊ณ์ ์ฌ์ฉํ ์ ์์ง๋ง ์ค์ ์๋ ๋ช ๊ฐ์ง ์ค์ํ ์ฐจ์ด์ ์ด ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ฌ์ฉ์๋ฅผ ๋์ ํ์ฌ GitHub ์ฑ์ผ๋ก ์ธ์ฆ์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
์ฑ ์ฌ์ฉ์์๊ฒ ๊ถํ์ ๋ถ์ฌํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฌ์ฉ์๋ GitHub ID๋ฅผ ์์ฒญํ๋๋ก ๋ฆฌ๋๋ ์ ๋ฉ๋๋ค.
- GitHub๊ฐ ์ฌ์ฉ์๋ฅผ ์ฌ์ดํธ๋ก ๋ค์ ๋ฆฌ๋๋ ์ ํฉ๋๋ค.
- ์ฑ์ด ์ฌ์ฉ์์ ์ก์ธ์ค ํ ํฐ์ ์ฌ์ฉํ์ฌ API์ ์ก์ธ์คํฉ๋๋ค.
1. ์ฌ์ฉ์์ GitHub ID ์์ฒญ
GET https://github.com/login/oauth/authorize
์ด ๋์ ์ ๋ค์ ์ ๋ ฅ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ฟผ๋ฆฌ ๋งค๊ฐ ๋ณ์ | Type | ํ์ ์ฌ๋ถ | ์ค๋ช |
---|---|---|---|
client_id | string | ํ์ | ๋ฑ๋ก ์ GitHub์์ ๋ฐ์ ํด๋ผ์ด์ธํธ ID์ ๋๋ค. |
redirect_uri | string | ๋งค์ฐ ๊ถ์ฅ | ๊ถํ ๋ถ์ฌ ํ์ ์ฌ์ฉ์๋ฅผ ๋ณด๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์ URL์ ๋๋ค. url ๋ฆฌ๋๋ ์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์๋๋ฅผ ์ฐธ์กฐํ์ธ์. |
login | string | ์ ํ ์ฌํญ | ์ฑ์ ๋ก๊ทธ์ธํ๊ณ ๊ถํ์ ๋ถ์ฌํ๋ ๋ฐ ์ฌ์ฉํ ํน์ ๊ณ์ ์ ์ ์ํฉ๋๋ค. |
scope | string | ์ปจํ ์คํธ ์ข ์ | ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋๋ ๋ฒ์ ๋ชฉ๋ก์
๋๋ค. ์ ๊ณต๋์ง ์์ ๊ฒฝ์ฐ scope ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฒ์์ ๊ถํ์ ๋ถ์ฌํ์ง ์์ ์ฌ์ฉ์์ ๋น ๋ชฉ๋ก์ผ๋ก ๊ธฐ๋ณธ ์ค์ ๋ฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฒ์์ ๊ถํ์ ๋ถ์ฌํ์ง ์์ ์ฌ์ฉ์์ ๊ฒฝ์ฐ ์ฌ์ฉ์์๊ฒ ๋ฒ์ ๋ชฉ๋ก์ด ํฌํจ๋ OAuth ๊ถํ ๋ถ์ฌ ํ์ด์ง๊ฐ ํ์๋์ง ์์ต๋๋ค. ๋์ , ์ด ํ๋ฆ ๋จ๊ณ๋ ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ํด ๊ถํ์ ๋ถ์ฌํ ๋ฒ์ ์งํฉ์ผ๋ก ์๋์ผ๋ก ์๋ฃ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ ์ด๋ฏธ ์น ํ๋ฆ์ ๋ ๋ฒ ์ํํ๊ณ user ๋ฒ์์ ํ ํฐ ํ๋์ repo ๋ฒ์์ ๋ค๋ฅธ ํ ํฐ์ ๊ถํ์ ๋ถ์ฌํ ๊ฒฝ์ฐ, scope ๋ฅผ ์ ๊ณตํ์ง ์๋ ์ธ ๋ฒ์งธ ์น ํ๋ฆ์ user ๋ฐ repo ๋ฒ์์ ํ ํฐ์ ์์ ํฉ๋๋ค. |
state | string | ๋งค์ฐ ๊ถ์ฅ | ์ถ์ธกํ ์ ์๋ ์์ ๋ฌธ์์ด์ ๋๋ค. ๊ต์ฐจ ์ฌ์ดํธ ์์ฒญ ์์กฐ ๊ณต๊ฒฉ์์ ๋ณดํธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. |
code_challenge | string | ๋งค์ฐ ๊ถ์ฅ | PKCE(์ฝ๋ ๊ตํ์ฉ ์ฆ๋ช
ํค)๋ก ์ธ์ฆ ํ๋ฆ์ ๋ณดํธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. code_challenge_method ๊ฐ ํฌํจ๋๋ฉด ํ์์
๋๋ค. ํด๋ผ์ด์ธํธ์์ ์์ฑ๋ ์์ ๋ฌธ์์ด์ 43์ SHA-256 ํด์์ฌ์ผ ํฉ๋๋ค. ์ด ๋ณด์ ํ์ฅ์ ๋ํ ์์ธํ ๋ด์ฉ์ PKCE RFC๋ฅผ ์ฐธ์กฐํ์ธ์. |
code_challenge_method | string | ๋งค์ฐ ๊ถ์ฅ | PKCE(์ฝ๋ ๊ตํ์ฉ ์ฆ๋ช
ํค)๋ก ์ธ์ฆ ํ๋ฆ์ ๋ณดํธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. code_challenge ๊ฐ ํฌํจ๋๋ฉด ํ์์
๋๋ค. S256 ์ด์ด์ผ ํฉ๋๋ค. plain ์ฝ๋ ์ฑ๋ฆฐ์ง ๋ฉ์๋๋ ์ง์๋์ง ์์ต๋๋ค. |
allow_signup | string | ์ ํ ์ฌํญ | ์ธ์ฆ๋์ง ์์ ์ฌ์ฉ์์๊ฒ OAuth ํ๋ฆ ์ค์ GitHub์ ๋ฑ๋กํ๋ ์ต์
์ด ์ ๊ณต๋๋์ง ์ฌ๋ถ์
๋๋ค. ๊ธฐ๋ณธ๊ฐ์ true ์
๋๋ค. ์ ์ฑ
์์ ๋ฑ๋ก์ ๊ธ์งํ ๋ false ๋ฅผ ์ฌ์ฉํฉ๋๋ค. |
prompt | string | ์ ํ ์ฌํญ | select_account ๋ก ์ค์ ๋ ๊ฒฝ์ฐ ๊ณ์ ์ ํ๊ธฐ๋ฅผ ๊ฐ์ ๋ก ํ์ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ HTTP๊ฐ ์๋ ๋ฆฌ๋๋ ์
URI๊ฐ ์๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ ๊ณ์ ์ด ์ฌ๋ฌ ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๊ณ์ ์ ํ๊ธฐ๊ฐ ํ์๋ฉ๋๋ค. |
ํ์ฌ CORS pre-flight ์์ฒญ(OPTIONS)์ ์ง์๋์ง ์์ต๋๋ค.
2. GitHub๊ฐ ์ฌ์ฉ์๋ฅผ ์ฌ์ดํธ๋ก ๋ค์ ๋ฆฌ๋๋ ์
์ฌ์ฉ์๊ฐ ์์ฒญ์ ์๋ฝํ๋ฉด GitHub๋ state
๋งค๊ฐ ๋ณ์์ ์ด์ ๋จ๊ณ์์ ์ ๊ณตํ ์ํ๋ฟ๋ง ์๋๋ผ ์ฝ๋ ๋งค๊ฐ ๋ณ์์ ์์ code
์ ํจ๊ป ์ฌ์ดํธ๋ก ๋ค์ ๋ฆฌ๋๋ ์
ํฉ๋๋ค. ์์ ์ฝ๋๋ 10๋ถ ํ์ ๋ง๋ฃ๋ฉ๋๋ค. ์ํ๊ฐ ์ผ์นํ์ง ์์ผ๋ฉด ํ์ฌ์์ ์์ฒญ์ ๋ง๋ค์์ผ๋ฏ๋ก ํ๋ก์ธ์ค๋ฅผ ์ค๋จํด์ผ ํฉ๋๋ค.
์ด code
๋ฅผ ์ก์ธ์ค ํ ํฐ์ผ๋ก ๊ตํํฉ๋๋ค.
POST https://github.com/login/oauth/access_token
์ด ๋์ ์ ๋ค์ ์ ๋ ฅ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋งค๊ฐ ๋ณ์ ์ด๋ฆ | Type | ํ์ ์ฌ๋ถ | ์ค๋ช |
---|---|---|---|
client_id | string | ํ์ | OAuth app์ ์ฌ์ฉํ๊ธฐ ์ํด GitHub์์ ๋ฐ์ ํด๋ผ์ด์ธํธ ID์ ๋๋ค. |
client_secret | string | Required | OAuth app์ ์ฌ์ฉํ๊ธฐ ์ํด GitHub์์ ๋ฐ์ ํด๋ผ์ด์ธํธ ์ํธ์ ๋๋ค. |
code | string | Required | 1๋จ๊ณ์ ๋ํ ์๋ต์ผ๋ก ๋ฐ์ ์ฝ๋์ ๋๋ค. |
redirect_uri | string | ๋งค์ฐ ๊ถ์ฅ | ๊ถํ ๋ถ์ฌ ํ ์ฌ์ฉ์๊ฐ ์ ์ก๋๋ ์ ํ๋ฆฌ์ผ์ด์
์ URL์
๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ์ฌ code ๊ฐ ๋ฐ๊ธ๋ ๋ ์๋ ์ ๊ณต๋ URI์ ๋์กฐํ์ฌ ์๋น์ค์ ๋ํ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. |
code_verifier | string | ๋งค์ฐ ๊ถ์ฅ | PKCE(์ฝ๋ ๊ตํ์ฉ ์ฆ๋ช
ํค)๋ก ์ธ์ฆ ํ๋ฆ์ ๋ณดํธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฌ์ฉ์ ๊ถํ ๋ถ์ฌ ์ค์ code_challenge ๊ฐ ์ ์ก๋ ๊ฒฝ์ฐ ํ์์
๋๋ค. ๊ถํ ๋ถ์ฌ ์์ฒญ์์ code_challenge ๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ ์๋ ๊ฐ์ด์ด์ผ ํฉ๋๋ค. ์ด ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์ํคํ
์ฒ์ ๋ฐ๋ผ ์ธ์ฆ ์ค์ state ๋งค๊ฐ ๋ณ์์ ํจ๊ป ์ฟ ํค์ ์ ์ฅ๋๊ฑฐ๋ ์ธ์
๋ณ์์ ์ ์ฅํ ์ ์์ต๋๋ค. |
๊ธฐ๋ณธ์ ์ผ๋ก ์๋ต์ ํ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
access_token=gho_16C7e42F292c6912E7710c838347Ae178B4a&scope=repo%2Cgist&token_type=bearer
Accept
ํค๋์ ํ์์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ํ์์ผ๋ก ์๋ต์ ๋ฐ์ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Accept: application/json
๋๋ Accept: application/xml
์
๋๋ค.
Accept: application/json
{
"access_token":"gho_16C7e42F292c6912E7710c838347Ae178B4a",
"scope":"repo,gist",
"token_type":"bearer"
}
Accept: application/xml
<OAuth>
<token_type>bearer</token_type>
<scope>repo,gist</scope>
<access_token>gho_16C7e42F292c6912E7710c838347Ae178B4a</access_token>
</OAuth>
3. ์ก์ธ์ค ํ ํฐ์ ์ฌ์ฉํ์ฌ API์ ์ก์ธ์ค
์ก์ธ์ค ํ ํฐ์ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์๋ฅผ ๋์ ํ์ฌ API์ ์์ฒญํ ์ ์์ต๋๋ค.
Authorization: Bearer OAUTH-TOKEN
GET https://api.github.com/user
์๋ฅผ ๋ค์ด curl์์ ๋ค์๊ณผ ๊ฐ์ด ์ธ์ฆ ํค๋๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
curl -H "Authorization: Bearer OAUTH-TOKEN" https://api.github.com/user
์ก์ธ์ค ํ ํฐ์ ๋ฐ์ ๋๋ง๋ค ํ ํฐ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ID ์ ํจ์ฑ์ ๋ค์ ๊ฒ์ฌํด์ผ ํฉ๋๋ค. ์ฌ์ฉ์๋ ์ฑ์ ๊ถํ์ ๋ถ์ฌํ๊ธฐ ์ํด ๋ก๊ทธ์ธํ ๋ ๋ก๊ทธ์ธํ ๊ณ์ ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ, ๋ก๊ทธ์ธํ ๋๋ง๋ค ์ฌ์ฉ์ ID์ ์ ํจ์ฑ์ ๊ฒ์ฌํ์ง ์์ผ๋ฉด ์ฌ์ฉ์ ๋ฐ์ดํฐ๊ฐ ํผ์ฉ๋ ์ํ์ด ์์ต๋๋ค.
๋๋ฐ์ด์ค ํ๋ฆ
๋๋ฐ์ด์ค ํ๋ฆ์ ์ฌ์ฉํ๋ฉด CLI ๋๊ตฌ ๋๋ Git ์๊ฒฉ ์ฆ๋ช ๊ด๋ฆฌ์์ ๊ฐ์ ํค๋๋ฆฌ์ค ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์์๊ฒ ๊ถํ์ ๋ถ์ฌํ ์ ์์ต๋๋ค.
๋๋ฐ์ด์ค ํ๋ฆ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์๊ฒ ๊ถํ์ ๋ถ์ฌํ๊ณ ์๋ณํ๋ ค๋ฉด ๋จผ์ ์ฑ ์ค์ ์์ ์ฌ์ฉํ๋๋ก ์ค์ ํด์ผ ํฉ๋๋ค. ์ฑ์์ ๋๋ฐ์ด์ค ํ๋ฆ์ ํ์ฑํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์GitHub Apps์ ๋ํ GitHub ์ฑ ๋ฑ๋ก ์์ ๋ฐ OAuth apps์ ๋ํ OAuth ์ฑ ์์ ์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
๋๋ฐ์ด์ค ํ๋ฆ ๊ฐ์
- ์ฑ์ ๋๋ฐ์ด์ค ๋ฐ ์ฌ์ฉ์ ํ์ธ ์ฝ๋๋ฅผ ์์ฒญํ๊ณ ์ฌ์ฉ์๊ฐ ์ฌ์ฉ์ ํ์ธ ์ฝ๋๋ฅผ ์ ๋ ฅํ ๊ถํ ๋ถ์ฌ URL์ ๊ฐ์ ธ์ต๋๋ค.
- ์ฑ์ ์ฌ์ฉ์์๊ฒ
https://github.com/login/device
์ ์ฌ์ฉ์ ํ์ธ ์ฝ๋๋ฅผ ์ ๋ ฅํ๋ผ๋ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค. - ์ฑ์ ์ฌ์ฉ์ ์ธ์ฆ ์ํ๋ฅผ ํด๋งํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋๋ฐ์ด์ค์ ๊ถํ์ ๋ถ์ฌํ๋ฉด ์ฑ์ ์ ์ก์ธ์ค ํ ํฐ์ผ๋ก API ํธ์ถ์ ์ํํ ์ ์์ต๋๋ค.
1๋จ๊ณ: ์ฑ์ด GitHub์์ ๋๋ฐ์ด์ค ๋ฐ ์ฌ์ฉ์ ํ์ธ ์ฝ๋๋ฅผ ์์ฒญํฉ๋๋ค.
POST https://github.com/login/device/code
์ฑ์ ์ฌ์ฉ์์๊ฒ ๋ค์ ๋จ๊ณ์์ ์ธ์ฆํ๋ผ๋ ๋ฉ์์ง๋ฅผ ํ์ํ๋ ๋ฐ ์ฌ์ฉํ ์ฌ์ฉ์ ํ์ธ ์ฝ๋ ๋ฐ ํ์ธ URL์ ์์ฒญํด์ผ ํฉ๋๋ค. ๋ํ ์ด ์์ฒญ์ ์ฑ์ด ์ก์ธ์ค ํ ํฐ์ ์์ ํ๊ณ ์ฌ์ฉ์ ์ธ์ฆ ์ํ๋ฅผ ํ์ธํ๋ ๋ฐ ์ฌ์ฉํด์ผ ํ๋ ๋๋ฐ์ด์ค ํ์ธ ์ฝ๋๋ฅผ ๋ฐํํฉ๋๋ค.
๋์ ์ ๋ค์ ์ ๋ ฅ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋งค๊ฐ ๋ณ์ ์ด๋ฆ | Type | ์ค๋ช |
---|---|---|
client_id | string | ํ์์ ๋๋ค. ์ฑ์ ์ฌ์ฉํ๊ธฐ ์ํด GitHub์์ ๋ฐ์ ํด๋ผ์ด์ธํธ ID์ ๋๋ค. |
scope | string | ์ฑ์ด ์ก์ธ์ค๋ฅผ ์์ฒญํ๋ ๋ฒ์์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ๋ชฉ๋ก์ ๋๋ค. ์์ธํ ๋ด์ฉ์ OAuth ์ฑ์ ๋ํ ๋ฒ์์(๋ฅผ) ์ฐธ์กฐํ์ธ์. |
๊ธฐ๋ณธ์ ์ผ๋ก ์๋ต์ ํ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
device_code=3584d83530557fdd1f46af8289938c8ef79f9dc5&expires_in=900&interval=5&user_code=WDJB-MJHT&verification_uri=https%3A%2F%2Fgithub.com%2Flogin%2Fdevice
๋งค๊ฐ ๋ณ์ ์ด๋ฆ | Type | ์ค๋ช |
---|---|---|
device_code | string | ๋๋ฐ์ด์ค ํ์ธ ์ฝ๋๋ 40์์ด๋ฉฐ ๋๋ฐ์ด์ค๋ฅผ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. |
user_code | string | ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์ฝ๋๋ฅผ ์ ๋ ฅํ ์ ์๋๋ก ์ฌ์ฉ์ ํ์ธ ์ฝ๋๊ฐ ๋๋ฐ์ด์ค์ ํ์๋ฉ๋๋ค. ์ด ์ฝ๋๋ 8์์ด๋ฉฐ ์ค๊ฐ์ ํ์ดํ์ด ์์ต๋๋ค. |
verification_uri | string | ์ฌ์ฉ์๊ฐ user_code ๋ฅผ ์
๋ ฅํด์ผ ํ๋ ํ์ธ URL( https://github.com/login/device )์
๋๋ค. |
expires_in | integer | device_code ๋ฐ user_code ์ ๋ง๋ฃ ์ ์๊ฐ(์ด)์
๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 900์ด(๋๋ 15๋ถ)์
๋๋ค. |
interval | integer | ๋๋ฐ์ด์ค ๊ถํ ๋ถ์ฌ๋ฅผ ์๋ฃํ๋ ค๋ฉด ์ ์ก์ธ์ค ํ ํฐ์ ์์ฒญํ๊ธฐ ์ ์ ๊ฒฝ๊ณผํด์ผ ํ๋ ์ต์ ์๊ฐ(์ด)์
๋๋ค(POST https://github.com/login/oauth/access_token ). ์๋ฅผ ๋ค์ด ๊ฐ๊ฒฉ์ด 5์ด๋ฉด 5์ด๊ฐ ์ง๋์ผ ์๋ก ์์ฒญํ ์ ์์ต๋๋ค. 5์ด ๋์ ๋ ๋ฒ ์ด์ ์์ฒญํ๋ฉด ์๋ ์ ํ์ ๋๋ฌํ๋ฉด์ slow_down ์ค๋ฅ๋ฅผ ์์ ํฉ๋๋ค. |
Accept
ํค๋์ ํ์์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ํ์์ผ๋ก ์๋ต์ ๋ฐ์ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Accept: application/json
๋๋ Accept: application/xml
์
๋๋ค.
Accept: application/json
{
"device_code": "3584d83530557fdd1f46af8289938c8ef79f9dc5",
"user_code": "WDJB-MJHT",
"verification_uri": "https://github.com/login/device",
"expires_in": 900,
"interval": 5
}
Accept: application/xml
<OAuth>
<device_code>3584d83530557fdd1f46af8289938c8ef79f9dc5</device_code>
<user_code>WDJB-MJHT</user_code>
<verification_uri>https://github.com/login/device</verification_uri>
<expires_in>900</expires_in>
<interval>5</interval>
</OAuth>
2๋จ๊ณ: ์ฌ์ฉ์์๊ฒ ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉ์ ์ฝ๋๋ฅผ ์ ๋ ฅํ๋ผ๋ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค.
๋๋ฐ์ด์ค์ ์ฌ์ฉ์ ํ์ธ ์ฝ๋๊ฐ ํ์๋๊ณ https://github.com/login/device
์ ์ฝ๋๋ฅผ ์
๋ ฅํ๋ผ๋ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
3๋จ๊ณ: ์ฑ์ด GitHub๋ฅผ ํด๋งํ์ฌ ์ฌ์ฉ์๊ฐ ๋๋ฐ์ด์ค์ ๊ถํ์ ๋ถ์ฌํ๋์ง ํ์ธํฉ๋๋ค.
POST https://github.com/login/oauth/access_token
๋๋ฐ์ด์ค ๋ฐ ์ฌ์ฉ์ ์ฝ๋๊ฐ ๋ง๋ฃ๋๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ์ ํจํ ์ฌ์ฉ์ ์ฝ๋๋ก ์ฑ์ ๊ถํ์ ์ฑ๊ณต์ ์ผ๋ก ๋ถ์ฌํ ๋๊น์ง ์ฑ์ POST https://github.com/login/oauth/access_token
์ ํด๋งํ๋ ๋๋ฐ์ด์ค ๊ถํ ๋ถ์ฌ ์์ฒญ์ ํฉ๋๋ค. ์ฑ์ด ์๋ ์ ํ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด 1๋จ๊ณ์์ ๊ฒ์๋ ์ต์ ํด๋ง interval
์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ๋๋ฐ์ด์ค ํ๋ฆ์ ๋ํ ์๋ ์ ํ์ ์ฐธ์กฐํ์ธ์.
์ฌ์ฉ์๋ 15๋ถ(๋๋ 900์ด) ์ด๋ด์ ์ ํจํ ์ฝ๋๋ฅผ ์
๋ ฅํด์ผ ํฉ๋๋ค. 15๋ถ์ด ์ง๋๋ฉด POST https://github.com/login/device/code
๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋๋ฐ์ด์ค ๊ถํ ๋ถ์ฌ ์ฝ๋๋ฅผ ์์ฒญํด์ผ ํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ๊ถํ์ ๋ถ์ฌํ๋ฉด ์ฑ์ ์ฌ์ฉ์๋ฅผ ๋์ ํ์ฌ API์ ์์ฒญํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ฒ ๋ฉ๋๋ค.
๋์ ์ ๋ค์ ์ ๋ ฅ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋งค๊ฐ ๋ณ์ ์ด๋ฆ | Type | ์ค๋ช |
---|---|---|
client_id | string | ํ์์ ๋๋ค. OAuth app์ ์ฌ์ฉํ๊ธฐ ์ํด GitHub์์ ๋ฐ์ ํด๋ผ์ด์ธํธ ID์ ๋๋ค. |
device_code | string | ํ์์
๋๋ค. POST https://github.com/login/device/code ์์ฒญ์์ ๋ฐ์ device_code ์
๋๋ค. |
grant_type | string | ํ์์
๋๋ค. ๊ถํ ๋ถ์ฌ ์ ํ์ urn:ietf:params:oauth:grant-type:device_code ์ด์ด์ผ ํฉ๋๋ค. |
๊ธฐ๋ณธ์ ์ผ๋ก ์๋ต์ ํ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
access_token=gho_16C7e42F292c6912E7710c838347Ae178B4a&token_type=bearer&scope=repo%2Cgist
Accept
ํค๋์ ํ์์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ํ์์ผ๋ก ์๋ต์ ๋ฐ์ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Accept: application/json
๋๋ Accept: application/xml
์
๋๋ค.
Accept: application/json
{
"access_token": "gho_16C7e42F292c6912E7710c838347Ae178B4a",
"token_type": "bearer",
"scope": "repo,gist"
}
Accept: application/xml
<OAuth>
<access_token>gho_16C7e42F292c6912E7710c838347Ae178B4a</access_token>
<token_type>bearer</token_type>
<scope>gist,repo</scope>
</OAuth>
๋๋ฐ์ด์ค ํ๋ฆ์ ์๋ ์ ํ
์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ์์ ํ์ธ ์ฝ๋๋ฅผ ์ ์ถํ๋ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋น 1์๊ฐ์ 50๊ฐ์ ์ ์ถ ์๋ ์ ํ์ด ์์ต๋๋ค.
์์ฒญ ๊ฐ์ ํ์ํ ์ต์ ๊ธฐ๊ฐ ๋ด(๋๋ interval
)์ ๋ ์ด์์ ์ก์ธ์ค ํ ํฐ ์์ฒญ(POST https://github.com/login/oauth/access_token
)์ ํ๋ ๊ฒฝ์ฐ ์๋ ์ ํ์ ๋๋ฌํ๊ณ slow_down
์ค๋ฅ ์๋ต์ ์์ ํ๊ฒ ๋ฉ๋๋ค. slow_down
์ค๋ฅ ์๋ต์ ๋ง์ง๋ง interval
์ 5์ด๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ๋๋ฐ์ด์ค ํ๋ฆ์ ์ค๋ฅ ์ฝ๋๋ฅผ ์ฐธ์กฐํ์ธ์.
๋๋ฐ์ด์ค ํ๋ฆ์ ์ค๋ฅ ์ฝ๋
์ค๋ฅ ์ฝ๋ | ์ค๋ช |
---|---|
authorization_pending | ์ด ์ค๋ฅ๋ ๊ถํ ๋ถ์ฌ ์์ฒญ์ด ๋ณด๋ฅ ์ค์ด๊ณ ์ฌ์ฉ์๊ฐ ์ฌ์ฉ์ ์ฝ๋๋ฅผ ์์ง ์
๋ ฅํ์ง ์์ ๊ฒฝ์ฐ์ ๋ฐ์ํฉ๋๋ค. ์ฑ์ ๊ฐ ์์ฒญ ์ฌ์ด์ ์ต์ ์๊ฐ(์ด)์ด ํ์ํ interval ์ ์ด๊ณผํ์ง ์๊ณ POST https://github.com/login/oauth/access_token ์์ฒญ์ ๊ณ์ ํด๋งํ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค. |
slow_down | slow_down ์ค๋ฅ๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ POST https://github.com/login/oauth/access_token ์ ์ฌ์ฉํ์ฌ ์์ฒญ ๊ฐ ํ์ํ ์ต์ interval ๋๋ ๊ธฐ๊ฐ์ 5์ด๊ฐ ๋ ์ถ๊ฐ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์์ ๊ฐ๊ฒฉ์ด ์์ฒญ ์ฌ์ด์ 5์ด ์ด์ ํ์ํ๊ณ slow_down ์ค๋ฅ ์๋ต์ ์์ ํ๋ ๊ฒฝ์ฐ OAuth ์ก์ธ์ค ํ ํฐ์ ์๋ก ์์ฒญํ๊ธฐ ์ ์ ์ต์ 10์ด ๋์ ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค. ์ค๋ฅ ์๋ต์๋ ์ฌ์ฉํด์ผ ํ๋ ์ interval ์ด ํฌํจ๋ฉ๋๋ค. |
expired_token | ๋๋ฐ์ด์ค ์ฝ๋๊ฐ ๋ง๋ฃ๋๋ฉด token_expired ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๋๋ฐ์ด์ค ์ฝ๋๋ฅผ ์๋ก ์์ฒญํด์ผ ํฉ๋๋ค. |
unsupported_grant_type | OAuth ํ ํฐ ์์ฒญ POST https://github.com/login/oauth/access_token ์ ํด๋งํ ๋ ๊ถํ ๋ถ์ฌ ํ์์ urn:ietf:params:oauth:grant-type:device_code ์ด๋ฉฐ ์
๋ ฅ ๋งค๊ฐ ๋ณ์๋ก ํฌํจ๋์ด์ผ ํฉ๋๋ค. |
incorrect_client_credentials | ๋๋ฐ์ด์ค ํ๋ฆ์ ๊ฒฝ์ฐ ์ฑ ์ค์ ํ์ด์ง์์ ์ฐพ์ ์ ์๋ ์ฑ์ ํด๋ผ์ด์ธํธ ID๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค. client_secret ์ ๋๋ฐ์ด์ค ํ๋ฆ์ ํ์ํ์ง ์์ต๋๋ค. |
incorrect_device_code | ์ ๊ณต๋ device_code๋ ์๋ชป๋์์ต๋๋ค. |
access_denied | ๊ถํ ๋ถ์ฌ ํ๋ก์ธ์ค ์ค์ ์ฌ์ฉ์๊ฐ ์ทจ์๋ฅผ ํด๋ฆญํ๋ฉด access_denied ์ค๋ฅ๋ฅผ ์์ ํ๊ฒ ๋๊ณ ์ฌ์ฉ์๋ ํ์ธ ์ฝ๋๋ฅผ ๋ค์ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
device_flow_disabled | ์ฑ ์ค์ ์์ ๋๋ฐ์ด์ค ํ๋ฆ์ ์ฌ์ฉํ๋๋ก ์ค์ ํ์ง ์์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋๋ฐ์ด์ค ํ๋ฆ์ ์ฐธ์กฐํ์ธ์. |
์์ธํ ๋ด์ฉ์ OAuth 2.0 ๋๋ฐ์ด์ค ๊ถํ ๋ถ์ฌ๋ฅผ ์ฐธ์กฐํ์ธ์.
๋น ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๋ฆ
๋น ์น ์ธ์ฆ์ ํ ์คํธ์ ๊ฐ์ ์ ํ๋ ์ํฉ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ํ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ์ธ์ฆ์ ์ฌ์ฉํ์ฌ personal access token์ ์ค์ ํ์ด์ง๋ฅผ ์ฌ์ฉํ์ฌ personal access token์(๋ฅผ) ๋ง๋ค ์ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉ์๋ ์ธ์ ๋ ์ง ์ก์ธ์ค๋ฅผ ์ฒ ํํ ์ ์์ต๋๋ค.
๋ฆฌ๋๋ ์ URL
redirect_uri
๋งค๊ฐ ๋ณ์๋ ์ ํ ์ฌํญ์
๋๋ค. ๋งค๊ฐ ๋ณ์๊ฐ ์ ์ธ๋๋ ๊ฒฝ์ฐ GitHub๋ OAuth app ์ค์ ์ ๊ตฌ์ฑ๋ ์ฝ๋ฐฑ URL๋ก ์ฌ์ฉ์๋ฅผ ๋ฆฌ๋๋ ์
ํฉ๋๋ค. ๋ฐ๋ฉด ๋งค๊ฐ ๋ณ์๊ฐ ์ ๊ณต๋๋ ๊ฒฝ์ฐ ๋ฆฌ๋๋ ์
URL์ ํธ์คํธ(์๋ธ ๋๋ฉ์ธ ์ ์ธ) ๋ฐ ํฌํธ๊ฐ ์ฝ๋ฐฑ URL๊ณผ ์ ํํ ์ผ์นํด์ผ ํฉ๋๋ค. ๋ฆฌ๋๋ ์
URL์ ๊ฒฝ๋ก๋ ์ฝ๋ฐฑ URL์ ํ์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ฐธ์กฐํด์ผ ํฉ๋๋ค.
CALLBACK: http://example.com/path
GOOD: http://example.com/path
GOOD: http://example.com/path/subdir/other
GOOD: http://oauth.example.com/path
GOOD: http://oauth.example.com/path/subdir/other
BAD: http://example.com/bar
BAD: http://example.com/
BAD: http://example.com:8080/path
BAD: http://oauth.example.com:8080/path
BAD: http://example.org
๋ฃจํ๋ฐฑ ๋ฆฌ๋๋ ์ URL
์ ํ์ redirect_uri
๋งค๊ฐ ๋ณ์๋ ๋ฐ์คํฌํฑ ์ปดํจํฐ์์ ์คํ๋๋ ์์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ฉํ ๋ฃจํ๋ฐฑ URL์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ฃจํ๋ฐฑ URL ๋ฐ ํฌํธ๋ฅผ ์ง์ ํ๋ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ถํ์ ๋ถ์ฌํ ํ ์ฌ์ฉ์๋ ์ ๊ณต๋ URL ๋ฐ ํฌํธ๋ก ๋ฆฌ๋๋ ์
๋ฉ๋๋ค. redirect_uri
์ ์ฑ์ ์ฝ๋ฐฑ URL์ ์ง์ ๋ ํฌํธ์ ์ผ์นํ ํ์๊ฐ ์์ต๋๋ค.
http://127.0.0.1/path
์ฝ๋ฐฑ URL์ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์
์ด 1234
ํฌํธ์์ ์์ ๋๊ธฐ ์ค์ด๋ฉด ํด๋น redirect_uri
์(๋ฅผ) ์ฌ์ฉํ ์ ์์ต๋๋ค.
http://127.0.0.1:1234/path
OAuth RFC๋ ๋ฃจํ๋ฐฑ ๋ฆฌํฐ๋ด 127.0.0.1
๋๋ IPv6 ::1
์ ์ฌ์ฉํ๊ณ localhost
๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
OAuth apps์ฉ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ํ ํฐ ๋ง๋ค๊ธฐ
์ฌ์ฉ์/์ ํ๋ฆฌ์ผ์ด์ /๋ฒ์ ์กฐํฉ์ ์ฌ๋ฌ ํ ํฐ์ ๋ง๋ค์ด ํน์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ํ ํ ํฐ์ ๋ง๋ค ์ ์์ต๋๋ค.
์ด๋ OAuth app์ด(๊ฐ) ๋ก๊ทธ์ธ์ GitHub๋ฅผ ์ฌ์ฉํ๊ณ ๊ธฐ๋ณธ ์ฌ์ฉ์ ์ ๋ณด๋ง ํ์ํ ๋จ์ผ ์ํฌํ๋ก๋ฅผ ์ง์ํ๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค. ๋ค๋ฅธ ์ํฌํ๋ก์์๋ ์ฌ์ฉ์์ ํ๋ผ์ด๋น ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ก์ธ์คํด์ผ ํ ์ ์์ต๋๋ค. OAuth app์(๋) ์ฌ๋ฌ ํ ํฐ์ ์ฌ์ฉํด ํ์ํ ๋ฒ์๋ง ์์ฒญํ์ฌ ์ฌ์ฉ ์ฌ๋ก๋ง๋ค ์น ํ๋ฆ์ ์ํํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธํ๋ ๊ฒฝ์ฐ OAuth app์ ํ๋ผ์ด๋น ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ํ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ ํ์๊ฐ ์์ต๋๋ค.
์ฌ์ฉ์/์ ํ๋ฆฌ์ผ์ด์ /๋ฒ์ ์กฐํฉ๋ณ๋ก ๋ฐ๊ธ๋๋ ํ ํฐ์ 10๊ฐ๋ก ์ ํ๋๋ฉฐ, ์๊ฐ๋น ๋ง๋ค์ด์ง๋ ํธ๋ํฝ๋ฅ ์ ํ์ 10๊ฐ์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์ผํ ์ฌ์ฉ์ ๋ฐ ๋์ผํ ๋ฒ์์ ๋ํด 10๊ฐ ์ด์์ ํ ํฐ์ ๋ง๋๋ ๊ฒฝ์ฐ ๋์ผํ ์ฌ์ฉ์/์ ํ๋ฆฌ์ผ์ด์ /๋ฒ์ ์กฐํฉ์์ ๊ฐ์ฅ ์ค๋๋ ํ ํฐ์ด ์ฒ ํ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์๊ฐ๋น ํธ๋ํฝ๋ฅ ์ ํ์ ๋๋ฌํ๋ฉด ๊ฐ์ฅ ์ค๋๋ ํ ํฐ์ด ์ฒ ํ๋์ง ์์ต๋๋ค. ๋์ ๋ธ๋ผ์ฐ์ ๋ด์์ ๋ค์ ๊ถํ ๋ถ์ฌ ํ๋กฌํํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ฌ ์ฌ์ฉ์์๊ฒ ์ฑ์ ๋ถ์ฌํ๋ ๊ถํ์ ์ฌํ์ธํ๋๋ก ์์ฒญํฉ๋๋ค. ์ฑ์ด 1์๊ฐ ์ด๋ด์ ์ฌ์ฉ์๋ก๋ถํฐ 10๊ฐ์ ํ ํฐ์ ์์ฒญํ ์ด์ ๊ฐ ๊ฑฐ์ ์๊ฑฐ๋ ์ ํ ์๋ ๋งํผ, ์ด ํ๋กฌํํธ๋ ์ฑ ์๋ ์ค๋จ์ ์์ธ์ด ๋๋ ์ ์ฌ์ ์ธ ๋ฌดํ ๋ฃจํ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
๊ฒฝ๊ณ
OAuth app์์ ๋ชจ๋ ๊ถํ์ ์ทจ์ํ๋ฉด ๋ฐฐํฌ ํค๋ฅผ ํฌํจํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉ์๋ฅผ ๋์ ํ์ฌ ์์ฑํ ๋ชจ๋ SSH ํค๊ฐ ์ญ์ ๋ฉ๋๋ค.
์ฌ์ฉ์์๊ฒ ์ก์ธ์ค ๊ถํ์ ๊ฒํ ํ๋๋ก ์ง์
OAuth app์ ๋ํ ๊ถํ ๋ถ์ฌ ์ ๋ณด์ ์ฐ๊ฒฐํ๋ฉด ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ถํ ๋ถ์ฌ๋ฅผ ๊ฒํ ํ๊ณ ์ฒ ํํ ์ ์์ต๋๋ค.
์ฐ๊ฒฐ ๋งํฌ๋ฅผ ๋น๋ํ๋ ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฑ๋กํ ๋ GitHub์์ ๋ฐ์ OAuth app client_id
๊ฐ ํ์ํฉ๋๋ค.
https://github.com/settings/connections/applications/:client_id
ํ
OAuth app์ด ์ฌ์ฉ์์ ๋ํด ์ก์ธ์คํ ์ ์๋ ๋ฆฌ์์ค์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฌ์ฉ์์ ๋ํ ๋ฆฌ์์ค ๊ฒ์์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
๋ฌธ์ ํด๊ฒฐ
- ๊ถํ ๋ถ์ฌ ์์ฒญ ์ค๋ฅ ๋ฌธ์ ํด๊ฒฐ
- OAuth ์ฑ ์ก์ธ์ค ํ ํฐ ์์ฒญ ์ค๋ฅ ๋ฌธ์ ํด๊ฒฐ
- ๋๋ฐ์ด์ค ํ๋ฆ ์ค๋ฅ
- ํ ํฐ ๋ง๋ฃ ๋ฐ ํด์ง