OAuth

OAuth(2.0)์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์šฉ์ž ๋Œ€์‹  ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ถŒํ•œ์„ ์œ„์ž„(Delegation)ํ•˜๋Š” ์—…๊ณ„ ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ(RFC 6749)์ด๋‹ค.

  • ๋‹จ์ˆœํ•œ ์ธ์ฆ(Authentication)์„ ๋„˜์–ด ํŠน์ • ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ(Authorization)์„ ๊ด€๋ฆฌํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ์—ญํ•  ์ˆ˜ํ–‰

  • ํ˜„๋Œ€ ์›น ์ƒํƒœ๊ณ„์—์„œ ๋ณด์•ˆ์„ฑ๊ณผ ์‚ฌ์šฉ์ž ํŽธ์˜์„ฑ์„ ๋™์‹œ์— ํ™•๋ณดํ•˜๋Š” ํ•ต์‹ฌ ๊ทœ๊ฒฉ

OAuth์˜ ํƒ„์ƒ๊ณผ ๋ฐœ์ „ ๋ฐฐ๊ฒฝ

1. OAuth ์ด์ „ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ณต์œ ์˜ ๋ฌธ์ œ

OAuth๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋˜ ์ดˆ๊ธฐ ์›น ํ™˜๊ฒฝ์—์„œ๋Š” ์„œ๋“œํŒŒํ‹ฐ ์„œ๋น„์Šค๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž์˜ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง์ ‘ ์ €์žฅํ•ด์•ผ ํ–ˆ๋‹ค.

  • ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ณต์œ ์˜ ์œ„ํ—˜์„ฑ: ์„œ๋“œํŒŒํ‹ฐ ์„œ๋น„์Šค๊ฐ€ ํ•ดํ‚น๋‹นํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์˜ ์›๋ณธ ๊ณ„์ • ์ „์ฒด๊ฐ€ ํƒˆ์ทจ๋˜๋Š” ์‹ฌ๊ฐํ•œ ๋ณด์•ˆ ๊ฒฐํ•จ ๋ฐœ์ƒ

  • ๊ถŒํ•œ ์ œ์–ด ๋ถˆ๊ฐ€: ํŠน์ • ๊ธฐ๋Šฅ(์˜ˆ: ์ฃผ์†Œ๋ก ์กฐํšŒ)๋งŒ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๋ชจ๋“  ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ณผ๋„ํ•œ ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฌธ์ œ

  • ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€: ์‚ฌ์šฉ์ž๊ฐ€ ํฌํ„ธ ์‚ฌ์ดํŠธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์—ฐ๋™๋œ ๋ชจ๋“  ์„œ๋น„์Šค์˜ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋ฉฐ, ๊ฐœ๋ณ„ ์„œ๋น„์Šค๋ณ„๋กœ ๊ถŒํ•œ์„ ์ทจ์†Œํ•  ๋ฐฉ๋ฒ•์ด ๋ถ€์žฌ

2. OAuth 1.0์˜ ํ•œ๊ณ„์™€ 2.0์œผ๋กœ์˜ ์ง„ํ™”

2007๋…„ ๋“ฑ์žฅํ•œ OAuth 1.0์€ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ–ˆ์œผ๋‚˜ ๊ธฐ์ˆ ์ ์ธ ๋ณต์žก์„ฑ์ด ๋†’์•˜๋‹ค.

  • 1.0์˜ ํ•œ๊ณ„: ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ๋ณต์žกํ•œ HMAC ์„œ๋ช…(Signature) ์ƒ์„ฑ์ด ํ•„์ˆ˜์ ์ด๋ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌํ˜„ ๋‚œ์ด๋„๊ฐ€ ๋งค์šฐ ๋†’์Œ

  • ํ™˜๊ฒฝ์  ์ œ์•ฝ: ๋ฐ์Šคํฌํ†ฑ์ด๋‚˜ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ์˜ ์ง€์›์ด ๋ฏธํกํ•˜๋ฉฐ ์„ธ์…˜ ๊ด€๋ฆฌ๊ฐ€ ๊นŒ๋‹ค๋กœ์›€

  • 2.0์˜ ๊ฐœ์„ : ์•”ํ˜ธํ™” ์„œ๋ช… ๋Œ€์‹  HTTPS(TLS) ๋ณด์•ˆ ํ†ต์‹ ์— ์˜์กดํ•˜์—ฌ ๊ตฌํ˜„์„ ๋‹จ์ˆœํ™”ํ•จ

  • ํ™•์žฅ์„ฑ ๊ฐ•ํ™”: ์›น, ๋ชจ๋ฐ”์ผ, ์„œ๋ฒ„ ๊ฐ„ ํ†ต์‹  ๋“ฑ ๋‹ค์–‘ํ•œ ํด๋ผ์ด์–ธํŠธ ํ™˜๊ฒฝ์— ๋งž์ถ˜ ๋„ค ๊ฐ€์ง€ ์ด์ƒ์˜ ์Šน์ธ ๋ฐฉ์‹(Grant Types) ์ •์˜ ๋ฐ ์Šค์ฝ”ํ”„(Scope) ๊ฐœ๋… ๋„์ž…

