OAuth๋Š” ์–ด๋–ค ์‹œ์Šคํ…œ์—์„œ ๊ทธ ์‹œ์Šคํ…œ์˜ ์‚ฌ์šฉ์ž๋“ค์ด Google, Facebook, KaKao talk๊ณผ ๊ฐ™์€ ์„œ๋น„์Šค์— ์ง์ ‘ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๊ณ ๋„ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ๊ฐ ์„œ๋น„์Šค(Google,Facebook๋“ฑ) ์˜ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜๊ณ  ์‹ถ์€ ์š•๊ตฌ๋กœ ์ธํ•ด ๋“ฑ์žฅํ•œ ๊ฐœ๋…์ด๋‹ค.

์ด ๋•Œ ์‹œ์Šคํ…œ์ด ์‚ฌ์šฉ์ž๋“ค์˜ ์„œ๋น„์Šค ๊ณ„์ •์ •๋ณด๋ฅผ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ ๋˜๊ฒ ์ง€๋งŒ, ๊ทธ๊ฒƒ์€ ๋ณด์•ˆ ์ƒ ๋งค์šฐ ์ทจ์•ฝํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด,

  1. ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ์ฒ˜์Œ ๋ณด๋Š” ์‹œ์Šคํ…œ์— ์ž์‹ ์˜ ์นด์นด์˜ค ๊ณ„์ •์ •๋ณด๋ฅผ ๋งก๊ฒจ์•ผ ๋˜๋Š” ๊ฒƒ์ด๊ณ ,

  2. ์‹œ์Šคํ…œ ์ž…์žฅ์—์„œ๋„ ์‚ฌ์šฉ์ž๋“ค์˜ ์นด์นด์˜ค ๊ณ„์ •์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ๋ถ€๋‹ด์ด๋‹ค.

  3. ์„œ๋น„์Šค ์ž…์žฅ์—์„œ๋„ ์ž์‹ ๋“ค์˜ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” โ€˜์‹œ์Šคํ…œโ€™์—๊ฒŒ ๋งก๊ธฐ๋Š” ๊ฒƒ์€ ๋ง๋„ ์•ˆ๋œ๋‹ค.


๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ์—๊ฒ OAuth๊ฐ€ ํ•„์š”ํ•˜๋‹ค.โ€‹


OAuth์—๋Š” ์•ž์„œ ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž, ์‹œ์Šคํ…œ, ์„œ๋น„์Šค 3๊ฐ€์ง€์˜ ์ฃผ์ฒด๊ฐ€ ์žˆ๊ณ ,

OAuth์—์„œ๋Š” ์ด๋ฅผ ๊ฐ๊ฐ Resource owner(์‚ฌ์šฉ์ž), Client(์‹œ์Šคํ…œ), Resource server(์„œ๋น„์Šค) ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹Œ โ€˜์‹œ์Šคํ…œโ€™ ์ž„์— ์œ ์˜ํ•˜์ž.

1. OAuth ๋“ฑ๋ก

๊ฐ€์žฅ ๋จผ์ € ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋จผ์ € ๋ฆฌ์†Œ์Šค์„œ๋ฒ„๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‚ฌ์ „์— ์Šน์ธ์„ ์–ป์–ด๋‘์–ด์•ผ ํ•œ๋‹ค.

image1

์ด ์„ธ ๊ฐ€์ง€๋ฅผ ๋ฆฌ์†Œ์Šค์„œ๋ฒ„๋Š” ๊ณตํ†ต์ ์œผ๋กœ ๋ฐ›๋Š”๋‹ค.

  1. client id : app ์‹๋ณ„์ž

  2. client secret : ๋น„๋ฐ€๋ฒˆํ˜ธ

  3. authorized redirect url

: ๋ฆฌ์†Œ์Šค์„œ๋ฒ„๊ฐ€ ๊ถŒํ•œ ๋ถ€์—ฌํ•ด์ฃผ๋Š” ๊ณผ์ •์—์„œ authorized code๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๋Š”๋ฐ ๊ทธ๊ฑธ ์ „๋‹ฌ๋ฐ›๊ณ  ์‹ถ์€ ๊ฒฝ๋กœ๋ฅผ ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค. ex) https://onyou.com/callback


