Doputer

OAuth 2.0์ด๋ž€?๐Ÿ”‘

OAuth 2.0

OAuth(RFC6749)๋Š” ์‚ฌ์šฉ์ž๋“ค์ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ , ๋‹ค๋ฅธ ์„œ๋น„์Šค์— ์žˆ๋Š” ์ž์‹ ์˜ ์ •๋ณด์— ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ์ธํ„ฐ๋„ท ํ‘œ์ค€์ด๋‹ค.

 

์‰ฝ๊ฒŒ ์ƒ๊ฐํ•ด์„œ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ๋•Œ ์นด์นด์˜ค, ๋„ค์ด๋ฒ„ ๋“ฑ์„ ํ†ตํ•œ ๊ฐ„ํŽธ ๋กœ๊ทธ์ธ์„ ๋– ์˜ฌ๋ฆฌ๋ฉด ๋œ๋‹ค.

 

OAuth์˜ ๋ฐฐ๊ฒฝ

์šฐ๋ฆฌ์˜ ์„œ๋น„์Šค์—์„œ ์นด์นด์˜ค์™€ ๋„ค์ด๋ฒ„์˜ ๊ฐ„ํŽธ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž.

 

์‚ฌ์šฉ์ž๊ฐ€ ์นด์นด์˜ค๋‚˜ ๋„ค์ด๋ฒ„์˜ ํšŒ์›์ž„์„ ์–ด๋–ป๊ฒŒ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ฐ›์•„์„œ ๋กœ๊ทธ์ธํ•ด ๋ณด๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋ณด์•ˆ์ƒ ๊ต‰์žฅํžˆ ์ทจ์•ฝํ•œ ๊ตฌ์กฐ์ด๊ณ , ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ œ3์ž ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ๋ถ€๋‹ด๋œ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์นด์นด์˜ค๋‚˜ ๋„ค์ด๋ฒ„์— ์šฐ๋ฆฌ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๋ ค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํšŒ์›์ž„์„ ์ฆ๋ช…ํ•ด๋‹ฌ๋ผ๊ณ  ํ•˜๋ฉด ์–ด๋–จ๊นŒ? ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ , ์นด์นด์˜ค๋‚˜ ๋„ค์ด๋ฒ„์˜ ํšŒ์›์ž„์„ ์ฆ๋ช…ํ•ด ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

 

์ดˆ๊ธฐ์— ํšŒ์‚ฌ๋“ค์€ ๊ฐ์ž์˜ ๋ฐฉ๋ฒ•๋Œ€๋กœ ํšŒ์›์ž„์„ ์ฆ๋ช…ํ•ด์ฃผ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํšŒ์‚ฌ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ฆ๋ช… ๋ฐฉ๋ฒ•์€ ์ œ3์ž ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฝ”๋“œ ๋ณต์žก๋„๋ฅผ ๋†’์ด๊ณ , ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฌํ•œ ์ฆ๋ช… ๋ฐฉ๋ฒ•์„ ํ•˜๋‚˜๋กœ ํ†ต์ผํ•ด ์ธํ„ฐ๋„ท ํ‘œ์ค€์œผ๋กœ ๋งŒ๋“  ๊ฒƒ์ด OAuth๋‹ค.

 

Authorization Code ๋ฐ›๊ธฐ

