OpenID Connect: ๋งž์ถคํ˜•์—์„œ ํ‘œ์ค€์œผ๋กœ ๋‚ด๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์ฆ

๋ช‡ ๋‹ฌ ์ „์— ์ €๋Š” ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๋‚ด๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด OpenID Connect ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ž์ฒด ๊ฐœ๋ฐœ์—์„œ ๋” ์ž‘์€ ๊ทœ๋ชจ๋กœ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ผ๋ฐ˜์ ์œผ๋กœ ํ—ˆ์šฉ๋˜๋Š” ํ‘œ์ค€์œผ๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ค‘์•™ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•œ ์•ก์„ธ์Šค๋Š” ๋‹จ์กฐ๋กœ์šด ์ž‘์—…์„ ํฌ๊ฒŒ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์ธ์ฆ ๊ตฌํ˜„ ๋น„์šฉ์„ ์ค„์ด๋ฉฐ ์ƒˆ๋กœ์šด ์†”๋ฃจ์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๋จธ๋ฆฌ๋ฅผ ์ˆ™์ด์ง€ ์•Š๊ณ  ๋งŽ์€ ๊ธฐ์„ฑ ์†”๋ฃจ์…˜์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ „ํ™˜๊ณผ ์šฐ๋ฆฌ๊ฐ€ ์ฑ„์šธ ์ˆ˜ ์žˆ์—ˆ๋˜ ๋ฒ”ํ”„์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

OpenID Connect: ๋งž์ถคํ˜•์—์„œ ํ‘œ์ค€์œผ๋กœ ๋‚ด๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์ฆ

์˜ค๋ž˜ ์ „์—... ๋ชจ๋“  ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์‹œ์ž‘๋˜์—ˆ๋Š”์ง€

๋ช‡ ๋…„ ์ „ ์ˆ˜๋™ ์ œ์–ด๋ฅผ ์œ„ํ•œ ๋‚ด๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋„ˆ๋ฌด ๋งŽ์•˜์„ ๋•Œ ํšŒ์‚ฌ ๋‚ด์—์„œ ์•ก์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๊ฐ€ ๊ตฌ์„ฑ๋œ ์ง์› ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐ๋œ ๊ฐ„๋‹จํ•œ Rails ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— ์šฐ๋ฆฌ๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก๊ณผ ์ธ์ฆ ์„œ๋ฒ„ ์ธก์˜ ํ† ํฐ ๊ฒ€์ฆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ SSO๋ฅผ ์ œ๊ธฐํ–ˆ์œผ๋ฉฐ, ํ† ํฐ์€ ์—ฌ๋Ÿฌ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ ์•”ํ˜ธํ™”๋œ ํ˜•ํƒœ๋กœ ์ „์†ก๋˜๊ณ  ์ธ์ฆ ์„œ๋ฒ„์—์„œ ๊ฒ€์ฆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋‚ด๋ถ€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ƒ๋‹นํ•œ ์ˆ˜์ค€์˜ ๋…ผ๋ฆฌ๋ฅผ ์„ค๋ช…ํ•ด์•ผ ํ•˜๊ณ  ์ง์› ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ธ์ฆ ์„œ๋ฒ„์™€ ์™„์ „ํžˆ ๋™๊ธฐํ™”๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๊ฐ€์žฅ ํŽธ๋ฆฌํ•œ ์˜ต์…˜์ด ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์–ผ๋งˆ ํ›„ ์ค‘์•™ ์ง‘์ค‘์‹ ์ธ์ฆ ์ž‘์—…์„ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. SSO๊ฐ€ ๋ฐธ๋Ÿฐ์„œ๋กœ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค. OpenResty์˜ ๋„์›€์œผ๋กœ ํ† ํฐ์„ ํ™•์ธํ•˜๋Š” ํ…œํ”Œ๋ฆฟ์ด Lua์— ์ถ”๊ฐ€๋˜์—ˆ๊ณ , ์š”์ฒญ์ด ์–ด๋–ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๊ฐ€๋Š”์ง€ ์•Œ๊ณ  ๊ฑฐ๊ธฐ์— ์•ก์„ธ์Šค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋‚ด๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹์ž‘์—…์„ ํฌ๊ฒŒ ๋‹จ์ˆœํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฝ”๋“œ์—์„œ ๋” ์ด์ƒ ์ถ”๊ฐ€ ๋…ผ๋ฆฌ๋ฅผ ์„ค๋ช…ํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ํŠธ๋ž˜ํ”ฝ์„ ์™ธ๋ถ€์ ์œผ๋กœ ์ฐจ๋‹จํ–ˆ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž์ฒด๋Š” ์Šน์ธ์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ์•Œ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ง์›์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ธ์ฆ ์„œ๋น„์Šค์— ๋Œ€ํ•œ API๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด ์ถ”๊ฐ€ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์šฐ๋ฆฌ๋Š” ๋‚ด๋ถ€ ์ธ์ฆ ์„œ๋ฒ„์—์„œ ํ–ฅํ›„ OpenSource๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ์ง€ํ–ฅํ•˜๋Š” ์ž์ฒด ์ž‘์„ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ค‘ ํ•˜๋‚˜์— ๋Œ€ํ•œ ์˜์กด์„ฑ์„ ์—†์• ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์‹œ๊ฐ„์— ์ด์•ผ๊ธฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ OAuth์˜€์Šต๋‹ˆ๋‹ค.