2. ๋ฆฌ์†Œ์Šค ์˜ค๋„ˆ์˜ ์Šน์ธ

image2

๊ฐ€๋ น ๋ฆฌ์†Œ์Šค ์˜ค๋„ˆ(์‚ฌ์šฉ์ž) ๊ฐ€ ์•ฑ์—์„œ โ€˜์นด์นด์˜ค๋กœ ๋กœ๊ทธ์ธํ•˜๊ธฐโ€™ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ,

  1. https://kakao-server/?client_id=xxxxyyyy&scope=qqqq&redirect_uri=https://onyou.com/callback

์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฆฌ์†Œ์Šค ์˜ค๋„ˆ๊ฐ€ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์—๊ฒŒ client id, scope, redirect_url๊ฐ€ ํฌํ•จ๋œ url๋กœ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ scope์ด๋ž€ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์˜ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์“ธ ๊ฒƒ์ธ์ง€(ex. sns ๊ธ€์“ฐ๊ธฐ, ๊ตฌ๊ธ€ ์บ˜๋ฆฐ๋” ๋“ฑ) ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

โ€‹

  1. ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„(์นด์นด์˜ค ์„œ๋ฒ„)๋Š” ํ•ด๋‹น ๋ฆฌ์†Œ์Šค ์˜ค๋„ˆ๊ฐ€ ๋กœ๊ทธ์ธ์ด ๋œ ์ƒํƒœ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํ™•์ธ ํ•˜๊ณ , ๋กœ๊ทธ์ธ ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์ด๋ฉด ๋กœ๊ทธ์ธ ํ™”๋ฉด์„ ๋„์›Œ์ค€๋‹ค.

โ€‹

  1. ์นด์นด์˜ค ๋กœ๊ทธ์ธ์ด ์„ฑ๊ณตํ•˜๋ฉด, ๊ทธ์ œ์„œ์•ผ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋Š” url์—์„œ ์š”์ฒญํ•œ client_id๊ฐ’์ด ์กด์žฌํ•˜๋Š” ์ง€๋ฅผ ํ™•์ธํ•˜๊ณ ,

ํ•ด๋‹น client_id๊ฐ’์— ๋Œ€์‘ํ•˜๋Š” redirect url์ด ์ •ํ™•ํžˆ ์š”์ฒญ๋˜์—ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค. ๋‹ค๋ฅด๋ฉด ์—ฌ๊ธฐ์„œ ์ž‘์—…์ด ๋๋‚˜๊ณ ,

๊ฐ™๋‹ค๋ฉด ์–ด๋–ค scope์„ ์–ด๋–ค ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•˜๊ณ  ์žˆ์œผ๋‹ˆ ํ—ˆ์šฉํ•  ๊ฒƒ์ธ์ง€๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌป๋Š”๋‹ค.

  1. ํ—ˆ์šฉํ•˜๊ณ  ๋‚˜๋ฉด ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์–ด๋–ค ํด๋ผ์ด์–ธํŠธ์—์„œ ์–ด๋–ค ๋ฆฌ์†Œ์Šค ์˜ค๋„ˆ๊ฐ€ ์–ด๋–ค scope์„ ํ—ˆ์šฉํ–ˆ๋Š” ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ €์žฅํ•˜๊ณ  ์žˆ๊ฒŒ ๋œ๋‹ค.
image3

3. ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์˜ ์Šน์ธ

  1. ์ •๋ณด์˜ ์ €์žฅ๊ณผ ๋™์‹œ์— ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋Š” ๋ฆฌ์†Œ์Šค ์˜ค๋„ˆ๊ฐ€ ์Šน์ธํ•˜๊ฒŒ ๋˜๋ฉด redirect url๋กœ auth code ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค.

image4

  1. ๊ทธ๋Ÿฌ๋ฉด redirect url์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๊ณ  ํด๋ผ์ด์–ธํŠธ๋Š” auth code ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

