[ํ”„๋กœ์ ํŠธ] ๐Ÿ”Ž OAuth ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ

jeeenyยท2024๋…„ 10์›” 7์ผ

OAuth ๊ฐœ์š”

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

OAuth ํ”„๋กœํ† ์ฝœ์€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฆฌ์†Œ์Šค ์˜ค๋„ˆ๋ฅผ ๋Œ€์‹ ํ•ด ์„œ๋ฒ„์˜ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

OAuth ํ”„๋กœํ† ์ฝœ์€ ๋ณดํ˜ธ๋˜์–ด์žˆ๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์œ„์ž„ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ณตํ†ต์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์›น์‚ฌ์ดํŠธ ๋ฐ ์ธํ„ฐ๋„ท ์„œ๋น„์Šค์˜ ์›น ๊ฐœ๋ฐœ์ž๋“ค๋กœ ๊ตฌ์„ฑ๋œ ์†Œ๊ทœ๋ชจ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋งŒ๋“ค์–ด์กŒ๋‹ค. OAuth ํ”„๋กœํ† ์ฝœ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „(1.0)์€ 2007๋…„์— ์•ˆ์ •ํ™”๋˜์—ˆ๊ณ  OAuth 2.0์€ 2012๋…„์— ํ‘œ์ค€ํ™”๋˜์—ˆ๋‹ค.

OAuth ์šฉ์–ด ์ •๋ฆฌ

OAuth ์šฉ์–ด๋Š” OAuth ๊ฐœ๋…์ด๋‚˜ ๋™์ž‘ ํ๋ฆ„์„ ์ดํ•ดํ•  ๋•Œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ฆฌํ•˜๊ณ  ๋„˜์–ด๊ฐ„๋‹ค.

์šฉ์–ด์„ค๋ช…
Protected Resource(๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค)OAuth ์ธ์ฆ ์š”์ฒญ์„ ์‚ฌ์šฉํ•ด์„œ ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ œํ•œ๋œ ๋ฆฌ์†Œ์Šค
โ†’ ์นด์นด์˜ค ์„œ๋ฒ„์— ์ €์žฅ๋˜์–ด์žˆ๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋œปํ•œ๋‹ค
Resource Owner(๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž)๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์ฒด
โ†’ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๊ณ ์žํ•˜๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๋œปํ•œ๋‹ค
Client(ํด๋ผ์ด์–ธํŠธ)OAuth ์ธ์ฆ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” HTTP ํด๋ผ์ด์–ธํŠธ
โ†’ ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ˜„ํ•œ ์„œ๋น„์Šค๋ฅผ ๋œปํ•œ๋‹ค
Server(์„œ๋ฒ„)OAuth ์ธ์ฆ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๋Š” HTTP ์„œ๋ฒ„
โ†’ ์นด์นด์˜ค ์„œ๋ฒ„๋ฅผ ๋œปํ•œ๋‹ค
Credentials(์ž๊ฒฉ ์ฆ๋ช…)์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋˜๋Š” ์‚ฌ์šฉ์ž ๊ถŒํ•œ์„ ์ฆ๋ช…ํ•˜๋Š” ์ •๋ณด
Token(ํ† ํฐ)์„œ๋ฒ„์— ์˜ํ•ด ๋ฐœํ–‰๋˜๊ณ  ํด๋ผ์ด์–ธํŠธ์— ์˜ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ณ ์œ ํ•œ ์‹๋ณ„์ž

OAuth ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

์ „ํ†ต์ ์ธ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์ธ์ฆ ๋ชจ๋ธ์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž์˜ ์ธ์ฆ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์ด ์‚ฌ์šฉ๋˜์—ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ๋น„๋ฐ€๋ฒˆํ˜ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ด๋ฅผ ์ด์šฉํ•ด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์š”์ฒญํ–ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