๊ณตํ†ต ํ‘œ์ค€์—

OAuth๋Š” ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ์ธ์ •๋˜๋Š” ์ธ์ฆ ํ‘œ์ค€์ด์ง€๋งŒ ๊ธฐ๋Šฅ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ฆ‰์‹œ OIDC(OpenID Connect)๋ฅผ ๊ณ ๋ คํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. OIDC ์ž์ฒด๋Š” ๊ฐœ๋ฐฉํ˜• ์ธ์ฆ ํ‘œ์ค€์˜ ์„ธ ๋ฒˆ์งธ ๊ตฌํ˜„์ด๋ฉฐ OAuth 2.0 ํ”„๋กœํ† ์ฝœ(๊ฐœ๋ฐฉํ˜• ์ธ์ฆ ํ”„๋กœํ† ์ฝœ)์„ ํ†ตํ•ด ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์œผ๋กœ ์œ ์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์†”๋ฃจ์…˜์€ ์ตœ์ข… ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ๋ถ€์กฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์ธ์ฆ ๊ณต๊ธ‰์ž๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํŠน์ • ๊ณต๊ธ‰์ž๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด ์ธ์ฆ ์„œ๋ฒ„์— OIDC์™€์˜ ํ†ตํ•ฉ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฐ์ •์— ์œ ๋ฆฌํ•œ ์ ์€ OIDC๊ฐ€ ์ตœ์ข… ์‚ฌ์šฉ์ž ์ธ์ฆ ์ธก๋ฉด์—์„œ ๋งค์šฐ ์œ ์—ฐํ•˜๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ ์ธ์ฆ ์„œ๋ฒ„์—์„œ OIDC ์ง€์›์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.

OpenID Connect: ๋งž์ถคํ˜•์—์„œ ํ‘œ์ค€์œผ๋กœ ๋‚ด๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์ฆ

์ž์ฒด OIDC ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

1) ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๊ฐ€์ ธ์˜ด

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

ํŠน์ง• ๊ทธ๋ฃน์€ ๋‹ค์Œ ํ•˜์œ„ ์ง‘ํ•ฉ์ธ ๋ฒ”์œ„๋กœ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์Šน์ธํ•˜๋Š” ๋™์•ˆ ๋ฒ”์œ„์˜ ์ผ๋ถ€ ๋ธŒ๋žœ๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ ํŠน์ • ๋ธŒ๋žœ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฒ”์œ„์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๊ฐ€ ์š”์ฒญ๋ฉ๋‹ˆ๋‹ค.