image5

  1. ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐ›์•„์˜จ auth code ๊ฐ’, client secret, redirect url, client_id ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์—๊ฒŒ ๋ณด๋‚ด๊ฒŒ ๋˜๊ณ ,

image6

4. accessToken ๋ฐœ๊ธ‰

๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋Š” ๋ชจ๋“  ์ •๋ณด๊ฐ€ ์ผ์น˜ํ•˜๋Š” ์ง€ ํ™•์ธ ํ›„ ๋“œ๋””์–ด! accessToken์„ ๋ฐœ๊ธ‰ํ•œ๋‹ค.

์ด accessToken์„ ์ด์šฉํ•ด ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋Š” ์–ด๋–ค ํด๋ผ์ด์–ธํŠธ์˜ ์–ด๋–ค ์œ ์ €๊ฐ€ ์–ด๋–ค scope์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

image7

5. RefreshToken

accessToken์€ ์ˆ˜๋ช…์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜๋ช…์ด ๋‹ค ํ–ˆ์„ ๋•Œ API๋ฅผ ํ˜ธ์ถœํ•ด๋„ API๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋Ÿฌ๋ฉด accessToken์„ ๋‹ค์‹œ ๋ฐœ๊ธ‰ ๋ฐ›์„ ๋•Œ ์œ„์˜ ๋ชจ๋“  ๊ณผ์ •์„ ๋‹ค์‹œ ๊ฑฐ์น  ์ˆ˜๋Š” ์—†์œผ๋ฏ€๋กœ OAuth์—์„œ๋Š” refreshToken์ด๋ž€ ๊ฒƒ์„ ํ™œ์šฉํ•œ๋‹ค.

OAuth ํ‘œ์ค€์—์„œ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™์€๋ฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์ดˆ๊ธฐ accessToken์„ ๋ฐœ๊ธ‰ํ•  ๋•Œ RefreshToken์„ ํ•จ๊ป˜ ๋ฐœ๊ธ‰ํ•˜๊ณ , ์ค‘๊ฐ„์— accessToken์ด invalid๋˜๊ฒŒ ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ์—์„œ refreshToken์„ ๋ฆฌ์†Œ์Šค์„œ๋ฒ„์—๊ฒŒ ๋ณด๋‚ด์„œ(์ •ํ™•ํžˆ๋Š” Auth์„œ๋ฒ„) accessToken์„ ์žฌ ๋ฐœ๊ธ‰ํ•˜๋Š” ํ˜•์‹์ด๋‹ค.

image8

์ฆ‰, accessToken์€ ๊ณ„์† ๊ฐฑ์‹ ๋˜์ง€๋งŒ refreshToken์€ ์ดˆ๊ธฐ์— ๋ฐ›์€ ๊ฒƒ์„ ๊ณ„์† refreshํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ณ  ๋•Œ๋กœ๋Š” ์ƒˆ๋กœ์šด accessToken ๋ฐ›์„ ๋•Œ refreshToken๋„ ์ƒˆ๋กœ ๋ฐœ๊ธ‰ํ•ด์ฃผ๋Š” ์„œ๋น„์Šค๋„ ์žˆ๋‹ค.


OAuth๋Š” ์ดํ•ด๋Š” ๋˜๋Š”๋ฐ 3์ž๊ฐ„์— ์™”๋‹ค๊ฐ”๋‹ค ํ•˜๋Š”๊ฒŒ ๋งŽ์•„์„œ ํ—ท๊ฐˆ๋ฆฌ๋‹ˆ๊น ์—ฌ๋Ÿฌ ๋ฒˆ ์ฝ๊ณ  ์—ฌ๋Ÿฌ ๋ฒˆ ๋จธ๋ฆฌ์—์„œ ๊ทธ๋ ค๋ด์•ผ ๋  ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ž˜๋„ ์ •๋ฆฌํ•˜๋‹ˆ๊น ์†์ด ์‹œ์›ํ•˜๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