๐Ÿ›ก๏ธOAuth

์ •์˜

์‚ฌ์šฉ์ž๋“ค์ด ์ œ3์ž ์„œ๋น„์Šค์˜ ๊ณ„์ •์„ ํ†ตํ•ด ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ ‘๊ทผ ์œ„์ž„์„ ์ œ๊ณตํ•˜๋Š” ๊ณตํ†ต ํ‘œ์ค€(open standard) ์ธ์ฆ๋ฐฉ์‹

์—ฌ๊ธฐ์„œ ์ œ3์ž ์„œ๋น„์Šค๋ž€ Google, Facebook, Github ๋“ฑ์„ ํฌํ•จํ•œ๋‹ค.

์žฅ์  (๋ฌธ์ œ ํ•ด๊ฒฐ)

  • ๊ธฐ์กด์—๋Š” ์ œ3์ž ์„œ๋น„์Šค์˜ ๊ณ„์ •์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ณธ ์„œ๋น„์Šค์™€ ์ œ3์ž ์„œ๋น„์Šค์— ๋ชจ๋‘ ์‚ฌ์šฉ์ž์˜ ์•„์ด๋””/๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•จ โ‡’ ๋ณด์•ˆ ์ธก๋ฉด์—์„œ ์†ํ•ด (ํ•˜๋‚˜ ํ„ธ๋ฆฌ๋ฉด ๋‹ค ํ„ธ๋ฆผ!)

    • OAuth๋ฅผ ์ด์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์‚ฌ์šฉ์ž์˜ ๊ฐœ์ธ ์ •๋ณด๊ฐ€ ์•„๋‹Œ ์ž„์˜๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฐ’์ธ accessToken์„ ์ด์šฉํ•ด ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‘ ๊ฐœ ์„œ๋น„์Šค ๋ชจ๋‘์— ๊ฐœ์ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

  • ์ œ3์ž ์„œ๋น„์Šค์˜ ์•„์ด๋””/๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ˜•์‹์—์„œ๋Š” ๋ณธ ์„œ๋น„์Šค๊ฐ€ ์ด๋ฅผ ๋‚จ์šฉํ•  ์šฐ๋ ค๊ฐ€ ์žˆ์—ˆ๋‹ค.

    • OAuth๋ฅผ ์ด์šฉํ•˜๋ฉด ํ—ˆ์šฉํ•  ๊ถŒํ•œ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ ๊ณผ์ •์—์„œ ์ด ๊ถŒํ•œ์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์šฉ์–ด

  • Resource Owner - ์‚ฌ์šฉ์ž. Resource(๊ฐœ์ธ ์ •๋ณด)์˜ ์†Œ์œ ์ž

  • Resource Server - ์ œ3์ž ์„œ๋น„์Šค. Resource(๊ฐœ์ธ ์ •๋ณด)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ œ๊ณตํ•˜๋Š” ์ฃผ์ฒด

    • Authorization Server - OAuth๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ œ3์ž ์„œ๋น„์Šค์— ์†ํ•œ, ์ธ์ฆ ๊ด€๋ จ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์„œ๋ฒ„

  • Client - ์ด์šฉํ•˜๋ ค๋Š” ์„œ๋น„์Šค. Resource Server์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ณ  ํ™œ์šฉํ•˜๋Š” ์ฃผ์ฒด

์ธ์ฆ ํ๋ฆ„