2) ํ•„์š”ํ•œ ๊ต๋ถ€๊ธˆ ์‹œํ–‰

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

OpenID Connect: ๋งž์ถคํ˜•์—์„œ ํ‘œ์ค€์œผ๋กœ ๋‚ด๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์ฆ

์ฒซ ๋ฒˆ์งธ ์‹ ์ฒญ์—์„œ๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ถŒํ•œ ๋ถ€์—ฌ์ธ ์ธ์ฆ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ๊ณผ์˜ ์ฐจ์ด์ ์€ XNUMX๋‹จ๊ณ„, ์ฆ‰ ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ ์ค‘์ž…๋‹ˆ๋‹ค. ๋จผ์ € ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ ๊ถŒํ•œ์„ ์š”์ฒญํ•˜๊ณ  ์ธ์ฆ ์ฝ”๋“œ(Authorization Code)๋ผ๋Š” ํ† ํฐ์„ ๋ฐ›์€ ๋‹ค์Œ ์ด ํ† ํฐ์œผ๋กœ ๋งˆ์น˜ ์—ฌํ–‰ ํ‹ฐ์ผ“์ฒ˜๋Ÿผ ์•ก์„ธ์Šค ํ† ํฐ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ถŒํ•œ ๋ถ€์—ฌ ์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ์ฃผ์š” ์ƒํ˜ธ ์ž‘์šฉ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ ์„œ๋ฒ„ ๊ฐ„์˜ ๋ฆฌ๋””๋ ‰์…˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณด์กฐ๊ธˆ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—.

OAuth๋Š” ๊ถŒํ•œ ๋ถ€์—ฌ ํ›„ ์–ป์€ ์•ก์„ธ์Šค ํ† ํฐ์ด ์ผ์‹œ์ ์ด์–ด์•ผ ํ•˜๋ฉฐ ๊ฐ€๊ธ‰์  ํ‰๊ท  10๋ถ„๋งˆ๋‹ค ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฐœ๋…์„ ๊ณ ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ ์ฝ”๋“œ ๋ถ€์—ฌ๋Š” ๋ฆฌ๋””๋ ‰์…˜์„ ํ†ตํ•œ 10๋‹จ๊ณ„ ์ธ์ฆ์œผ๋กœ, XNUMX๋ถ„๋งˆ๋‹ค ์ด๋Ÿฌํ•œ ๋‹จ๊ณ„๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์†”์งํžˆ ๋ˆˆ์— ๊ฐ€์žฅ ์ฆ๊ฑฐ์šด ์ž‘์—…์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋‚˜๋ผ์—์„œ๋„ ์‚ฌ์šฉ๋˜๋Š” Refresh Token์ด๋ผ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ณด์กฐ๊ธˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ชจ๋“  ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šน์ธ์—์„œ ํ™•์ธํ•˜๋Š” ๋™์•ˆ ๊ธฐ๋ณธ ์•ก์„ธ์Šค ํ† ํฐ ์™ธ์—๋„ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜๋ช…์ด ํ›จ์”ฌ ๋” ๊ธด ์ƒˆ๋กœ ๊ณ ์นจ ํ† ํฐ์ด๋ผ๋Š” ๋˜ ๋‹ค๋ฅธ ํ† ํฐ์ด ๋ฐœ๊ธ‰๋ฉ๋‹ˆ๋‹ค. ์ด Refresh Token์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ ์•ก์„ธ์Šค ํ† ํฐ์˜ TTL(Time to Live)์ด ์ข…๋ฃŒ๋˜๋ฉด ์ƒˆ ์•ก์„ธ์Šค ํ† ํฐ์— ๋Œ€ํ•œ ์š”์ฒญ์ด ๋‹ค๋ฅธ ๊ถŒํ•œ ๋ถ€์—ฌ์˜ ๋์ ์œผ๋กœ ์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•œ ์ƒˆ๋กœ ๊ณ ์นจ ํ† ํฐ์€ ์ฆ‰์‹œ XNUMX์œผ๋กœ ์žฌ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒ€์‚ฌ๋Š” XNUMX๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•˜๋Š” ์‚ฌ์ด์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3) ์‚ฌ์šฉ์ž ์ง€์ • ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ ํ˜•์‹ ์„ค์ •

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