OAuth 2.0์ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ

1. ๋ณด์•ˆ์„ฑ ์ฆ๋Œ€์™€ ๊ด€๋ฆฌ ์ฃผ์ฒด์˜ ์ค‘์•™ํ™”

์‚ฌ์šฉ์ž๋Š” ์ž์‹ ์˜ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์‹ ๋ขฐ๋„๊ฐ€ ๋‚ฎ์€ ์„œ๋“œํŒŒํ‹ฐ ์„œ๋น„์Šค์— ๋…ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†์–ด์กŒ๋‹ค.

  • ๋Œ€๊ธฐ์—… ๋ณด์•ˆ ์ธํ”„๋ผ ํ™œ์šฉ: ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ด€๋ฆฌ ๋ฐ 2๋‹จ๊ณ„ ์ธ์ฆ(2FA)๊ณผ ๊ฐ™์€ ๊ณ ๋„์˜ ๋ณด์•ˆ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌ๊ธ€, ์• ํ”Œ ๋“ฑ ๊ฒ€์ฆ๋œ ํ”Œ๋žซํผ์— ์œ„์ž„ ๊ฐ€๋Šฅ

  • ๋ฆฌ์Šคํฌ ๋ถ„์‚ฐ: ์„œ๋น„์Šค๊ฐ€ ํ•ดํ‚น๋‹นํ•˜๋”๋ผ๋„ ์œ ์ถœ๋˜๋Š” ๊ฒƒ์€ ํ•ด๋‹น ์„œ๋น„์Šค์— ๊ตญํ•œ๋œ ์ž„์‹œ ์•ก์„ธ์Šค ํ† ํฐ์ผ ๋ฟ์ด๋ฉฐ ์‚ฌ์šฉ์ž์˜ ํ†ตํ•ฉ ๊ณ„์ • ์ •๋ณด๋Š” ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธ

2. ์‚ฌ์šฉ์ž ํŽธ์˜์„ฑ ๋ฐ ๊ถŒํ•œ ์ œ์–ด

  • ๊ฐ„ํŽธ ๋กœ๊ทธ์ธ(Single Sign-On): ๋ณ„๋„์˜ ํšŒ์›๊ฐ€์ž… ์—†์ด ๊ธฐ์กด ํ”Œ๋žซํผ ๊ณ„์ •์œผ๋กœ ์ฆ‰์‹œ ์„œ๋น„์Šค ์ด์šฉ ๊ฐ€๋Šฅ

  • ์ตœ์†Œ ๊ถŒํ•œ ์›์น™: ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋น„์Šค์— ํ—ˆ์šฉํ•  ๋ฐ์ดํ„ฐ ๋ฒ”์œ„(์˜ˆ: ์ด๋ฉ”์ผ๋งŒ ํ—ˆ์šฉ)๋ฅผ ์ง์ ‘ ์„ ํƒํ•˜์—ฌ ์ œ์–ด ๊ฐ€๋Šฅ

ํ•ต์‹ฌ ์šฉ์–ด ๋ฐ ๊ตฌ์„ฑ ์š”์†Œ

OAuth 2.0 ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋„ค ๊ฐ€์ง€ ์ฃผ์š” ์—ญํ• ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž(Resource Owner): ๋ฐ์ดํ„ฐ์˜ ์ฃผ์ธ ์‚ฌ์šฉ์ž(User)

  2. ํด๋ผ์ด์–ธํŠธ(Client): ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ๋ฐ›์•„ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜๋ ค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์„œ๋“œํŒŒํ‹ฐ ์„œ๋น„์Šค)

  3. ๊ถŒํ•œ ๋ถ€์—ฌ ์„œ๋ฒ„(Authorization Server): ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๋Š” ์„œ๋ฒ„

  4. ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„(Resource Server): ์‚ฌ์šฉ์ž์˜ ๋ณดํ˜ธ๋œ ์ž์›์„ ํ˜ธ์ŠคํŒ…ํ•˜๊ณ  API๋ฅผ ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„