์‚ฌ์šฉ์ž๊ฐ€ ์šฐ๋ฆฌ ์„œ๋น„์Šค์— ์นด์นด์˜ค๋‚˜ ๋„ค์ด๋ฒ„์˜ ํšŒ์›์ž„์„ ์ฆ๋ช…ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์‚ฌ์šฉ์ž๋Š” ์šฐ๋ฆฌ ์„œ๋น„์Šค์— ๊ฐ„ํŽธ ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
  • ์šฐ๋ฆฌ ์„œ๋น„์Šค๋Š” ์นด์นด์˜ค๋‚˜ ๋„ค์ด๋ฒ„์˜ ์ธ์ฆ ์„œ๋น„์Šค์— ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
  • ์ธ์ฆ ์„œ๋น„์Šค๋Š” ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ์•„์ด๋””์™€ ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.
  • ์ธ์ฆ ์„œ๋น„์Šค๋Š” ์•„์ด๋””์™€ ํŒจ์Šค์›Œ๋“œ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ , ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋ฉด Authroziation Code ๋ฅผ ๋ฐœ๊ธ‰ํ•ด์ค€๋‹ค.
  • ์‚ฌ์šฉ์ž๋Š” ๋ฐ›์•„์˜จ Authorization Code๋ฅผ ์šฐ๋ฆฌ ์„œ๋น„์Šค์— ์ „๋‹ฌํ•ด์ค€๋‹ค.
ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์šฐ๋ฆฌ ์„œ๋น„์Šค์˜ Callback URL์„ ํ†ตํ•ด ๋ฐ”๋กœ Authorization Code๋ฅผ ๋ณด๋‚ธ๋‹ค. ์ด ๊ณผ์ •์—์„œ XSS(Cross-Site Scripting) ๊ณต๊ฒฉ ๋“ฑ์œผ๋กœ Callback URL์ด ํ”ผ์‹ฑ ์‚ฌ์ดํŠธ๋กœ ๋ณ€์กฐ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ ๋Œ€๋ถ€๋ถ„์˜ ์ธ์ฆ ์„œ๋น„์Šค๋Š” ๋“ฑ๋ก๋œ Callback URL๋กœ๋งŒ Authorization Code๋ฅผ ๋ณด๋‚ด์ฃผ๋„๋ก ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค.

 

Access Token ๋ฐ›๊ธฐ

์šฐ๋ฆฌ ์„œ๋น„์Šค์—์„œ Authorization Code๋ฅผ ๋ฐ›์€ ์ดํ›„์—๋Š” OAuth์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ธ Access Token์„ ๋ฐœ๊ธ‰ ๋ฐ›๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ง„ํ–‰๋œ๋‹ค.

  • ์ธ์ฆ ์„œ๋น„์Šค์— Access Token์„ ์š”์ฒญํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋ฐ›์•„์˜จ Authorization Code์™€ ์ธ์ฆ ์„œ๋น„์Šค์—์„œ ์šฐ๋ฆฌ ์„œ๋น„์Šค๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด(Client Id, Client Secret ๋“ฑ)๋ฅผ ์ถ”๊ฐ€๋กœ ๋ณด๋‚ธ๋‹ค.
  • ์ธ์ฆ ์„œ๋น„์Šค๋Š” ์šฐ๋ฆฌ ์„œ๋น„์Šค์—์„œ ๋ณด๋‚ธ ์ •๋ณด๋ฅผ ๊ฒ€์ฆํ•˜๊ณ , Access Token์„ ๋ฐœ๊ธ‰ํ•œ๋‹ค. ์šฐ๋ฆฌ ์„œ๋น„์Šค๋Š” ๋ณดํ†ต ์ด ๊ณผ์ •์—์„œ ๋ฐ›์•„์˜จ Access Token์„ ์•ˆ์ „ํ•œ ์žฅ์†Œ์— ๋ณด๊ด€ํ•ด๋†“๋Š”๋‹ค.
  • ์šฐ๋ฆฌ ์„œ๋น„์Šค๋Š” ํด๋ผ์ด์–ธํŠธ์— ์„ฑ๊ณต์ ์œผ๋กœ ๋กœ๊ทธ์ธ ๋˜์—ˆ์Œ์„ ์•Œ๋ ค์ค€๋‹ค.

 

Access Token์€ ๋ฐœ๊ธ‰ํ•ด์ค€ ์ธ์ฆ ์„œ๋น„์Šค๋งŒ ์•Œ ์ˆ˜ ์žˆ๋Š” ์ž„์˜์˜ ๋ฌธ์ž์—ด์ด๋‹ค. Access Token์€ ์‚ฌ์šฉ์ž์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์—ด์‡ ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ์ด์ œ API ์„œ๋น„์Šค์— ์ด ์—ด์‡ ๋ฅผ ๋ณด๋‚ด์„œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๋ฌผ๋ก  JWT(RFC7519)๋กœ Access Token์„ ๋ฐœ๊ธ‰ํ–ˆ๋‹ค๋ฉด Base64๋กœ ์ธ์ฝ”๋”ฉ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ด์–ด๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ SIGNATURE ๊ฒ€์ฆ์€ ์ธ์ฆ ์„œ๋น„์Šค์—์„œ๋งŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Access Token์„ ๋ฐœ๊ธ‰ํ•  ๋•Œ Refresh Token๋„ ๊ฐ™์ด ๋ฐœ๊ธ‰ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. Refresh Token์€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„(expiration time)์ด ์žˆ๋Š” Access Token์„ ์•ž์„œ ์†Œ๊ฐœํ•œ ๋ณต์žกํ•œ ๊ณผ์ •์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์žฌ๋ฐœ๊ธ‰ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์—ด์‡ ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. Access Token์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์€ OAuth 1.0์—์„œ ๋‹ค๋ฃจ์ง€ ์•Š๋‹ค๊ฐ€ OAuth 2.0์—์„œ ์ •์˜ ๋˜์—ˆ๋‹ค.

 