OAuth ์ธ์ฆ์„ ํ†ตํ•œ ๋กœ๊ทธ์ธ์„ ์ œ๊ณตํ•˜๋Š” Client ์ž…์žฅ์—์„œ์˜ ์ธ์ฆ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. OAuth ์ธ์ฆ ๋ฐฉ์‹์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ธ์ฆ ์„œ๋ฒ„๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์— ๋‚ด ์„œ๋น„์Šค๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.

  2. ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋Š” ์ฐจํ›„ ๋“ฑ๋ก๋œ ์„œ๋น„์Šค์˜ ์ธ์ฆ์„ ์œ„ํ•ด Client ID, Client Secret์„ ๋ฐœ๊ธ‰ํ•œ๋‹ค.

  3. ์‚ฌ์šฉ์ž๊ฐ€ OAuth ๋กœ๊ทธ์ธ(๊ตฌ๊ธ€๋กœ ๋กœ๊ทธ์ธ, ์นด์นด์˜ค๋กœ ๋กœ๊ทธ์ธ ๋“ฑ)์„ ์š”์ฒญํ•œ๋‹ค.

  4. ๋‚ด ์„œ๋ฒ„๋Š” ์ด๋ฅผ ๋ฐ›์•„ ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆ ์„œ๋ฒ„๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ธ์ฆ ํŽ˜์ด์ง€๋กœ ์ด๋™์‹œํ‚จ๋‹ค. ์ด ๋•Œ ์ธ์ฆ ์„œ๋ฒ„์—๋Š” ํด๋ผ์ด์–ธํŠธ ์•„์ด๋””, ๊ถŒํ•œ์„ ๋ถ€์—ฌ๋ฐ›์„ ์˜์—ญ(scope), ์ธ์ฆ ํ›„ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•  URL์ด GET ์š”์ฒญ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ œ๊ณต๋˜์–ด์•ผ ํ•œ๋‹ค.

    https://resource.server?client_id={ํด๋ผ์ด์–ธํŠธ์•„์ด๋””}&scope=email,profile...&redirect_url=https://client/callback
  5. ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ์„ ์ˆ˜ํ–‰(๋™์˜)ํ•˜๋ฉด ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋Š” code๋ฅผ ๋ฐœ๊ธ‰ํ•œ๋‹ค. code๋Š” ์ง์ „์— ์ œ๊ณตํ•œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ URL๋กœ ์‚ฌ์šฉ์ž๋ฅผ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ์‹œํ‚ค๋ฉฐ ์ œ๊ณต๋œ๋‹ค.

    https://client/callback?code={์ฝ”๋“œ}
  6. ๋‚ด ์„œ๋ฒ„๋Š” ์ด๋ฅผ ๋ฐ›์•„ ์ธ์ฆ ์„œ๋ฒ„์— access token์„ ๋ฐœ๊ธ‰ํ•  ๊ฒƒ์„ ์š”์ฒญํ•œ๋‹ค. ์ด ๋•Œ ์ธ์ฆ ์„œ๋ฒ„์—๋Š” Client ID, Client Secret, ์ง์ „์— ๋ฐœ๊ธ‰ํ•œ code, ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•  URL์ด POST ์š”์ฒญ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ œ๊ณต๋˜์–ด์•ผ ํ•œ๋‹ค.

    https://resource.server/token?code={์ฝ”๋“œ}&client_id={ํด๋ผ์ด์–ธํŠธ์•„์ด๋””}&client_secret={ํด๋ผ์ด์–ธํŠธ์‹œํฌ๋ฆฟ}&redirect_url=https://client/callback
  7. ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ ์•„์ด๋””์™€ ์‹œํฌ๋ฆฟ, ์ฝ”๋“œ๊ฐ€ ๋ชจ๋‘ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๋งž๋‹ค๋ฉด access token์„ ๋ฐœ๊ธ‰ํ•˜์—ฌ ์ด๋ฅผ ํฌํ•จํ•œ JSON์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    {
    	"access_token": "์•ก์„ธ์Šค ํ† ํฐ",
    	"token_type": "Bearer",
    	"expires_in": ์œ ํšจ ์‹œ๊ฐ„,
    	"refresh_token": "๊ฐฑ์‹ ์„ ์œ„ํ•œ ํ† ํฐ"
    }
  8. ๋‚ด ์„œ๋น„์Šค๋Š” ์ด access token์„ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๊ฐ€ ์ œ๊ณตํ•˜๋Š” API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. access token์€ ํ—ค๋”๋กœ ์ „์†กํ•˜๊ฑฐ๋‚˜ url์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „์†กํ•˜๋Š”๋ฐ, ๋ณด์•ˆ ๋ฉด์—์„œ๋Š” (๋‹น์—ฐํžˆ) ํ—ค๋”๋กœ ์ „์†กํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

    GET /api/apiurl
    Authorization: Bearer <access token>

    ํ—ค๋”๋กœ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ์ด ํ† ํฐ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ฟ ํ‚ค ๋˜๋Š” ์„ธ์…˜์„ ํ†ตํ•ด ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์žฌ๋ฐœ๊ธ‰

