seeyouletter / seeyouletter-fe

0 stars 0 forks source link

[๐Ÿ’Œ FEATURE REQUEST] Oauth Redirect Page ๋กœ์ง์„ ์ƒ์„ฑํ•œ๋‹ค #35

Open JengYoung opened 1 year ago

JengYoung commented 1 year ago

๋ฉˆ์ถฐ! ๐Ÿ–๐Ÿป ์ž ์‹œ ์ฒดํฌ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค~

๋ฐฐ๊ฒฝ ๋ฐ ์„ค๋ช…

์Šฌ์Šฌ Oauth๋ฅผ ์œ„ํ•ด ๋ณธ๊ฒฉ์ ์œผ๋กœ ์›€์ง์ด๋ ค ํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ž์ฑ…์—์„œ ์ข€ ๋ฒ—์–ด๋‚˜์„œ์ธ์ง€, ์•„์ง ๋งˆ์Œ์€ ๋ณต์žกํ•˜์ง€๋งŒ ์ œ๋Œ€๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•  ๋งˆ์Œ์€ ์ƒ๊ฒผ๋‹ค. ์ผ๋‹จ ๋‚ด์ผ์ด๋ฉด ๋””์ž์ธ ํŒจํ„ด์„ ๋ชจ๋‘ ๊ณต๋ถ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์‹ฌ๋ฆฌ์ ์ธ ์—ฌ์œ ๊ฐ€ ์ƒ๊ฒผ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ ์”จ์œ ๋ ˆํ„ฐ ๋ฐฑ์—”๋“œ ํŒ€์˜ ์›ํ™œํ•œ ์ž‘์—…์„ ๋•๊ธฐ ์œ„ํ•ด, ๋ณธ๊ฒฉ์ ์œผ๋กœ ์›€์ง์ด๋ ค ํ•œ๋‹ค.

JavaScript Applications obtaining tokens directly

์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ํด๋ผ์ด์–ธํŠธ ๋‹จ์—์„œ ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ๋˜ํ•œ ํ† ํฐ์„ ์ €์žฅํ•  ๊ณต๊ฐ„์€ ๋ถ„๋ช… ํ•„์š”ํ•ด ๋ณด์ธ๋‹ค. ์ด๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ์•ˆ์„ ๊ณ ๋ฏผํ•˜์—ฌ, ๋ฉ‹์ง„ Oauth๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค ํ•œ๋‹ค.