์‚ฌ์šฉ์ž ์ •๋ณด ๋ฐ›๊ธฐ

์ €์žฅ๋œ Access Token์œผ๋กœ API ์„œ๋น„์Šค์— ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ์‚ฌ์šฉ์ž ์ •๋ณด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์‚ฌ์šฉ์ž๊ฐ€ ์šฐ๋ฆฌ ์„œ๋น„์Šค์— ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. ๋‹ค๋งŒ, ์šฐ๋ฆฌ ์„œ๋น„์Šค์—์„œ ์ž์ฒด์ ์œผ๋กœ ์œ ์ € ์ •๋ณด์— ์ ‘๊ทผํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด ๊ณผ์ •์ด ์ƒ๋žต๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์šฐ๋ฆฌ ์„œ๋น„์Šค๋Š” ์ €์žฅ๋œ Access Token๊ณผ ํ•จ๊ป˜ API ์„œ๋น„์Šค์— ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
  • API ์„œ๋น„์Šค๋Š” Access Token์„ ๊ฒ€์ฆํ•œ ๋’ค์— ์ด์ƒ์ด ์—†๋‹ค๋ฉด ์š”์ฒญ์— ์‘๋‹ตํ•œ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์šฐ๋ฆฌ ์„œ๋น„์Šค์— ์š”์ฒญ์„ ๋ณด๋‚ธ ๊ฒฝ์šฐ์— ์‘๋‹ตํ•ด์ค€๋‹ค.

API ์„œ๋น„์Šค์—์„œ ๋ช…์„ธํ•œ๋Œ€๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ๋˜๊ณ , ๋Œ€๋ถ€๋ถ„ ํ—ค๋”์— Authorization: Bearer ${access_token}์„ ์‹ค์–ด์„œ ๋ณด๋‚ธ๋‹ค.

 

์ •๋ฆฌ

Authorization Code ๋ฐ›๊ธฐ -> Access Token ๋ฐ›๊ธฐ -> ์‚ฌ์šฉ์ž ์ •๋ณด ๋ฐ›๊ธฐ์˜ ์„ธ ๊ณผ์ •์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ„ํŽธ ๋กœ๊ทธ์ธ์„ ํ†ตํ•ด์„œ ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๊ณผ์ •๊นŒ์ง€ ์•Œ์•„๋ณด์•˜๋‹ค. OAuth 2.0์€ ์ธํ„ฐ๋„ท ํ‘œ์ค€์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์„œ๋น„์Šค๋„ ๋น„์Šทํ•œ ๊ณผ์ •์œผ๋กœ ์ง„ํ–‰๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

๊ฐœ์ธ์ ์œผ๋กœ ๊ณต๋ถ€ํ•  ๋•Œ ํ•œ ์„œ๋น„์Šค์˜ ์ธ์ฆ ๋ฐฉ์‹์„ ์ ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ์„œ๋น„์Šค๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์•˜๋‹ค. ์˜คํžˆ๋ ค ์ ์šฉํ•œ ์ดํ›„์— ํ† ํฐ๋“ค์„ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ• ์ง€ ๋งŽ์ด ๊ณ ๋ฏผํ–ˆ๋‹ค.

OAuth 2.0์˜ ์ „์ฒด ํ๋ฆ„

๋ฐ˜์‘ํ˜•

์ด ๊ธ€์˜ ํƒœ๊ทธ

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Doputer

#๊น€๋„ํ˜„

ํ™œ๋™ํ•˜๊ธฐ