์„œ๋“œํŒŒํ‹ฐ(Third-Party) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž์˜ ์ธ์ฆ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜๋ฉฐ ๋Œ€๋ถ€๋ถ„์ด ๊ฒฝ์šฐ ์ด ์ •๋ณด๋ฅผ ํ‰๋ฌธ์œผ๋กœ ์ €์žฅํ•ด ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์„œ๋“œํŒŒํ‹ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž๋กœ๋ถ€ํ„ฐ ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์€ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌ๋ฐ›๊ฒŒ ๋˜์–ด ํ•„์š” ์ด์ƒ์œผ๋กœ ๋งŽ์€ ๊ถŒํ•œ์„ ํ–‰์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„œ๋“œํŒŒํ‹ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์œ ์ถœ๋˜๋ฉด๊ทธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋ณดํ˜ธ๋˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ๋  ์œ„ํ—˜์ด ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด OAuth ๊ธฐ์ˆ ์ด ๋„์ž…๋˜์—ˆ๋‹ค. OAuth๋Š” ๊ถŒํ•œ ๋ถ€์—ฌ ๊ณ„์ธต์„ ๋„์ž…ํ•ด ํด๋ผ์ด์–ธํŠธ์™€ ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž์˜ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•œ๋‹ค. OAuth๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž์˜ ์ธ์ฆ ์ •๋ณด๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์•ก์„ธ์Šค ํ† ํฐ์ด๋ผ๋Š” ์ธ์ฆ ์ˆ˜๋‹จ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋”˜๋‹ค. ์•ก์„ธ์Šค ํ† ํฐ์€ ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž์˜ ์Šน์ธ ํ•˜์— ์„œ๋“œํŒŒํ‹ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฐœ๊ธ‰๋˜๋ฉฐ ์ด ํ† ํฐ์„ ํ†ตํ•ด ์„œ๋“œํŒŒํ‹ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

OAuth 1.0๊ณผ OAuth 2.0 ์ฐจ์ด

OAuth 2.0 ํ”„๋กœํ† ์ฝœ์€ OAuth 1.0๊ณผ ํ•˜์œ„ ํ˜ธํ™˜๋˜์ง€ ์•Š์œผ๋ฉฐ ๋งค์šฐ ๋‹ค๋ฅธ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์นด์นด์˜ค๋ฅผ ๋น„๋กฏํ•ด ๋Œ€๋ถ€๋ถ„์˜ ์„œ๋น„์Šค์—์„œ OAuth 2.0์„ ์ง€์›ํ•œ๋‹ค. ๋‘ ๋ฒ„์ „ ๊ฐ„์˜ ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์„ ์‚ดํŽด๋ณด๋ฉฐ OAuth 2.0 ํ”„๋กœํ† ์ฝœ์˜ ํŠน์ง•์„ ์ดํ•ดํ•˜๊ณ ์ž ํ•œ๋‹ค.

๋ณต์žก๋„์™€ ์‚ฌ์šฉ ํŽธ์˜์„ฑ

OAuth 1.0์€ ์š”์ฒญ๋งˆ๋‹ค ์•”ํ˜ธํ™”๋œ ์„œ๋ช…์„ ์š”๊ตฌํ•˜๋Š” ๋ณต์žกํ•œ ๋ฐฉ์‹์ด์—ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” HMAC-SHA1 ๋˜๋Š” RSA-SHA1๊ณผ ๊ฐ™์€ ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด ๊ฐ ์š”์ฒญ์„ ์•”ํ˜ธํ™”ํ•ด์•ผ ํ–ˆ๋‹ค. ๋ฐ˜๋ฉด OAuth 2.0์—์„œ๋Š” ์„œ๋ช…์„ ์š”๊ตฌํ•˜์ง€ ์•Š๊ณ  TLS/SSL์„ ํ†ตํ•ด ํ†ต์‹  ๋ณด์•ˆ์„ ๋ณด์žฅํ•จ์œผ๋กœ์จ ์ธ์ฆ ์ ˆ์ฐจ๋ฅผ ๋‹จ์ˆœํ™”ํ–ˆ๋‹ค. OAuth 2.0์˜ ๊ตฌํ˜„๊ณผ ์‚ฌ์šฉ์ด ํ›จ์”ฌ ๊ฐ„ํŽธํ•ด์กŒ๋‹ค.

Scope ๊ธฐ๋Šฅ

Scope ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๋ฉด์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์— ์š”์ฒญํ•˜๋Š” ๊ถŒํ•œ์„ ์„ธ๋ถ„ํ™”ํ•ด์„œ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž๊ฐ€ ์„œ๋“œํŒŒํ‹ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๊ถŒํ•œ๋งŒ์„ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋ณด์•ˆ ์ธก๋ฉด์—์„œ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•„์š”ํ•œ ๊ถŒํ•œ๋งŒ ์š”์ฒญํ•จ์œผ๋กœ์จ ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž์˜ ๋ถˆํ•„์š”ํ•œ ๊ถŒํ•œ ๋…ธ์ถœ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์„œ๋ฒ„์˜ ์—ญํ•  ๋ณ€ํ™”

