ํ”„๋กœ์ ํŠธ์— GitHub OAuth ์ ์šฉํ•˜๊ธฐ

December 13, 2022์— ์ž‘์„ฑ ยท January 1, 1970์— ๋ณ€๊ฒฝ๋จ

์ด์ „์— good-first-issue ์ด์Šˆ๊ฐ€ ์กด์žฌํ•˜๋Š” GitHub ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์›น์•ฑ์„ ๋งŒ๋“œ๋Š” ํ† ์ดํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.

์ด ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊นƒํ—™ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ GitHub API๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ํŠนํžˆ GitHub์—์„œ GraphQL๋กœ ์ œ๊ณตํ•˜๋Š” API(๋ ˆํฌ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์ด์Šˆ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋“ฑ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์—ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ GitHub์—์„œ๋Š” GraphQL๋กœ ์ œ๊ณตํ•˜๋Š” API๋Š” ์ผ๋ฐ˜ REST API์™€ ๋‹ฌ๋ฆฌ ์‚ฌ์šฉ์ž ์ธ์ฆ์ด ํ•„์š”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์›น์•ฑ์—์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ํ–ˆ์–ด์•ผ ํ–ˆ๊ณ , OAuth๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค. (์‚ฌ์‹ค GraphQL์„ ์“ฐ์ง€ ์•Š๋”๋ผ๋„ REST API ํ˜ธ์ถœ ์ˆ˜๊ฐ€ 1์‹œ๊ฐ„์— 60๋ฒˆ์ธ๊ฐ€๋กœ ๋„ˆ๋ฌด ์ ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด์ฐŒ ๋๋“  ์ธ์ฆ๊ณผ์ •์ด ํ•„์š”ํ•˜๊ธด ํ–ˆ๋‹ค.)

OAuth?

OAuth๋Š” ์ธ์ฆ์„ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์ธํ„ฐ๋„ท ์„œ๋น„์Šค(์—ฌ๊ธฐ์„  GitHub)์˜ ๊ธฐ๋Šฅ์„ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ ๊ฒƒ์ด๋‹ค.

ํ”„๋กœ์ ํŠธ์—์„œ GitHub OAuth ์ธ์ฆ ๊ณผ์ •

์›น์•ฑ์—์„œ Github์˜ GraphQL API๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด POST ์š”์ฒญ์˜ body์— ๊นƒํ—™์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ token์„ ํฌํ•จํ•ด์„œ ์š”์ฒญํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊นƒํ—™์œผ๋กœ๋ถ€ํ„ฐ token์„ ๋ฐœ๊ธ‰ ๋ฐ›์•„์™€์•ผ ํ•˜๋Š”๋ฐ, ๋ฐœ๊ธ‰ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

  1. ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊นƒํ—™์— ๋กœ๊ทธ์ธํ•œ๋‹ค.
  2. ๋กœ๊ทธ์ธ์ด ์™„๋ฃŒ๋˜๋ฉด ๊นƒํ—™์ด access_token ๋ฐœ๊ธ‰์„ ์œ„ํ•œ code๋ฅผ ๋ฐœ๊ธ‰ํ•ด์ค€๋‹ค. (๋ฆฌ๋””๋ ‰์…˜๋˜๋ฉด์„œ url ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ถ™์–ด์˜จ๋‹ค)
  3. *ํด๋ผ์ด์–ธํŠธ์—์„œ (์ง์ ‘ ์˜ฌ๋ฆฐ)ํ”„๋ก์‹œ ์„œ๋ฒ„์— code๋ฅผ ๋ณด๋‚ด์„œ ํ† ํฐ ๋ฐœ๊ธ‰์„ ์š”์ฒญํ•œ๋‹ค.

*์—ฌ๊ธฐ์„œ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ”๋กœ code ๋กœ ๊นƒํ—™์— access_token์„ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ , ์™ธ๋ถ€ ์„œ๋ฒ„๋ฅผ ๊ฑฐ์น˜๋Š” ์ด์œ ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ Same-Origin Policy(๋ณด์•ˆ์„ ์œ„ํ•ด ํ”„๋กœํ† ์ฝœ, ํฌํŠธ, ๋„๋ฉ”์ธ์ด ๊ฐ™์€ ์„œ๋ฒ„๋กœ๋งŒ ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์ •์ฑ…)๋•Œ๋ฌธ์ด๋‹ค.

์ด๊ฑธ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์š”์ฒญ์„ ๋ฐ›๋Š” ์„œ๋ฒ„์—์„œ CORS ์„ค์ •์„ ํ•ด์ค˜์•ผ ํ•˜์ง€๋งŒ GitHub์—์„œ๋Š” access_token๋ฐœ๊ธ‰์— ํ•ด๋‹น ์„ค์ •์„ ํ•ด๋‘์ง„ ์•Š์•„์„œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐ”๋กœ ์š”์ฒญํ•  ์ˆ˜ ์—†๋‹ค.

code๋ฅผ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ ์œ„ํ•ด ๊นƒํ—™์— ๋ณด๋‚ด๋Š” ์š”์ฒญ์€, ํ•ด๋‹น ์š”์ฒญ์˜ ์‘๋‹ต ํ—ค๋”๋ฅผ ๋ณด๋ฉด ๊นƒํ—™์—์„œ access-control-allow-origin: * ๋กœ ์„ค์ •ํ•ด์„œ ๋‚ด๋ ค์ฃผ๊ณ  ์žˆ์œผ๋ฏ€๋กœ CORS ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.


  1. ํ”„๋ก์‹œ ์„œ๋ฒ„์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ code์™€ ํ•จ๊ป˜ ๋ฐ›์œผ๋ฉด, client_secret ํ‚ค(๊นƒํ—™์— ์›น์•ฑ์„ ๋“ฑ๋กํ•˜๋ฉด ๋ฐœ๊ธ‰ํ•ด์ค€๋‹ค)์™€ ํ•จ๊ป˜ GitHub์— access_token ๋ฐœ๊ธ‰์„ ์š”์ฒญํ•œ๋‹ค.
  2. GitHub์—์„œ ํ•ด๋‹น ์œ ์ €์˜ access_token ๋ฐœ๊ธ‰์ด ์™„๋ฃŒ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ์— ํ•ด๋‹น ํ† ํฐ์„ ์‘๋‹ต์œผ๋กœ ๋ณด๋‚ธ๋‹ค.
    • ์ด ํ”„๋ก์‹œ ์„œ๋ฒ„๋Š” ๋‚ด๊ฐ€ ์ง์ ‘ ์˜ฌ๋ฆฐ ์„œ๋ฒ„์ด๋ฏ€๋กœ CORS ์„ค์ •์„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ์—์„œ CORS ์—๋Ÿฌ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.
  3. ์ด์ œ ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ์ด ํ† ํฐ์œผ๋กœ GitHub API๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค. (ํ•ด๋‹น ํ† ํฐ์€ ๋ธŒ๋ผ์šฐ์ €์˜ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ)

์—ฌ๋‹ด

๊ทธ๋Ÿฐ๋ฐ ์ •๋ฆฌํ•˜๋ฉด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ™•์ธํ–ˆ๋Š”๋ฐ ํ”„๋ก์‹œ ์„œ๋ฒ„๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์•„์„œ ๋ดค๋”๋‹ˆ... ๊ธฐ์กด์— ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ๋ฌด๋ฃŒ์ธ heroku๋กœ ์˜ฌ๋ ค๋†จ์—ˆ๋Š”๋ฐ, ์˜ฌํ•ด 11์›” 28์ผ๋ถ€ํ„ฐ ํ”„๋ฆฌ ํ‹ฐ์–ด๋ฅผ ์•„์˜ˆ ์—†์• ์„œ ํ”„๋ก์‹œ ์„œ๋ฒ„๊ฐ€ ๊บผ์กŒ๋‹ค.. ๋‹ค๋ฅธ ํ”„๋ฆฌํ‹ฐ์–ด ์†”๋ฃจ์…˜์„ ์ฐพ์•„์„œ ๋‹ค์‹œ ์ ์šฉํ•ด์•ผํ•  ๋“ฏ.

์ฐธ์กฐ