ํ˜„๋Œ€ ์›น ํ‘œ์ค€ ์ธ์ฆ ํ”Œ๋กœ์šฐ - Authorization Code Grant

๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง์ ‘ ํ† ํฐ์„ ๋ฐ›์ง€ ์•Š๊ณ  ์ผ์‹œ์ ์ธ ์Šน์ธ ์ฝ”๋“œ(Code)๋ฅผ ๊ฑฐ์ณ ๋ฐฑ์—”๋“œ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ํ† ํฐ์„ ๊ตํ™˜ํ•œ๋‹ค.

spinner

์Šน์ธ ์ฝ”๋“œ ๋ฐฉ์‹์ด ์•ˆ์ „ํ•œ ์ด์œ 

  • ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ํƒˆ์ทจ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋ฏ€๋กœ ์ผํšŒ์„ฑ ์ฝ”๋“œ๋งŒ ๋…ธ์ถœ

  • ์‹ค์ œ ํ† ํฐ ๊ตํ™˜์€ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์™€ ๊ถŒํ•œ ์„œ๋ฒ„ ๊ฐ„์˜ ์ง์ ‘ ํ†ต์‹ (Server-to-Server)์œผ๋กœ ์ˆ˜ํ–‰

  • Client Secret์ด๋ผ๋Š” ๋น„๋ฐ€ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์˜ ์‹ ์›์„ ์ถ”๊ฐ€ ๊ฒ€์ฆ

PKCE(Proof Key for Code Exchange) ์‹ฌ์ธต ์ดํ•ด

PKCE๋Š” ์Šน์ธ ์ฝ”๋“œ ๊ฐ€๋กœ์ฑ„๊ธฐ ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ๋ณด์•ˆ ํ™•์žฅ ์‚ฌ์–‘์ด๋‹ค.

PKCE ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ๊ณผ ๋ชฉ์ 

์ผ๋ฐ˜์ ์ธ ์Šน์ธ ์ฝ”๋“œ ๋ฐฉ์‹์—์„œ๋„ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๊ณผ์ •์—์„œ ์ฝ”๋“œ๊ฐ€ ํƒˆ์ทจ๋  ์œ„ํ—˜์ด ์กด์žฌํ•œ๋‹ค.

  • ๋ชจ๋ฐ”์ผ ์•ฑ, SPA์ฒ˜๋Ÿผ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๋…ธ์ถœ๋˜๊ธฐ ์‰ฌ์šด ํ™˜๊ฒฝ์—์„œ๋Š” Client Secret์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ ๋ถˆ๊ฐ€๋Šฅ

  • ๊ณต๊ฒฉ์ž๊ฐ€ ์ค‘๊ฐ„์— ์ฝ”๋“œ๋ฅผ ๊ฐ€๋กœ์ฑ„์–ด ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ถ€์ • ๋ฐœ๊ธ‰ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์  ์กด์žฌ

  • PKCE๋Š” ํ† ํฐ ์š”์ฒญ ์‹œ์ ์— ๋ณ„๋„์˜ ๊ฒ€์ฆ ๋‹จ๊ณ„(Proof Key)๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฌธ์ œ ํ•ด๊ฒฐ

PKCE ๋™์ž‘ ๋งค์ปค๋‹ˆ์ฆ˜ ๋ฐ ํ”Œ๋กœ์šฐ

  1. Code Verifier ์ƒ์„ฑ: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž„์˜์˜ ๋ฌด์ž‘์œ„ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑ

  2. Code Challenge ์ƒ์„ฑ: Verifier๋ฅผ SHA-256์œผ๋กœ ํ•ด์‹ฑํ•˜์—ฌ ์ƒ์„ฑ

  3. ์Šน์ธ ์š”์ฒญ: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ถŒํ•œ ์„œ๋ฒ„์— Challenge ์ „์†ก

  4. ํ† ํฐ ๊ตํ™˜: ์ฝ”๋“œ๋ฅผ ๋ฐ›์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ† ํฐ์„ ์š”์ฒญํ•  ๋•Œ ์›๋ณธ Verifier๋ฅผ ํ•จ๊ป˜ ์ „์†ก

  5. ์„œ๋ฒ„ ๊ฒ€์ฆ: ์„œ๋ฒ„๋Š” ์ €์žฅํ–ˆ๋˜ Challenge์™€ ์ „๋‹ฌ๋ฐ›์€ Verifier๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ ํ›„ ํ† ํฐ ๋ฐœ๊ธ‰

Last updated