์„œ๋ฒ„์˜ ์ค‘์š”ํ•œ ์—ญํ•  ๋ณ€ํ™”๊ฐ€ ์žˆ์—ˆ๋‹ค. Authorization Server(๊ถŒํ•œ ์„œ๋ฒ„)์™€ Resource Server(๋ฆฌ์†Œ์Šค ์†Œ๋ฒ„)์˜ ์—ญํ• ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋˜์—ˆ๋‹ค. OAuth 1.0์—์„œ๋Š” ์„œ๋ฒ„๊ฐ€ ๋ชจ๋“  ์—ญํ• ์„ ๋‹ด๋‹นํ–ˆ๋‹ค. OAuth 2.0์—์„œ๋Š” ๊ถŒํ•œ ์„œ๋ฒ„๊ฐ€ ์ฃผ๋กœ ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ๋‹ด๋‹นํ•˜๋ฉฐ ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž์˜ ์ธ์ฆ ์ •๋ณด์™€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๊ฒ€์ฆํ•œ ํ›„ ๊ทธ ์š”์ฒญ์— ๋งž๋Š” ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•œ๋‹ค. ๋˜ํ•œ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์•ก์„ธ์Šค ํ† ํฐ์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•˜๊ณ  ์œ ํšจํ•œ ํ† ํฐ์ด๋ผ๋ฉด ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ณด์•ˆ, ํ™•์žฅ์„ฑ, ์œ ์—ฐ์„ฑ์„ ๋†’์˜€์œผ๋ฉฐ ๋‹ค์–‘ํ•œ ํด๋ผ์ด์–ธํŠธ ๋ฐ ์„œ๋น„์Šค ํ™˜๊ฒฝ์— ๋” ๋‚˜์€ ์ธ์ฆ/์ธ๊ฐ€ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

ํ† ํฐ ํƒˆ์ทจ ๋ฌธ์ œ ๊ฐœ์„ 

์•ก์„ธ์Šค, ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ ๊ฐœ๋…์„ ๋งŽ์ด ๋“ค์–ด๋ดค์„ ๊ฒƒ์ด๋‹ค. OAuth๋กœ๋ถ€ํ„ฐ ํŒŒ์ƒ๋œ ๊ฐœ๋…์ด๋‹ค. ์•ก์„ธ์Šค ํ† ํฐ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹œ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ฆ ์ˆ˜๋‹จ์ด๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ์ด ํ† ํฐ์„ ์‚ฌ์šฉํ•ด ์ธ์ฆ์„ ๋ฐ›์•„์•ผ ํ•œ๋‹ค. OAuth 1.0์—์„œ๋Š” ์ฃผ๋กœ ์•ก์„ธ์Šค ํ† ํฐ์„ ๊ธด ์‹œ๊ฐ„ ๋™์•ˆ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฐฑ์‹ ์—†์ด ์žฌ์‚ฌ์šฉํ–ˆ๋‹ค. OAuth 2.0๋ถ€ํ„ฐ๋Š” ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ ๊ฐœ๋…์ด ๋„์ž…๋˜๋ฉด์„œ ์•ก์„ธ์Šค ํ† ํฐ์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ์งง๊ฒŒ ์„ค์ •ํ•˜๊ณ  ์‹œ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜๋ฉด ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค.

๊ถŒํ•œ ์š”์ฒญ ๋ฐฉ์‹

OAuth 2.0์€ OAuth 1.0์— ๋น„ํ•ด ๋” ์œ ์—ฐํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ํ™˜๊ฒฝ์— ์ ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก ๋งŽ์€ ๊ฐœ์„ ์ด ์ด๋ฃจ์–ด์กŒ๋‹ค. OAuth 1.0์—์„œ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ์‹์˜ ๊ถŒํ•œ ๋ถ€์—ฌ๋งŒ ์ง€์›ํ–ˆ๋‹ค. ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ถŒํ•œ์„ ์š”์ฒญํ•˜๊ณ  ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ™ฉ์— ๋งž๋Š” ์ตœ์ ํ™”๋œ ๊ถŒํ•œ ์š”์ฒญ ๋ฐฉ์‹์„ ์„ ํƒํ•  ์ˆ˜ ์—†์—ˆ๋‹ค. OAuth 2.0์—์„œ๋Š” Authorization Code, Implicit, Resource Owner Password Credentials, Client Credentials๋ผ๋Š” ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฐฉ์‹์„ ๋„์ž…ํ•ด ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋งž๋Š” ๊ถŒํ•œ ๋ถ€์—ฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง€๋„๋ก ํ–ˆ๋‹ค.