refresh-token

์•ž์„œ access token์„ ํฌํ•จํ•œ JSON์˜ ํ˜•์‹์„ ๋ณด๋ฉด, access token์—๋Š” ์œ ํšจ ์‹œ๊ฐ„์ด ์กด์žฌํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด ์œ ํšจ ์‹œ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜๋ฉด ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋Š” ํ•ด๋‹น access token์„ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•œ๋‹ค.

์ด ๊ฒฝ์šฐ ๋‚ด ์„œ๋ฒ„๋Š” refresh token์„ ํ†ตํ•ด access token์„ ๊ฐฑ์‹ ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ refresh token๋„ ๊ฐฑ์‹ ๋  ์ˆ˜๋„ ์žˆ๊ณ , ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค.

์—ญํ• 

์‚ฌ์šฉ์ž

์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  1. ๋กœ๊ทธ์ธ์„ ์‹œ๋„ (๊ตฌ๊ธ€๋กœ ๋กœ๊ทธ์ธ, ํŽ˜์ด์Šค๋ถ์œผ๋กœ ๋กœ๊ทธ์ธ ๋“ฑ์˜ ๋ฒ„ํŠผ์„ ํด๋ฆญ)

  2. ์ธ์ฆ์— ๋™์˜ํ•จ์œผ๋กœ์จ ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•œ๋‹ค.

๊ฐœ๋ฐœ์ž

๊ฐœ๋ฐœ์ž๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  1. ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์— ์ž์‹ ์˜ ์„œ๋น„์Šค๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.

  2. ํด๋ผ์ด์–ธํŠธ ID, ํด๋ผ์ด์–ธํŠธ Secret์„ ๋ฐœ๊ธ‰๋ฐ›์•„ ์„œ๋ฒ„๊ฐ€ ์ด๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

  3. ์ธ์ฆ ํ๋ฆ„์˜ 4~8์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ API๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

์ด ๊ณผ์ •์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ์กด์žฌํ•œ๋‹ค. Spring Security, Passport ๋“ฑ์ด ์ด์— ํ•ด๋‹นํ•œ๋‹ค.

๋ฆฌ์†Œ์Šค ์„œ๋ฒ„

๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž์˜ ๋ณด์•ˆ์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.

  • authorization code๋Š” ํ•œ ๋ฒˆ ๊ฐฑ์‹ ์„ ๋งˆ์นœ ๋’ค ์†Œ๋ฉธํ•œ๋‹ค. ์ฆ‰, ๋งค ๋ฒˆ ๋‹ค๋ฅธ code๊ฐ€ ๋ฐœ๊ธ‰๋œ๋‹ค.

  • access token์„ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๊ฐ€ ์†Œ์œ ํ•œ client id, client secret, authorization code์™€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธด ์„ธ ๊ฐœ์˜ ๊ฐ’์ด ๋ชจ๋‘ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.

  • access token์—๋Š” ์œ ํšจ ๊ธฐ๊ฐ„์ด ์กด์žฌํ•œ๋‹ค. ์ด ๊ธฐ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์—์„œ ์†Œ๋ฉธํ•˜๋ฉฐ, ์žฌ๋ฐœ๊ธ‰์„ ์œ„ํ•ด refresh token์„ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

Reference

OAuth - ์œ„ํ‚ค๋ฐฑ๊ณผ

OAuth 2.0 rfc

์ƒํ™œ์ฝ”๋”ฉ WEB2 - OAuth

Last updated