OIDC ๊ตฌํ˜„์—์„œ JWT ํ† ํฐ์€ id_token์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์•ก์„ธ์Šค ํ† ํฐ๊ณผ ํ•จ๊ป˜ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‚จ์€ ๊ฒƒ์€ ์„œ๋ช…์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธ์ฆ ์„œ๋ฒ„์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์˜ ์—ฌ๋Ÿฌ ๊ณต๊ฐœ ํ‚ค๊ฐ€ ์žˆ๋Š” ๋ณ„๋„์˜ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. J.W.K.. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋งํ•˜์ž๋ฉด, ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. RFC5785 OIDC ์„œ๋ฒ„์˜ ํ˜„์žฌ ๊ตฌ์„ฑ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ ์ฃผ์†Œ(์„œ๋ช…์— ์‚ฌ์šฉ๋˜๋Š” ๊ณต๊ฐœ ํ‚ค ๋ง์˜ ์ฃผ์†Œ ํฌํ•จ), ์ง€์›๋˜๋Š” ๋ธŒ๋žœ๋“œ ๋ฐ ๋ฒ”์œ„, ์‚ฌ์šฉ๋˜๋Š” ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ง€์›๋˜๋Š” ๋ณด์กฐ๊ธˆ ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Google์—์„œ:

{
 "issuer": "https://accounts.google.com",
 "authorization_endpoint": "https://accounts.google.com/o/oauth2/v2/auth",
 "device_authorization_endpoint": "https://oauth2.googleapis.com/device/code",
 "token_endpoint": "https://oauth2.googleapis.com/token",
 "userinfo_endpoint": "https://openidconnect.googleapis.com/v1/userinfo",
 "revocation_endpoint": "https://oauth2.googleapis.com/revoke",
 "jwks_uri": "https://www.googleapis.com/oauth2/v3/certs",
 "response_types_supported": [
  "code",
  "token",
  "id_token",
  "code token",
  "code id_token",
  "token id_token",
  "code token id_token",
  "none"
 ],
 "subject_types_supported": [
  "public"
 ],
 "id_token_signing_alg_values_supported": [
  "RS256"
 ],
 "scopes_supported": [
  "openid",
  "email",
  "profile"
 ],
 "token_endpoint_auth_methods_supported": [
  "client_secret_post",
  "client_secret_basic"
 ],
 "claims_supported": [
  "aud",
  "email",
  "email_verified",
  "exp",
  "family_name",
  "given_name",
  "iat",
  "iss",
  "locale",
  "name",
  "picture",
  "sub"
 ],
 "code_challenge_methods_supported": [
  "plain",
  "S256"
 ],
 "grant_types_supported": [
  "authorization_code",
  "refresh_token",
  "urn:ietf:params:oauth:grant-type:device_code",
  "urn:ietf:params:oauth:grant-type:jwt-bearer"
 ]
}

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

์‹œํ–‰ ๊ฒฐ๊ณผ

๋”ฐ๋ผ์„œ ์ž์ฒด OIDC ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธก์—์„œ ์ด์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ๊ตฌ์„ฑํ•œ ํ›„ ์‚ฌ์šฉ์ž ์ •๋ณด ์ „์†ก ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
OIDC๋Š” ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€์ด๋ฏ€๋กœ ๊ธฐ์กด ๊ณต๊ธ‰์ž ๋˜๋Š” ์„œ๋ฒ„ ๊ตฌํ˜„์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธก์—์„œ ์—ฐ๊ฒฐ ๊ตฌ์„ฑ์„ ์„ค์ •ํ•˜๊ณ  ๋ณ€๊ฒฝํ•œ ํ›„ ๊ตฌ์„ฑ์ด ๋งค์šฐ ํŽธ๋ฆฌํ•œ ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋œ Keycloak๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธก๋ฉด์—์„œ ๋‚จ์€ ๊ฒƒ์€ ์—ฐ๊ฒฐ ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ธฐ