OAuth 2.0 ๋™์ž‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜

A. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž์—๊ฒŒ ๊ถŒํ•œ์„ ์š”์ฒญํ•œ๋‹ค.
B. ํด๋ผ์ด์–ธํŠธ๋Š” ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ๋ฐ›๋Š”๋‹ค. ๊ถŒํ•œ ๋ถ€์—ฌ๋Š” ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž์˜ ๊ถŒํ•œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ž๊ฒฉ ์ฆ๋ช…์œผ๋กœ 4๊ฐ€์ง€์˜ ๊ถŒํ•œ ๋ถ€์—ฌ ์œ ํ˜•์ด ์žˆ์ง€๋งŒ ์ด๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ถŒํ•œ์„ ์š”์ฒญํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๊ถŒํ•œ ์„œ๋ฒ„์—์„œ ์ง€์›ํ•˜๋Š” ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.
C. ํด๋ผ์ด์–ธํŠธ๋Š” ์ธ์ฆ ์„œ๋ฒ„์— ์ธ์ฆ์„ ํ•˜๊ณ  ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์ œ์ถœํ•˜์—ฌ ์•ก์„ธ์Šค ํ† ํฐ์„ ์š”์ฒญํ•œ๋‹ค.
D. ๊ถŒํ•œ ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ธ์ฆํ•˜๊ณ  ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ๊ฒ€์ฆํ•œ ํ›„ ์œ ํšจํ•˜๋ฉด ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•œ๋‹ค.
E. ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์— ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•˜๊ณ  ์•ก์„ธ์Šค ํ† ํฐ์„ ์ œ์‹œํ•˜์—ฌ ์ธ์ฆ์„ ์ง„ํ–‰ํ•œ๋‹ค.
F. ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋Š” ์•ก์„ธ์Šค ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๊ณ  ์œ ํšจํ•˜๋ฉด ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์นด์นด์˜ค ๋กœ๊ทธ์ธ์œผ๋กœ ์‚ดํŽด๋ณด๋Š” OAuth 2.0 ๋ฉ”์ปค๋‹ˆ์ฆ˜