๊ธฐ๋Œ€๊ฒฐ๊ณผ

  1. ์‚ฌ์šฉ์ž๋Š” Oauth ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด Oauth ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ๋‹ค.
  2. [์‚ฌ์šฉ์ž๋Š” ์ •์ƒ์ ์œผ๋กœOauth ๋กœ๊ทธ์ธ์„ ํ–ˆ๋‹ค๋ฉดRedirect Page`๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค.
  3. Redirect Page๋Š” code, state๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค.
  4. state๋Š” CSRF ๊ณต๊ฒฉ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ฐจ๋‹จํ•˜๊ธฐ ์œ„ํ•ด string์„ Randomํ•˜๊ฒŒ ์ƒ์„ฑํ•˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค.
  5. Redirect Page์— ๋“ค์–ด์„œ๋ฉด ๋ฐ”๋กœ ๋ฅผ ๋น„๊ตํ•˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค.
  6. state๊ฐ€ ์œ ํšจํ•˜๋ฉด Seeyouletter Auth Server์— code, state๋ฅผ ์ „๋‹ฌํ•˜๋Š” API๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. (ํ˜„์žฌ: ๋ชจํ‚นํ•  ์˜ˆ์ •์ด๋‹ค.)
  7. ๋ชจํ‚นํ•œ API๊ฐ€ true๋กœ ๋ฐ˜ํ™˜๋˜๋ฉด IndexPage๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค.
  8. ๋ชจํ‚นํ•œ API๊ฐ€ false๋กœ ๋ฐ˜ํ™˜๋˜๋ฉด ๋ชจ๋‹ฌ๋กœ ์—๋Ÿฌ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์˜ค๋ฉฐ LoginPage๋กœ replace๋˜์–ด์•ผ ํ•œ๋‹ค.

๋Œ€์•ˆ ์ œ์‹œ

Cache Storage API ์‚ฌ์šฉ

์•„์ง ์จ๋ณธ ์ ์€ ์—†์ง€๋งŒ, HTTP ์ƒ์—์„œ ์บ์‹œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ€์žฅ ๋‚˜์€ ๋Œ€์•ˆ์ด๋ผ๊ณ  ์•Œ๋ ค์ ธ ์žˆ๋‹ค. ์‚ฌ์šฉํ•ด๋ณธ ์ ์€ ์—†์–ด์„œ, ์ด์ฐธ์— ์ด ์—ญ์‹œ ๊ณต๋ถ€๋ฅผ ํ•ด๋ณด๊ณ  ์ ์šฉํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

sinbom commented 1 year ago

@JengYoung ์•ˆ๋…•ํ•˜์„ธ์š”! ํ•ด๋‹น ์ด์Šˆ๋ฅผ ์ž˜ ์ฝ์–ด๋ณด์•˜๋Š”๋ฐ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์ด ๋ช‡ ๊ฐ€์ง€ ์žˆ์–ด์„œ ์—ฌ์ญ™๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค! ๐Ÿค”

  1. "Oauth ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด Oauth ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™"์€ CSR์ด ์•„๋‹Œ ์ธ์ฆ ์„œ๋ฒ„ SSR ๋ฐฉ์‹์œผ๋กœ ์ดํ•ด๊ฐ€ ๋˜๋Š”๋ฐ ๋งž์„๊นŒ์š”? ๋ฌผ๋ก  ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์ธ์ฆ ์„œ๋ฒ„์—์„œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์ง€๋งŒ ํ”ผ๊ทธ๋งˆ ๊ธฐ์ค€์œผ๋กœ ๋ณด์•˜์„ ๋•Œ, ์”จ์œ ๋ ˆํ„ฐ์—์„œ๋Š” ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ CSR๋กœ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ดํ–ˆ๋Š”๋ฐ ํ•ด๋‹น ๋ฌธ๊ตฌ์—์„œ ํ˜ผ๋ž€์ด ์˜ค๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.๐Ÿ˜‚ ๋งŒ์•ฝ ์ •ํ•ด์ง€์ง€ ์•Š์€ ๋ถ€๋ถ„์ด๋ผ๋ฉด ๋…ผ์˜๊ฐ€ ํ•„์š”ํ•ด๋ณด์ž…๋‹ˆ๋‹ค ๐Ÿ˜€
  2. authorization request์—์„œ code_challenge, nonce ํŒŒ๋ผ๋ฏธํ„ฐ, token request์—์„œ code_verifier ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋กœ์ง์ด ์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! SPA(public client)์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์—‘์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” PKCE์˜ ์‚ฌ์šฉ์ด ํ•„์ˆ˜์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค ๐Ÿ™

ํ˜น์‹œ ํ™•์ธํ•˜์…จ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ธ์ฆ flow diagram์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ทธ๋ ค๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์”จ์œ ๋ ˆํ„ฐ ์ธ์ฆ ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ ํ›„, ์—‘์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰ ๋ฐ›๋Š” ๊ณผ์ •์„ slient renew ๊ณผ์ •๋ถ€ํ„ฐ๋ผ๊ณ  ์ดํ•ดํ•ด์ฃผ์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„์ง ์ •๋ฆฌ๋˜์ง€ ์•Š์€ ๋ฏธ์™„์„ฑ ์ƒํƒœ์ด์ง€๋งŒ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

JengYoung commented 1 year ago

ํ•ณ... ์ž˜๋ชป ํ™•์ธํ•ด์„œ ์‹œ๊ฐ„์„ ๊ฝ์œผ๋กœ ๋‚ ๋ ธ๋„ค์š” ๐Ÿ˜ญ ๋‹ต๋ณ€์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค!

@sinbom ์—‡, ์šฐ์„  ๋กœ์ง์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ ๊ฐ™์•„๋ณด์—ฌ์š”. ์กฐ์ •์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

๋‹ค๋ฅด๋‹ค๊ณ  ์ƒ๊ฐํ•œ ๋ถ€๋ถ„

ํ˜„์žฌ ์ž‘์„ฑํ•ด์ฃผ์‹  ํ”ผ๊ทธ๋งˆ ๋ฐฉ์‹

image image

๋จผ์ € ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•ด์ฃผ์‹  ์  ๊ฐ์‚ฌ๋“œ๋ ค์š”! ๐Ÿ™๐Ÿป

์ œ์•ˆํ•˜๋Š” ๋ณ€๊ฒฝ ๋ฐฉ์‹

ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋Š” ๋กœ๊ทธ์ธ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค!

image image

์ˆ˜์ •ํ•œ ๋ถ€๋ถ„์€ ํ•˜์ด๋ผ์ดํŠธํ•ด์„œ ํ‘œ์‹œํ–ˆ์–ด์š”. ํ™•์ธ ๋ถ€ํƒ๋“œ๋ ค์š”! ๋‹ค์Œ์€ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ž…๋‹ˆ๋‹ค ๐Ÿ™†๐Ÿปโ€โ™€๏ธ๐Ÿ™†๐Ÿป

์งˆ๋ฌธ

  1. "Oauth ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด Oauth ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™"์€ CSR์ด ์•„๋‹Œ ์ธ์ฆ ์„œ๋ฒ„ SSR ๋ฐฉ์‹์œผ๋กœ ์ดํ•ด๊ฐ€ ๋˜๋Š”๋ฐ ๋งž์„๊นŒ์š”? ๋ฌผ๋ก  ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์ธ์ฆ ์„œ๋ฒ„์—์„œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์ง€๋งŒ ํ”ผ๊ทธ๋งˆ ๊ธฐ์ค€์œผ๋กœ ๋ณด์•˜์„ ๋•Œ, ์”จ์œ ๋ ˆํ„ฐ์—์„œ๋Š” ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ CSR๋กœ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ดํ–ˆ๋Š”๋ฐ ํ•ด๋‹น ๋ฌธ๊ตฌ์—์„œ ํ˜ผ๋ž€์ด ์˜ค๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.๐Ÿ˜‚ ๋งŒ์•ฝ ์ •ํ•ด์ง€์ง€ ์•Š์€ ๋ถ€๋ถ„์ด๋ผ๋ฉด ๋…ผ์˜๊ฐ€ ํ•„์š”ํ•ด๋ณด์ž…๋‹ˆ๋‹ค ๐Ÿ˜€
  2. authorization request์—์„œ code_challenge, nonce ํŒŒ๋ผ๋ฏธํ„ฐ, token request์—์„œ code_verifier ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋กœ์ง์ด ์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! SPA(public client)์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์—‘์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” PKCE์˜ ์‚ฌ์šฉ์ด ํ•„์ˆ˜์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค ๐Ÿ™

1. ์ธ์ฆ ์„œ๋ฒ„์—์„œ์˜ SSR์ด ์•„๋‹Œ์ง€?

ํ—‰, ์ œ๊ฐ€ ํ˜ผ์ž ํ•œ๋‹ค๋Š” ์ƒ๊ฐ(...)์— ๋ชจ๋“  ๋‚ด์šฉ์„ ์ƒ๋žตํ•˜๊ณ  ์„ค๋ช…ํ–ˆ์–ด์š”. ๋งž์Šต๋‹ˆ๋‹ค! <Kakao, Naver>์—์„œ ์ œ๊ณตํ•˜๋Š” SDK๋Š” SSR์„ ํ†ตํ•ด ์ž์‹ ๋“ค์˜ URI๋กœ ์ด๋™์‹œํ‚ค๋„๋ก ํ•ด์š”.

๋‹ค๋งŒ CSR ๋ถ€๋ถ„์ด ์กด์žฌํ•œ๋‹ค๊ณ  ํšŒ์˜ ๋•Œ ์„ค๋ช…์„ ๋“œ๋ ธ๊ณ , ์ด๊ฒƒ์ด ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์ƒ์˜ ๋ฌธ์ œ์ ์œผ๋กœ ๋ฐœ๊ฒฌ๋œ ๊ฒƒ ๊ฐ™์•„์š”! ์ด์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ๋“œ๋ฆฌ์ž๋ฉด, redirect_uri์—์„œ ๋‹ค์‹œ ๋˜ <ํด๋ผ์ด์–ธํŠธ>์—์„œ <์”จ์œ ๋ ˆํ„ฐ ์ธ์ฆ ์„œ๋ฒ„>๋ฅผ ๊ฑฐ์น˜๊ฒŒ ๋  ๊ฒƒ์ด๊ณ , ์—ฌ๊ธฐ์„œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ•˜๋Š” ๋ถ€๋ถ„์„ CSR๋กœ ํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ์˜€์–ด์š”!

์ •๋ฆฌ:

  1. SSR๋กœ ์นด์นด์˜ค/๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™, SSR๋กœ ๋‹ค์‹œ redirect_uri๋กœ ์ด๋™ํ•ด์š”.
  2. CSR๋กœ ์ดํ›„ ์š”์ฒญ์— ๋”ฐ๋ผ ์ธ๋ฑ์Šค ํŽ˜์ด์ง€๋กœ ์ด๋™ or ์‹คํŒจ ์‹œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ด์š”.

2. ํŒŒ๋ผ๋ฏธํ„ฐ ์—ฌ๋ถ€

PKCE์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์ง€๋‚œ ํšŒ์˜ ์‹œ ํ•ฉ์˜๋ฅผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค!

๋‹ค๋งŒ ์—ฌ๊ธฐ์„œ ํŒŒ์ƒ๋˜๋Š” ๊ถ๊ธˆํ•œ ์ ์ด ์ƒ๊ฒผ์–ด์š”!

nonce ์—ฌ๋ถ€

์ €๋ฒˆ ํšŒ์˜์—์„œ nonce์˜ ๊ฒฝ์šฐ, Kakao์—์„œ๋Š” ์ง€์›ํ•˜์ง€๋งŒ Naver์—์„œ๋Š” ์š”์ฒญ ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ง์”€๋“œ๋ ธ๋˜ ๊ฒƒ ๊ฐ™์•„์š”. Naver Login API ์š”์ฒญ ๋ณ€์ˆ˜๋ช… ๋ช…์„ธ ํ˜น์‹œ nonce๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ๊ถ๊ธˆํ•ด์š”! ํ•œ๋‹ค๋ฉด, ํ”„๋ก ํŠธ์—”๋“œ ์ธก์—์„œ๋Š” ๋ฌด์ž‘์œ„๋กœ ์ƒ์„ฑํ• ๊นŒ์š”?

PKCE์—์„œ ํ”„๋ก ํŠธ์—”๋“œ์˜ ํ•ธ๋“ค๋ง ๋ฒ”์œ„

์ผ๋‹จ ํ”ผ๊ทธ๋งˆ์˜ ๊ทธ๋ฆผ์˜ ํ™”์‚ดํ‘œ๋ฅผ ๋ณผ ๋•Œ, code_verifier์€ ์„œ๋ฒ„์—์„œ ๋ณด๋‚ด์ฃผ๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ๋งž์„๊นŒ์š”? ํ•˜์ง€๋งŒ IBM - PKCE๋ฅผ ์˜ˆ์‹œ๋กœ ์‚ดํŽด๋ณผ ๋•Œ์—๋Š” ๋ณดํ†ต ํด๋ผ์ด์–ธํŠธ์—์„œ code_verifier๋ฅผ ์ƒ์„ฑ ํ›„, code_challenge๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ ๊ฐ™๋”๋ผ๊ตฌ์š”. ๋Œ€์‹ , ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์•”ํ˜ธํ™”ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœcode_challenge_method์ด๋ผ๋Š” ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ์ด๋Š” Oauth Playground์—์„œ๋„ ์„ค๋ช…๋˜์–ด ์žˆ๋Š” ๋ณ€์ˆ˜์—์š”!

์•„๋ฌด๋ž˜๋„ ์ด๊ฒŒ ๊ฐ€์žฅ ์ •ํ˜•ํ™”๋œ ๋ฐฉ์‹์ธ ๋“ฏํ•œ๋ฐ, ์ด๋Ÿฌํ•œ ๋กœ์ง์œผ๋กœ ๋‹ค์‹œ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ํ•„์š”์„ฑ์€ ์žˆ์„๊นŒ์š”?

RedirectURI ์‘๋‹ต ์ฝ”๋“œ ์—ฌ๋ถ€

์ œ๊ฐ€ ์•„์ง Oauth๊ฐ€ ์„œํˆด์–ด์„œ ๊ทธ๋Ÿฐ์ง€, Oauth Playground - PKCE๋ฒ„์ „์œผ๋กœ ๋‹ค์‹œ ํ•ด๋ดค๋Š”๋ฐ์š”. ์—ฌ๊ธฐ์„œ๋Š” redirect_uri ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์žˆ๋„ค์š”! ํ”„๋ก ํŠธ์—”๋“œ ์ž…์žฅ์—์„œ๋Š” ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•  ๋Œ€์ƒ์„ ์ง์ „ ํŽ˜์ด์ง€๋กœ history๋ฅผ ์ถ”์ ํ•˜๋ฉด ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์“ฐ์‹ค ๊ฒƒ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค! (๋ฌผ๋ก  ํ•ด์ฃผ์‹ ๋‹ค๋ฉด ํ”„๋ก ํŠธ์—”๋“œ ์ธก์—์„œ ๋‚˜์  ๊ฑด ์—†์๋‹ˆ๋‹ค! ๐Ÿ™‡๐Ÿปโ€โ™‚๏ธ)

์—๊ตฌ... ์ œ ๋ถˆ์ฐฐ๋กœ ์ธํ•ด ์ด์ „ ๋‹ต๋ณ€์„ ๋ณด์…จ๋‹ค๋ฉด ๋‹ต๋ณ€์— ํ˜ผ๋™์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์  ์–‘ํ•ด ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค( ) ๋ถ€์กฑํ•œ ํŒ€์›์ด์ง€๋งŒ ์ž˜ ๋ถ€ํƒ๋“œ๋ ค์š”! ์—ฌ์œ ๋กœ์šฐ์‹ค ๋•Œ ํŽธํ•˜๊ฒŒ ๋‹ต๋ณ€ํ•ด์ฃผ์„ธ์š”~ ๐Ÿ™‡๐Ÿปโ€โ™‚๏ธ

sinbom commented 1 year ago

๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์–ด์„œ ์ฝ๊ธฐ ํŽธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ™ ์•„๋ฌด๋ž˜๋„ ์ฒ˜์Œ์— ์ œ๊ฐ€ ์˜๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์งˆ๋ฌธํ–ˆ๋˜ ๋ถ€๋ถ„๋“ค์ด ์„œ๋กœ๊ฐ€ ์ดํ•ดํ•œ ๋ถ€๋ถ„์ด ๋‹ฌ๋ผ์„œ ์‹œ์ž‘๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์ž‘์„ฑํ•œ ์˜๋„๊ฐ€ ๋ณด๋Š” ์‚ฌ๋žŒ์—๊ฒŒ๋„ ์ž˜ ์ „๋‹ฌ๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.(์ฃ„์†ก,, ๐Ÿ˜‚) ์„œ๋กœ๊ฐ„์˜ ์ •ํ™•ํ•œ ์ดํ•ด๋ฅผ ์œ„ํ•ด ๊ฐœ๋…์— ๋Œ€ํ•œ ์ •๋ฆฌ๋ฅผ ๋‹ค์‹œ ํ•ด๋ณด๊ณ  ์งˆ๋ฌธํ•˜์‹  ๋‚ด์šฉ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

๊ฐœ๋…์— ๋Œ€ํ•œ ์ •๋ฆฌ

์”จ์œ ๋ ˆํ„ฐ ๋กœ๊ทธ์ธ or 3rd party ๋กœ๊ทธ์ธ์„ ๊ฐ๊ฐ ๋‹ค๋ฅธ diagram์— ํ‘œํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์”จ์œ ๋ ˆํ„ฐ ๋กœ๊ทธ์ธ ํ›„, ํ† ํฐ ๋ฐœ๊ธ‰ ๊ณผ์ •

authorization flow

  1. SPA์—์„œ ๋ Œ๋”๋งํ•œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์—์„œ ์ธ์ฆ ์„œ๋ฒ„์˜ ๋กœ๊ทธ์ธ API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์œ ์ € ์„ธ์…˜์„ ์ƒ์„ฑํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•ฉ๋‹ˆ๋‹ค.
  2. ์ธ์ฆ ์„œ๋ฒ„๋กœ authorization request๋ฅผ ํ•˜๊ธฐ ์ „์— ํด๋ผ์ด์–ธํŠธ์—์„œ state, nonce, code_challenge, code_verifier๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  1. state๋Š” CSRF๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ์ด๋ฉฐ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ƒ์„ฑํ•œ ๋žœ๋ค ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
  2. nonce๋Š” Replay Attack์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ์ด๋ฉฐ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ƒ์„ฑํ•œ ๋žœ๋ค ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
  3. code_verifier: code_verifier๋Š” authorization code injection์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ์ด๋ฉฐ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ƒ์„ฑํ•œ ํŠน์ • ๋ฌธ์ž๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ 48~120์ž์˜ ๋žœ๋ค ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
  4. code_challenge: Base64(SHA256(code_verifier)
  1. ์ธ์ฆ ์„œ๋ฒ„๋กœ authorization request๋ฅผ ์š”์ฒญํ•˜๋ฉฐ state, nonce, code_challenge๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  2. ์ธ์ฆ ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ code, state ๊ฐ’๊ณผ ํ•จ๊ป˜ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ๋ฐ›์€ ํŽ˜์ด์ง€์—์„œ state ๊ฐ’์ด ๋™์ผํ•œ์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  3. ์ธ์ฆ ์„œ๋ฒ„๋กœ token request๋ฅผ ์š”์ฒญํ•˜๋ฉฐ code, code_verifier๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  4. ์ธ์ฆ ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ access_token, id_token์„ ์‘๋‹ต ๋ฐ›์œผ๋ฉฐ, id_token์˜ payload(claim)์— ํฌํ•จ๋œ nonce๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

3rd party๋กœ ๋กœ๊ทธ์ธ ํ›„, ํ† ํฐ ๋ฐœ๊ธ‰ ๊ณผ์ •

authorization flow - 3rd party

  1. 3rd party(์นด์นด์˜ค/๋„ค์ด๋ฒ„) ๋กœ๊ทธ์ธํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด 3rd party์˜ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋กœ๊ทธ์ธ ํ›„, callback_url๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ธ์ฆ ์„œ๋ฒ„์—์„œ 3rd party ์—‘์„ธ์Šค ํ† ํฐ ๋ฐœ๊ธ‰ ๋ฐ ์”จ์œ ๋ ˆํ„ฐ ํšŒ์› ๊ฐ€์ž… ๋ฐ ์œ ์ € ์„ธ์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  4. ์ด ํ›„์˜ ๊ณผ์ •์€ ์œ„์˜ ์”จ์œ ๋ ˆํ„ฐ ๋กœ๊ทธ์ธ ํ›„, ํ† ํฐ ๋ฐœ๊ธ‰ ๊ณผ์ •์˜ 2๋ฒˆ๋ถ€ํ„ฐ 6๋ฒˆ ๊นŒ์ง€์˜ ๊ณผ์ •์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

์˜คํ•ด์— ๋Œ€ํ•œ ์ •๋ฆฌ

image
  1. ์žฌ์˜๋‹˜๊ป˜์„œ ์ œ์•ˆํ•˜๋Š” ๋ณ€๊ฒฝ ๋ฐฉ์‹์œผ๋กœ ์ฒจ๋ถ€ํ•ด์ฃผ์‹  ๋‚ด์šฉ์— ํ•ด๋‹นํ•˜๋Š” flow๋Š” 3rd party๋กœ ๋กœ๊ทธ์ธ ํ›„, ํ† ํฐ ๋ฐœ๊ธ‰ ๊ณผ์ •์— ํ•ด๋‹นํ•˜๋ฉฐ ๊ฐ 3rd party๋“ค์˜ ๊ตฌํ˜„์ด ๋‹ค๋ฅด๋ฏ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ ํ‘œ๊ธฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ˜„์žฌ ์ฃผ๊ณ  ๋ฐ›๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ๋“ค์€ ๊ธฐ์ž…๋˜์ง€ ์•Š์€ ๋ฏธ์™„์„ฑ ์ƒํƒœ์ž…๋‹ˆ๋‹ค ๐Ÿ˜‚
  2. state, nonce๋Š” code ๊ฐ’์œผ๋กœ token์„ ๊ตํ™˜ํ•˜๋Š” callback์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณณ์—์„œ ์ƒ์„ฑํ•˜๊ณ  ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. 3rd party ๋กœ๊ทธ์ธ ํ›„์— callback์€ ํšŒ์›๊ฐ€์ž… ๋ฐ ์œ ์ € ์„ธ์…˜ ์ƒ์„ฑ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋ฏ€๋กœ callback์€ ์ธ์ฆ ์„œ๋ฒ„์—์„œ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ 3rd party authorization request URI๋Š” ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€

nonce ์—ฌ๋ถ€

nonce๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ‘œ๊ธฐํ•œ ๊ณณ์€ ๊ณณ์€ slient renew ๋ถ€๋ถ„์— ํ•ด๋‹นํ•˜๋Š” 3rd party๊ฐ€ ์•„๋‹Œ ์”จ์œ ๋ ˆํ„ฐ์˜ ์ธ์ฆ ์„œ๋ฒ„์™€์˜ authorization request & token request ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์นด์นด์˜ค ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” OIDC๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 3rd party๋Š” ์ง€์›ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๊ฐ๊ฐ ๋‹ค๋ฅด๊ธฐ ๋–„๋ฌธ์— ๊ตฌํ˜„ ๋‚ด์šฉ๋„ ๋‹ค๋ฅผ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

PKCE์—์„œ ํ”„๋ก ํŠธ์—”๋“œ์˜ ํ•ธ๋“ค๋ง ๋ฒ”์œ„

code_verifier, code_challenge๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค. ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ๋Š” ํ™”์‚ดํ‘œ์—์„œ ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๊ณ  ํ•ด๋‹น ์š”์ฒญ ๋˜๋Š” ์‘๋‹ต์„ ๋ฐ›์€ ์ชฝ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ์ผ์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด Request tokenํ›„์— ์ธ์ฆ ์„œ๋ฒ„์—์„œ code_challenge๋ฅผ ๊ฒ€์ฆํ•˜๊ณ  token์„ Responseํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. code_challenge_method ๋˜ํ•œ ์ „๋‹ฌ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ๋Š” ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ชจ๋“  ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์— ๋Œ€ํ•ด์„œ ์•„์ง ๋ช…์‹œํ•˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ฒฐ๋ก ์€ ์„œ๋กœ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š”๋Œ€๋กœ ์ง„ํ–‰ํ•˜๋ฉด ๋˜๊ณ  ๋ณ€๊ฒฝํ•  ๋‚ด์šฉ์€ ์—†์Šต๋‹ˆ๋‹ค!

RedirectURI ์‘๋‹ต ์ฝ”๋“œ ์—ฌ๋ถ€

Oauth ์ŠคํŽ™์—์„œ redirect_uri๊ฐ€ optionalํ•œ ๊ฐ’์ด๋ฏ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์”จ์œ ๋ ˆํ„ฐ์˜ ์ธ์ฆ ์„œ๋ฒ„์—์„œ๋Š” SPA์—์„œ slientํ•˜๊ฒŒ authorization request & token request๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 3rd party ์ธ์ฆ์˜ ๊ฒฝ์šฐ์—๋Š” callback์„ ๋ฐ›์•„์•ผํ•  ๋Œ€์ƒ์„ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋–„๋ฌธ์— ํ•„์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์นด์นด์˜ค redirect_uri ํ•„์ˆ˜ ๋„ค์ด๋ฒ„ redireect_uri ํ•„์ˆ˜

๋งˆ๋ฌด๋ฆฌ

์šฐ์„  ๊ธ€๊ณผ ๋‹ค์ด์–ด๊ทธ๋žจ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์•„์„œ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ์—ˆ๋„ค์š”.. ๐Ÿ˜ญ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ํŒ€์›๋“ค(@JengYoung, @Msukoo)๊ณผ ํ•จ๊ป˜ ๋ณด์™„ํ•ด๋‚˜๊ฐ€๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๊ณ  ์ธ์ฆ ๊ด€๋ จ API ์ŠคํŽ™๋„ ๋ฌธ์„œ๋กœ ์ •๋ฆฌํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๊ธด ๊ธ€ ์ฝ์œผ์‹œ๋Š๋ผ ์ˆ˜๊ณ  ๋งŽ์œผ์…จ์Šต๋‹ˆ๋‹ค. ๊ถ๊ธˆํ•œ ์  ์žˆ์œผ์‹œ๋ฉด ๋‚ด์šฉ ๋‚จ๊ฒจ์ฃผ์„ธ์š” ๐Ÿ™‡โ€โ™‚๏ธ

JengYoung commented 1 year ago

์‹ค์ˆ˜๋กœ ๋‹ซ๊ธฐ๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ๋˜ ๋‹ค์‹œ ์“ฐ๋„ค์š”... ๐Ÿ˜–๐Ÿฅฒ๐Ÿ˜ญ

@sinbom ์ž์„ธํ•œ ์„ค๋ช… ๊ฐ์‚ฌ๋“œ๋ ค์š”! ์ €๋„ ๋•๋ถ„์— ์ดํ•ด๊ฐ€ ๋งŽ์ด ๋์–ด์š” ๐Ÿ™†๐Ÿป ์ถ”๊ฐ€์ ์œผ๋กœ state, nonce ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•  ๋ถ€๋ถ„์ด ์กด์žฌํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚จ๊น๋‹ˆ๋‹ค!

image

state์™€ nonce๋ฅผ ๋ถ„๋ฆฌํ•œ ์ด์œ 

์ผ๋‹จ ์ด๋Ÿฌํ•œ ์„ค๋ช…์ด ๋‚˜์˜จ ๋ฐฐ๊ฒฝ์€ ํ•ด๋‹น ๋‹ต๋ณ€์— ๋Œ€ํ•ด ์•„์ง ์ •ํ™•ํžˆ ํŒ๋‹จ์ด ๋˜์ง€ ์•Š์•„์„œ์—์š”!

state, nonce๋Š” code ๊ฐ’์œผ๋กœ token์„ ๊ตํ™˜ํ•˜๋Š” callback์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณณ์—์„œ ์ƒ์„ฑํ•˜๊ณ  ๊ฒ€์ฆํ•œ๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ ์ธก ์ƒ๊ฐ: ์œ„ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์”จ์œ ๋ ˆํ„ฐ ํ† ํฐ ๊ตํ™˜ ์ฝœ๋ฐฑ์—์„œ๋งŒ ํ•„์š”ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

state, nonce๋Š” ์ด์ „์— 3rd party์™€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํ˜ธ์ž‘์šฉ์— ์žˆ์–ด์„œ๋„ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์•„์š”! (nonce๋Š” ์นด์นด์˜ค์—์„œ๋งŒ) SDK์—์„œ๋Š” ๊ฒฐ๊ตญ ํด๋ผ์ด์–ธํŠธ-Oauth ์ œ๊ณต์ž์˜ ํ†ต์‹ ์ด ์ผ์–ด๋‚˜๋Š”๋ฐ์š”. ์ด๋Ÿฌํ•œ ๋กœ์ง์—์„œ์˜ ๋ฌธ์ œ์ ์„ ๋ฐฉ์ง€ํ•˜๊ณ ์ž SDK์— state, nonce๋ฅผ ๋ฏธ๋ฆฌ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ์–ด์š”. (์‹ฌ์ง€์–ด Naver์˜ ๊ฒฝ์šฐ์—๋Š” state๊ฐ€ ์„ค์ •๋œ ๊ฒŒ ์—†๋”๋ผ๋„ ๊ฐ•์ œ๋กœ ๋„ฃ์–ด์ฃผ์–ด์š”.) ํ”„๋ก ํŠธ์—”๋“œ ์ธก์€ ์ด๋ฅผ ํ™œ์šฉํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค!

๊ทธ๋ ‡๊ธฐ์— state๋Š” ๋‹จ์ˆœํžˆ ํ† ํฐ ๊ตํ™˜์— ์žˆ์–ด์„œ๋งŒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์œผ๋กœ ๋ฌธ์žฅ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! (nonce ์—ญ์‹œ ์นด์นด์˜ค ์—ญ์‹œ OIDC๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ด๋ฅผ 3rd party ์ธ์ฆ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ API ํ†ต์‹ ์—์„œ๋„ ์‚ฌ์šฉํ•˜๊ฒ ์ฃ !)

์งˆ๋ฌธ: ํ•ด๋‹น ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ• ์ง€ vs ํ•ด๋‹น ๊ฐ’์„ ์ƒˆ๋กญ๊ฒŒ ๋‹ค์‹œ ์ƒ์„ฑํ• ์ง€

๊ฒฐ๊ตญ ํ”„๋ก ํŠธ์—”๋“œ ์ธก์—์„œ๋Š” SDK ๊ธฐ๋ฐ˜ ๋กœ์ง์„ ๋” ์•ˆ์ •์ ์œผ๋กœ ์šด์šฉํ•˜๊ธฐ ์œ„ํ•ด state, nonce ๊ฐ’์„ ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ ์‹œ ํŽ˜์ด์ง€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์ด์ „์— ์ƒ์„ฑํ•˜๋Š”๋ฐ์š”!

๊ถ๊ธˆํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐ’๋“ค์„ ์šฐ๋ฆฌ ์ธ์ฆ์„œ๋ฒ„์—์„œ ์žฌ์‚ฌ์šฉํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†์„๊นŒ์š”?

์„ค๋ช…์ด ์ •๋ง ์ž์„ธํ•˜์—ฌ ๋‚˜๋จธ์ง€๋Š” ์ž˜ ์ดํ•ด๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜‰ ๊ณ ๋งˆ์›Œ์š”!

์ฐธ๊ณ ์ž๋ฃŒ

์•„๋ž˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ SDK ๋ช…์„ธ์— ๋Œ€ํ•ด ๊ถ๊ธˆํ•˜์‹ค ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค!

JengYoung commented 1 year ago

์•„๋ฌด๋ž˜๋„ state์™€ nonce์˜ ๋ฒ”์œ„๊ฐ€ ์šฐ๋ฆฌ ์„œ๋ฒ„์—์„œ์˜ ํ† ํฐ ๊ตํ™˜์—๋งŒ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์œผ๋กœ ๊ท€๊ฒฐ๋˜์–ด ์ž์นซ ์จ๋“œํŒŒํ‹ฐ ์ธ์ฆ์— ์žˆ์–ด์„œ์˜ state, nonce์™€ ์˜คํ•ด๊ฐ€ ์žˆ์„๊นŒ๋ด ์‚ฌ์ „์— ์žฌํ™•์ธ ์š”์ฒญ ๋“œ๋ฆฌ๋Š” ์  ์–‘ํ•ด ๋ถ€ํƒ๋“œ๋ ค์š”! ๐Ÿ™‡๐Ÿปโ€โ™‚๏ธ

sinbom commented 1 year ago

@JengYoung ํ™•์ธ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์“ฐ์‹  ๊ธ€์ด ๋‹ค ๋‚ ๋ผ๊ฐ€์„œ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์…จ๋‹ค๋‹ˆ,, ๐Ÿ˜‚ ์ €๋„ ๊ทธ๋Ÿฐ ์ ์ด ์žˆ์–ด์„œ markdown editor์—์„œ ์ž‘์„ฑํ•ด์„œ ๋ถ™์—ฌ๋„ฃ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ ์ธก ์ƒ๊ฐ: ์œ„ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์”จ์œ ๋ ˆํ„ฐ ํ† ํฐ ๊ตํ™˜ ์ฝœ๋ฐฑ์—์„œ๋งŒ ํ•„์š”ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

Oauth ์ œ๊ณต์ž์—์„œ ์ง€์›ํ•˜๋Š” Javascript SDK๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐฑ์—”๋“œ๊ฐ€ ์—†๋Š” SPA์—์„œ์˜ ์‚ฌ์šฉ์„ ๋ชฉ์ ์œผ๋กœ ์ œ๊ณต๋˜์—ˆ๋˜ ๊ฒƒ์œผ๋กœ ์•Œ๊ณ ์žˆ์Šต๋‹ˆ๋‹ค. state๋Š” CSRF๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์ธ๋ฐ ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์‹ค์งˆ์ ์œผ๋กœ CSRF๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ํšจ๊ณผ๋ฅผ ๊ฐ€์ง€๊ธฐ ์œ„ํ•ด์„œ๋Š” callback์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณณ์—์„œ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด CSRF ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๋กœ๊ทธ์ธ์ด ๋˜์–ด ์žˆ๋Š” ์ƒํ™ฉ์—์„œ ๊ณต๊ฒฉ์ž์˜ ์›น ์‚ฌ์ดํŠธ์—์„œ authorization request๋ฅผ ํ•˜๊ฒŒ๋˜๋ฉด code๊ฐ€ ํฌํ•จ๋œ redirect_uri๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ์‹ค์ œ๋กœ ํ† ํฐ์„ ๋ฐœ๊ธ‰ ๋ฐ›๋Š” callback ์ฒ˜๋ฆฌ๋Š” ์„œ๋ฒ„์—์„œ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— state ๊ฒ€์ฆ์ด ์„œ๋ฒ„์—์„œ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์œผ๋ฉด state ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์‹ค์งˆ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์˜๋ฏธ๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ณต๊ฒฉ์ž๊ฐ€ code๋ฅผ ํƒˆ์ทจํ•˜๊ฒŒ ๋œ ๊ฒฝ์šฐ์—๋„ callback์— ํ•ด๋‹นํ•˜๋Š” redirect_uri๋กœ code ๊ฐ’์„ ์ „๋‹ฌํ•˜๋ฉด ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ณต๊ฒฉ์ž์˜ ์š”์ฒญ์ธ์ง€ ์œ ํšจํ•œ Oauth ์ œ๊ณต์ž์˜ callback ์š”์ฒญ์ธ์ง€ ์•Œ ์ˆ˜ ์—†์ง€๋งŒ(PKCE ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ฐ€๋Šฅ) state๋ฅผ ํ†ตํ•ด ์ •์ƒ์ ์ธ ์š”์ฒญ์ธ์ง€ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ์—๋Š” ์„œ๋ฒ„์—์„œ 3rd party authorize request์‹œ์— ์ƒ์„ฑ๋œ state๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๊ณ  ์•Œ๊ณ  ์žˆ์–ด์•ผ ๊ฒ€์ฆ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

state, nonce๋Š” code ๊ฐ’์œผ๋กœ token์„ ๊ตํ™˜ํ•˜๋Š” callback์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณณ์—์„œ ์ƒ์„ฑํ•˜๊ณ  ๊ฒ€์ฆํ•œ๋‹ค.

์œ„์˜ ๋‚ด์šฉ์€ state๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฃผ์ฒด๊ฐ€ ์„œ๋ฒ„๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , ์„œ๋ฒ„์—์„œ ์ƒ์„ฑํ•œ state ๋˜๋Š” aurhotization request URI๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์—์„œ ์ด๋ฅผ 3rd party ๋กœ๊ทธ์ธ์— ์‚ฌ์šฉํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์˜๋ฏธ์˜€์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ SDK๋ฅผ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด state๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•ด์•ผ ๋  ๊ฒƒ ๊ฐ™๋„ค์š”..

์งˆ๋ฌธ: ํ•ด๋‹น ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ• ์ง€ vs ํ•ด๋‹น ๊ฐ’์„ ์ƒˆ๋กญ๊ฒŒ ๋‹ค์‹œ ์ƒ์„ฑํ• ์ง€

state, nonce๋Š” ๋งค ์ƒˆ๋กœ์šด authorization request ๋งˆ๋‹ค ์ƒ์„ฑํ•ด์•ผํ•˜๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค. ์žฌ์‚ฌ์šฉ์„ํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์ด ๊ฐ€์ง€๋Š” ์˜๋ฏธ๊ฐ€ ์‚ฌ๋ผ์ง€๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

JengYoung commented 1 year ago

@sinbom @Msukoo

12์›” 31์ผ 1์‹œ 20๋ถ„ ~ 2์‹œ 50๋ถ„๊นŒ์ง€ ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆ„๋ฉฐ ๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ณด์•˜์๋‹ˆ๋‹ค! PR์— ์˜ฌ๋ฆฌ๊ธฐ๋กœ ํ•œ ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ๋Š”, ์ด ์งˆ๋ฌธ์„ ํ•ด๊ฒฐํ•œ ์ดํ›„ ์ž‘์„ฑํ•˜์—ฌ ์š”์ฒญํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ •๋ฆฌ

Oauth

  1. ๋ณธ๋ž˜ ๋ฐฑ์—”๋“œ์—์„œ ์ฝœ๋ฐฑ์„ ์ˆ˜ํ–‰ํ•ด๋„ ๋˜์ง€๋งŒ ์šฐ๋ฆฌ ์ธ์ฆ์ ˆ์ฐจ๋Š” SDK๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•œ ํŠน์ˆ˜ํ•œ ์ผ€์ด์Šค์ž…๋‹ˆ๋‹ค! (์‚ฌ์‹ค ์•ˆ ์จ๋„ ๋ผ์„œ, ๋ฐฑ์—”๋“œ ๋ถ„๋“ค๊ป˜์„œ ๊ฒฐ์ •ํ•ด์ฃผ์…”๋„ ๋ฌด๋ฐฉํ•  ๊ฒƒ ๊ฐ™์•„์š” ๐Ÿ˜‰)
  2. ๋”ฐ๋ผ์„œ state๋ฅผ <์”จ์œ ๋ ˆํ„ฐ ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„>์—์„œ ์ƒ์„ฑํ•˜๊ณ  <์”จ์œ ๋ ˆํ„ฐ ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„>์™€ <3rd party ์ธ์ฆ ์„œ๋ฒ„>์˜ ๊ฒ€์ฆ ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์ณ <๋ธŒ๋ผ์šฐ์ €>๊ฐ€ ํŒ๋‹จํ•˜์—ฌ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ทธ๋ ‡๋‹ค๋ฉด ์—์„œ <์”จ์œ ๋ ˆํ„ฐ ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„>๊ฐ€ <์”จ์œ ๋ ˆํ„ฐ ์ธ์ฆ ์„œ๋ฒ„>๊ฐ€ ์ธ์ฆ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. (์ด๋•Œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” 3rd party Oauth API์—์„œ์˜ ๋ช…์„ธ๊ฐ€ ํ†ต์ผ๋˜์ง€ ์•Š์•˜๊ธฐ์— ์•„์ง ํ™•์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.)
  4. <์”จ์œ ๋ ˆํ„ฐ ์ธ์ฆ ์„œ๋ฒ„>๋Š” <3rd party ์ธ์ฆ์„œ๋ฒ„>์™€ ์ธ์ฆ ์š”์ฒญ/์‘๋‹ต์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ <์”จ์œ ๋ ˆํ„ฐ ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„>์— ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  5. <์”จ์œ ๋ ˆํ„ฐ ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„>๋Š” ๊ฒฐ๊ณผ๋ฅผ ํŒ๋‹จํ•˜์—ฌ <์ธ๋ฑ์Šค ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ>๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Silent Refresh

  1. ์ดํ›„ <๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋œ ํŽ˜์ด์ง€>์—์„œ ์ฒซ ๋ Œ๋”๋ง์ด ๋  ๋•Œ ํ† ํฐ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” silent refresh๋กœ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2. silent refresh๋Š” PKCE ๋ฐฉ์‹์„ ์ฑ„์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ๊ฒ€์ฆ์— ์žˆ์–ด ๋ณด์ด์ง€ ์•Š๋Š” ์˜์—ญ์—์„œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋กœ์ง์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Hidden Iframe์„ ํ†ตํ•ด code_challenge์™€ code_verifier ๊ฒ€์ฆ์„ ๋ณด์ด์ง€ ์•Š๋Š” ์˜์—ญ์—์„œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๋ฉฐ ํ† ํฐ ๊ฒ€์ฆ/๋ฆฌํ”„๋ ˆ์‹œ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋งŒ ์•„๊นŒ ์ด์•ผ๊ธฐ์—์„œ๋„ ๋ง์”€๋“œ๋ ธ๋“ฏ ๋ช‡ ์‹œ๊ฐ„์„ ์ƒ๊ฐํ•ด๋„ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ์˜๋ฌธ์ด ์žˆ์–ด ์žฌ์ฐจ ์งˆ๋ฌธ ๋“œ๋ฆฝ๋‹ˆ๋‹ค...!

์งˆ๋ฌธ: PKCE์˜ ์žฅ์ ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ณผ์ •์—์„œ cookie ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™”๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ, ํ˜น์‹œ ์ด์™€ ๊ด€๋ จ๋œ ๋ถ€๊ฐ€ ์„ค๋ช…์ด ๊ฐ€๋Šฅํ• ๊นŒ์š”? ์ด์œ : ๋น ๋ฅธ ์‹œ๊ฐ„ ๋‚ด์— ์ดํ•ด๋ฅผ ํ•˜๋˜ ๊ณผ์ •์—์„œ ๋ง์”€ํ•˜์‹  cookie๊ฐ€ ์–ด๋–ค ์ฟ ํ‚ค์ธ์ง€ ์•„์ง ์ธ์ง€๊ฐ€ ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ž…๋‹ˆ๋‹ค...!

PKCE์™€ ๊ด€๋ จํ•œ ์ฟ ํ‚ค ์š”์ฒญ/์‘๋‹ต์— ๋Œ€ํ•ด ๋ช‡ ์‹œ๊ฐ„์„ ์ฐพ์•„๋ณด์•˜์ง€๋งŒ ์•Œ๊ฒŒ ๋œ ๊ฒƒ์ด๋ผ๊ณ ๋Š”

๋ฐ–์— ์ธ์ง€ํ•˜์ง€ ๋ชปํ•œ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์ดํ•ด๋ฅผ ์œ„ํ•ด ๋„์›€ ๋ถ€ํƒ๋“œ๋ ค์š” ๐Ÿ™๐Ÿป ์—ฐ๋ง์ธ๋ฐ, ์ข‹์€ ํ•˜๋ฃจ ๋ณด๋‚ด์‹œ๊ตฌ, ํŽธํ•˜์‹ค ๋•Œ ๋‹ต๋ณ€ํ•ด์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค ๐Ÿ˜† ์ž์„ธํ•˜๊ณ  ์นœ์ ˆํ•œ ์„ค๋ช… ๊ณ ๋งˆ์›Œ์š”!

sinbom commented 1 year ago

@JengYoung ์˜ค๋Š˜ ํ•˜๋ฃจ ์—ด์‹ฌํžˆ ๋…ผ์˜ํ•œ ๋ณด๋žŒ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํ•˜๊ฒŒ ์ž˜ ์ดํ•ด๊ฐ€ ๋˜์‹  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ๐Ÿ˜Š

๋ณธ๋ž˜ ๋ฐฑ์—”๋“œ์—์„œ ์ฝœ๋ฐฑ์„ ์ˆ˜ํ–‰ํ•ด๋„ ๋˜์ง€๋งŒ ์šฐ๋ฆฌ ์ธ์ฆ์ ˆ์ฐจ๋Š” SDK๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•œ ํŠน์ˆ˜ํ•œ ์ผ€์ด์Šค์ž…๋‹ˆ๋‹ค! (์‚ฌ์‹ค ์•ˆ ์จ๋„ ๋ผ์„œ, ๋ฐฑ์—”๋“œ ๋ถ„๋“ค๊ป˜์„œ ๊ฒฐ์ •ํ•ด์ฃผ์…”๋„ ๋ฌด๋ฐฉํ•  ๊ฒƒ ๊ฐ™์•„์š” ๐Ÿ˜‰)

ํ˜„์žฌ ์ƒํ™ฉ์—์„œ๋Š” SDK๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•˜๋‹ค๋Š” ์˜๊ฒฌ์ž…๋‹ˆ๋‹ค. @JengYoung๋‹˜ ๊ป˜์„œ ํ˜น์‹œ SDK๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ ๋“ค์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ด์ฃผ์‹œ๊ณ  ๊ดœ์ฐฎ๋‹ค๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ๐Ÿ™

์งˆ๋ฌธ: PKCE์˜ ์žฅ์ ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ณผ์ •์—์„œ cookie ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™”๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ, ํ˜น์‹œ ์ด์™€ ๊ด€๋ จ๋œ ๋ถ€๊ฐ€ ์„ค๋ช…์ด ๊ฐ€๋Šฅํ• ๊นŒ์š”? ์ด์œ : ๋น ๋ฅธ ์‹œ๊ฐ„ ๋‚ด์— ์ดํ•ด๋ฅผ ํ•˜๋˜ ๊ณผ์ •์—์„œ ๋ง์”€ํ•˜์‹  cookie๊ฐ€ ์–ด๋–ค ์ฟ ํ‚ค์ธ์ง€ ์•„์ง ์ธ์ง€๊ฐ€ ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ž…๋‹ˆ๋‹ค...!

์•„๋งˆ PKCE๊ฐ€ ์•„๋‹Œ iframe์—์„œ ๋‚˜์˜จ ์ด์•ผ๊ธฐ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. hidden iframe์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ authorize request ํŽ˜์ด์ง€์—์„œ์˜ csrf ํ† ํฐ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์„ธ์…˜ ์ฟ ํ‚ค์˜ domain attribute์˜ value๋ฅผ ํด๋ผ์ด์–ธํŠธ์˜ ๋„๋ฉ”์ธ(subdomain)๊นŒ์ง€ ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๊ณ  ์ธ์ฆ ์„œ๋ฒ„์˜ ๋„๋ฉ”์ธ์—๋งŒ ํ•œ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์”€์„ ๋“œ๋ ธ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

JengYoung commented 1 year ago

๋‹ค์‹œ ํ•œ ๋ฒˆ 10์‹œ 30๋ถ„ ๊ฒฝ์— @sinbom ๋‹˜๊ป˜ ํ™•์ธํ•œ ๊ฒฐ๊ณผ ์•ž์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

SDK ์ œ๊ฑฐ ์‹œ ๋ณ€๋™์‚ฌํ•ญ - ํ”„๋ก ํŠธ์—”๋“œ ์ธก

state, nonce ์ƒ์„ฑ ๋กœ์ง ์ œ๊ฑฐ

์ด์ œ ์•ž์œผ๋กœ CSRF ๋ฐ Replay attack์„ ๋ง‰๊ธฐ ์œ„ํ•œ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ƒ์„ฑ/๊ฒ€์ฆ ์ฃผ์ฒด๋Š” ๋ฐฑ์—”๋“œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

redirect page ์ œ๊ฑฐ

Oauth๋ฅผ ์œ„ํ•œ redirect page๋Š” ๋”์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ค๋กœ์ง€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋Š” ๋ฐฑ์—”๋“œ์—์„œ์˜ ์‘๋‹ต์— ๋”ฐ๋ผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋™์‹œ์ผœ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ ์ธก - redirect_uri ์„ค์ • ๋ฐ ํ”„๋ก ํŠธ์—”๋“œ ์ธก์— ์ „๋‹ฌ

๋ฐฑ์—”๋“œ ์ธก์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์ œ๊ฒŒ ์•Œ๋ ค์ฃผ์‹œ๋ฉด, ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค :)

ํ–ฅํ›„ ๊ณผ์ œ

silent refresh

UX์˜ ์ค‘๋‹จ ์—†์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ silent refresh ์ „๋žต์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค! ํ˜„์žฌ ํŒŒ์•… ๊ฒฐ๊ณผ, ์ฟ ํ‚ค์— ๊ด€ํ•œ ๋ธŒ๋ผ์šฐ์ € ๋ณ„ ์ด์Šˆ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„, ์ด๋ฅผ ํ•œ ๋ฒˆ playground ๋ ˆํฌ๋ฅผ ํŒŒ์„œ, ํ…Œ์ŠคํŠธ ํ›„ ์ ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค~

์—ด๋ถ„ ์ƒˆํ•ด๋ณต ๋งŽ์ด ๋ฐ›์œผ์”ธ์‡ผ...