์šฐ๋ฆฌ ์กฐ์ง ๋‚ด์—์„œ ์ตœ์ดˆ์˜ OIDC ์„œ๋ฒ„๋กœ์„œ ํ•„์š”์— ๋”ฐ๋ผ ๋ณด์™„๋˜๋Š” ์ž์ฒด ๊ตฌํ˜„์„ ์กฐ๋ฆฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ธฐ์„ฑ ์†”๋ฃจ์…˜์„ ์ž์„ธํžˆ ๊ฒ€ํ† ํ•œ ํ›„ ์ด๊ฒƒ์ด ๋…ผ์ ์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์ฒด ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ํ•œ ๊ฒฐ์ •์— ์ฐฌ์„ฑํ•˜์—ฌ ์ผ๋ถ€ ์„œ๋น„์Šค์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ์ •์˜ ์ธ์ฆ์ด ์žˆ๋Š” ์˜ค๋ž˜๋œ ์‹œ์Šคํ…œ์˜ ์กด์žฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ์—†๋Š” ๊ณต๊ธ‰์ž ์ธก์— ๋Œ€ํ•œ ์šฐ๋ ค๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง์›์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋Š” ์ด๋ฏธ ์ €์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ์„ฑํ’ˆ ๊ตฌํ˜„์—๋Š” ํ†ตํ•ฉ์— ๋Œ€ํ•œ ํŽธ์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Keycloak์—๋Š” ์ž์ฒด ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์ง์ ‘ ์ €์žฅ๋˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์ถ”์›”ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด Keycloak์—๋Š” ํ•„์š”ํ•œ ๋ชจ๋“  ์ „์†ก ์ž‘์—…์„ ์™„์ „ํžˆ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” API๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์— ์ธ์ฆ๋˜๊ณ  ํฅ๋ฏธ๋กœ์šด ๊ตฌํ˜„์˜ ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋Š” Ory Hydra์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค. ํ†ตํ•ฉํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ์„œ๋น„์Šค๋ฅผ ์ธ์ฆ ์„œ๋น„์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ํ™•์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Keycloak๊ณผ Ory Hydra๋งŒ์ด ๊ธฐ์„ฑ ์†”๋ฃจ์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. OpenID Foundation์—์„œ ์ธ์ฆํ•œ ๊ตฌํ˜„์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ OpenID ์ธ์ฆ ๋ฐฐ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

OpenID Connect: ๋งž์ถคํ˜•์—์„œ ํ‘œ์ค€์œผ๋กœ ๋‚ด๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์ฆ

๋˜ํ•œ OIDC ์„œ๋ฒ„๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๊ฒฝ์šฐ ๊ธฐ์กด ์œ ๋ฃŒ ๊ณต๊ธ‰์ž๋ฅผ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์˜ค๋Š˜๋‚ ์—๋Š” ์ข‹์€ ์˜ต์…˜์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„

๊ฐ€๊นŒ์šด ์‹œ์ผ ๋‚ด์— ๋‚ด๋ถ€ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ํŠธ๋ž˜ํ”ฝ์„ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ฐจ๋‹จํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. OpenResty๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ท ํ˜• ์žฅ์น˜์˜ ํ˜„์žฌ SSO๋ฅผ OAuth ๊ธฐ๋ฐ˜ ํ”„๋ก์‹œ๋กœ ์ด์ „ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์ด๋ฏธ ๋งŽ์€ ๊ธฐ์„ฑ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
github.com/bitly/oauth2_proxy
github.com/ory/oathkeeper
github.com/keycloak/keycloak-gatekeeper

์ถ”๊ฐ€ ์ž๋ฃŒ

jwt.io โ€“ JWT ํ† ํฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•œ ์ข‹์€ ์„œ๋น„์Šค
openid.net/developers/certified - ์ธ์ฆ๋œ OIDC ๊ตฌํ˜„ ๋ชฉ๋ก

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€