Kakao Developers ๋ฌธ์„œ๊ฐ€ ์นœ์ ˆํ•˜๊ณ  ๊ผผ๊ผผํ•˜๊ฒŒ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

  1. ์‚ฌ์šฉ์ž ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ์„ ํƒํ•˜๋ฉด, ์„œ๋น„์Šค๋Š” ์นด์นด์˜ค API ํ”Œ๋žซํผ ์„œ๋ฒ„๋กœ ์ธ๊ฐ€ ์ฝ”๋“œ ๋ฐœ๊ธ‰์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ธ๊ฐ€ ์ฝ”๋“œ๋Š” ์ž๊ฒฉ ์ฆ๋ช…์— ํ•ด๋‹นํ•œ๋‹ค.

    // ์š”์ฒญ ์˜ˆ์‹œ
    https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}
  2. ์นด์นด์˜ค API ํ”Œ๋žซํผ ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์ธ์ฆ์„ ์š”์ฒญํ•˜๊ณ  ์„ฑ๊ณต ์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋™์˜ ํ™”๋ฉด์œผ๋กœ ์ธ๊ฐ€๋ฅผ ์š”์ฒญํ•œ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ID/PW๋ฅผ ์ œ๊ณตํ•ด ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž์ž„์„ ์ธ์ฆํ•˜๊ณ  ๋™์˜ ํ™”๋ฉด์„ ํ†ตํ•ด ์„œ๋น„์Šค์— ๊ถŒํ•œ์„ ์ธ๊ฐ€ํ•œ๋‹ค.

  3. ์ธ๊ฐ€ ์™„๋ฃŒ ํ›„ ์นด์นด์˜ค API ํ”Œ๋žซํผ ์„œ๋ฒ„๋Š” ์ธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•œ Redirect URI๋กœ ์‚ฌ์šฉ์ž๋ฅผ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ•œ๋‹ค.

    // ์‘๋‹ต ์˜ˆ์‹œ
    HTTP/1.1 302 Found
    Content-Length: 0
    Location: ${REDIRECT_URI}?code=${AUTHORIZE_CODE}
  4. ์„œ๋น„์Šค๊ฐ€ Redirect URI์— ํฌํ•จ๋œ ์ธ๊ฐ€ ์ฝ”๋“œ๋กœ ํ† ํฐ ๋ฐœ๊ธ‰์„ ์š”์ฒญํ•˜๋ฉด ์นด์นด์˜ค API ํ”Œ๋žซํผ์€ ์‚ฌ์šฉ์ž์™€ ์„œ๋น„์Šค ์•ฑ์„ย ์—ฐ๊ฒฐํ•˜๊ณ  ์„œ๋น„์Šค์— ์‚ฌ์šฉ์ž์˜ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

    // ์š”์ฒญ ์˜ˆ์‹œ
    curl -v -X POST "https://kauth.kakao.com/oauth/token" \
     -H "Content-Type: application/x-www-form-urlencoded" \
     -d "grant_type=authorization_code" \
     -d "client_id=${REST_API_KEY}" \
     --data-urlencode "redirect_uri=${REDIRECT_URI}" \
     -d "code=${AUTHORIZE_CODE}"
    // ์‘๋‹ต ์˜ˆ์‹œ
    HTTP/1.1 200 OK
    Content-Type: application/json;charset=UTF-8
    {
        "token_type":"bearer",
        "access_token":"${ACCESS_TOKEN}",
        "expires_in":43199,
        "refresh_token":"${REFRESH_TOKEN}",
        "refresh_token_expires_in":5184000,
        "scope":"account_email profile"
    }
  5. ์„œ๋น„์Šค๊ฐ€ ๋ฐœ๊ธ‰๋ฐ›์€ ์‚ฌ์šฉ์ž์˜ย ํ† ํฐ์œผ๋กœ ์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ API๋ฅผ ์š”์ฒญํ•˜๋ฉด, ์นด์นด์˜ค API ํ”Œ๋žซํผ ์„œ๋ฒ„์—์„œ ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

    // ์š”์ฒญ ์˜ˆ์‹œ
    curl -v -G GET "https://kapi.kakao.com/v2/user/me" \
      -H "Authorization: Bearer ${ACCESS_TOKEN}"
    // ์‘๋‹ต ์˜ˆ์‹œ
    HTTP/1.1 200 OK
    {
        "id":123456789,
        "connected_at": "2022-04-11T01:45:28Z",
        "kakao_account": { 
            "profile_nickname_needs_agreement": false,
            "profile": {
                "nickname": "ํ™๊ธธ๋™"
            }
        },  
        "properties":{
            "${CUSTOM_PROPERTY_KEY}": "${CUSTOM_PROPERTY_VALUE}",
            ...
        }
    }

ํ”„๋ก ํŠธ์™€ ๋ฐฑ์—”๋“œ ๊ตฌํ˜„ ์˜์—ญ

1 - 3๋ฒˆ๊นŒ์ง€๋Š” ํ”„๋ก ํŠธ์—์„œ 4 - 5๋ฒˆ๊นŒ์ง€๋Š” ๋ฐฑ์—”๋“œ์—์„œ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์‚ฌ์šฉ์ž์™€ ์†Œํ†ตํ•ด์„œ ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž์ž„์„ ์ธ์ฆํ•˜๊ณ  ๊ถŒํ•œ์„ ์ธ๊ฐ€ํ•˜๋Š” ๊ณผ์ •์€ ํ”„๋ก ํŠธ์—์„œ ์ง„ํ–‰ํ–ˆ๊ณ  ์ดํ›„ ํ† ํฐ์œผ๋กœ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๋ฐฑ์—”๋“œ์—์„œ ๊ตฌํ˜„ํ–ˆ๋‹ค. ํ† ํฐ์œผ๋กœ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ถ€๋ถ„๊นŒ์ง€ ๋ชจ๋‘ ํ”„๋ก ํŠธ์—์„œ ๊ตฌํ˜„ํ•ด๋„ ๋˜์ง€ ์•Š์„๊นŒ?๋ผ๋Š” ์˜๋ฌธ์ด ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ธ์ฆ ์„œ๋ฒ„์—์„œ ํ† ํฐ์„ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณง๋ฐ”๋กœ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์œ„ํ—˜์ด ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณด์•ˆ ์‚ฌ๊ณ ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋ก ํŠธ์™€ ๋ฐฑ์—”๋“œ์˜ ๊ตฌํ˜„์„ ๋‚˜๋ˆด๋‹ค.

๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

Authorization Code Grant

์•ž์—์„œ OAuth 2.0์˜ ํŠน์ง•์„ ์„ค๋ช…ํ•˜๋ฉฐ ๊ถŒํ•œ ์š”์ฒญ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์„ค๋ช…ํ–ˆ๋‹ค. Authorization Code Grant๋Š” ๊ถŒํ•œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ๋ฐ›๊ณ  ์ด ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ๊ถŒํ•œ ์„œ๋ฒ„์™€ ์ง์ ‘ ํ†ต์‹ ํ•˜์—ฌ ์•ก์„ธ์Šค ํ† ํฐ์„ ๊ตํ™˜ํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์™€ ์ง์ ‘ ํ†ต์‹ ํ•˜๋ฏ€๋กœ ์„œ๋ฒ„ ์ธก์—์„œ ์•ก์„ธ์Šค ํ† ํฐ์„ ์•ˆ์ „ํ•˜๊ฒŒ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์™€ ๋น„๊ตํ•˜์—ฌ Implicit Grant ๋ฐฉ์‹์€ ๊ถŒํ•œ ์„œ๋ฒ„๊ฐ€ ์•ก์„ธ์Šค ํ† ํฐ์„ ์ง์ ‘ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ํ† ํฐ์„ URL์—์„œ ํŒŒ์‹ฑํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋•Œ ์•ก์„ธ์Šค ํ† ํฐ์ด ๋ธŒ๋ผ์šฐ์ € URL์„ ํ†ตํ•ด ์ง์ ‘ ์ „๋‹ฌ๋˜๋ฏ€๋กœ ํ† ํฐ์ด ์œ ์ถœ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ํ˜„์žฌ Implicit Grant ๋ฐฉ์‹์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š์œผ๋ฉฐ Authorization Code Grant์— PKCE๋ฅผ ๊ฒฐํ•ฉํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค. ์นด์นด์˜ค ๋กœ๊ทธ์ธ์—์„œ๋Š” Grant Type์„ authorization_code๋กœ ๊ณ ์ •ํ•œ๋‹ค.

Redirect URI

ํด๋ผ์ด์–ธํŠธ๋Š” ์ธ๊ฐ€ ์„œ๋ฒ„์— ํ† ํฐ์„ ์š”์ฒญํ•  ๋•Œ ์‚ฌ์šฉ์ž ์ธ์ฆ์— ํ•„์š”ํ•œ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํฌํ•จํ•ด ์ „์†กํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ Redirect URI๊ฐ€ ๊ฒ€์ฆ์—†์ด ์ „๋‹ฌ๋œ ๊ฒฝ์šฐ ๊ณต๊ฒฉ์ž๊ฐ€ ์ด๋ฅผ ์•…์šฉํ•ด ์•…์„ฑ ์‚ฌ์ดํŠธ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ธ๊ฐ€ ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ณ„๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ํ—ˆ์šฉ๋œ Redirect URI๋งŒ์„ ๋“ฑ๋กํ•˜๊ณ  ์ธ๊ฐ€ ์š”์ฒญ์„ ์ฒ ์ €ํžˆ ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ์™€์ผ๋“œ ์นด๋“œ ํŒจํ„ด์˜ ์‚ฌ์šฉ์€ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋ณด์•ˆ์„ฑ์„ ๊ฐ•ํ™”ํ•ด์•ผ ํ•œ๋‹ค. ์นด์นด์˜ค์—์„œ๋Š” ์นด์นด์˜ค ๋””๋ฒจ๋กœํผ์Šค์— ๋ฏธ๋ฆฌ ๋“ฑ๋ก๋œ ๊ฐ’๊ณผ ์ผ์น˜ํ•ด์•ผ ๊ธฐ๋Šฅ์ด ์ •์ƒ ๋™์ž‘ํ•œ๋‹ค.

๋˜ํ•œ OAuth 2.0์—์„œ๋Š” ๋ณด์•ˆ์„ ์œ„ํ•ด Redirect ์•ค๋“œํฌ์ธํŠธ์— TLS(Transport Layer Security)๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค. TLS๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋  ์œ„ํ—˜์ด ๋งค์šฐ ์ปค์ง€๋ฉฐ ํŠนํžˆ OAuth๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ๋Œ€๋ฆฌ ์ˆ˜ํ–‰ํ•˜๋Š” ์„œ๋น„์Šค์—์„œ ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ์‹ฌ๊ฐํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด์— ์นด์นด์˜ค๋Š” ์ธ๊ฐ€ ์ฝ”๋“œ ๋ฐ ํ† ํฐ ๋ฐœ๊ธ‰ ์š”์ฒญ์— ์‚ฌ์šฉ๋˜๋Š” Redirect URI๋Š” ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์—†๋Š” ํ•œ HTTPS๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•˜๊ณ  ์žˆ๋‹ค.

Client Secret ์ฝ”๋“œ ๋ฐœ๊ธ‰

ํ† ํฐ ๋ฐ›๊ธฐ์™€ ํ† ํฐ ๊ฐฑ์‹ ํ•˜๊ธฐ API ์š”์ฒญ์‹œ ๋ฏธ๋ฆฌ ๋ฐœ๊ธ‰๋ฐ›์€ Client Secret์ฝ”๋“œ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ์— ํฌํ•จํ•œ ๊ฒฝ์šฐ์—๋งŒ ์„ฑ๊ณต ์‘๋‹ตํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๋ณด์•ˆ ๊ธฐ๋Šฅ์ด๋‹ค. Client ID ์™ธ์—๋„ ์ธ์ฆ ์ˆ˜๋‹จ์„ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•œ๋‹ค.

ํ—ˆ์šฉ IP ์ฃผ์†Œ

์•ฑ ํ‚ค ์œ ์ถœ๊ณผ ๊ฐ™์€ ๋ณด์•ˆ ์‚ฌ๊ณ ์— ๋Œ€๋น„ํ•ด ์นด์นด์˜ค API ์„œ๋ฒ„๊ฐ€ ๋“ฑ๋ก๋œ IP ์ฃผ์†Œ์˜ ์š”์ฒญ๋งŒ ํ—ˆ์šฉํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

State ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ

CSRF๋Š” ๊ณต๊ฒฉ์ž๋Š” ์‚ฌ์šฉ์ž์˜ ์˜๋„์™€๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ ์•…์˜์ ์ธ ์š”์ฒญ์„ ์„œ๋ฒ„์— ๋ณด๋‚ด๋„๋ก ์œ ๋„ํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐฉ์‹์ด๋‹ค. CSRF ๊ณต๊ฒฉ์ด ํด๋ผ์ด์–ธํŠธ์˜ Redirect URI๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•  ๊ฒฝ์šฐ ๊ณต๊ฒฉ์ž๋Š” ์ž์‹ ์˜ ์ธ์ฆ ์ฝ”๋“œ๋‚˜ ์•ก์„ธ์Šค ํ† ํฐ์„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜๋„๋ก ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ํ”ผํ•ด์ž๊ฐ€ ์•„๋‹Œ ๊ณต๊ฒฉ์ž์˜ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์™€ ์—ฐ๊ด€๋œ ์•ก์„ธ์Šค ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ์œ„ํ—˜์ด ์žˆ๋‹ค.

state ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด CSRF ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•˜๋Š” ๊ฐ ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์š”์ฒญ์— ๋Œ€ํ•œ state ๊ฐ’์„ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ๊ณ ์œ ํ•œ ๋‚œ์ˆ˜๋กœ ์„ค์ •ํ•˜๊ณ , Redirect URI์— ์ „๋‹ฌ๋œ ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ“ย OpenID Connect ๊ฐœ๋… ์ถ”๊ฐ€ ๊ณต๋ถ€ ์˜ˆ์ •

์ฐธ๊ณ 
The OAuth 2.0 Authorization Framework
OAuth 2.0 ๊ฐœ๋…๊ณผ ๋™์ž‘์›๋ฆฌ
Kakao Developers
Spring Security

profile
๋‚˜์˜ ์„ฑ์žฅ ๊ธฐ๋ก

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2024๋…„ 10์›” 28์ผ

์–ธ์ œ๊นŒ์ง€ ์ž‘์„ฑ ์˜ˆ์ •์ธ๊ฐ€์šฅ ๐Ÿ‘€

1๊ฐœ์˜ ๋‹ต๊ธ€