Codong's Development Diary RSS ํƒœ๊ทธ ๊ด€๋ฆฌ ๊ธ€์“ฐ๊ธฐ ๋ฐฉ๋ช…๋ก
2022-01-16 01:25:29

๐Ÿ™Œ ๊ฐœ์š”


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

๊ทธ๋Ÿฌ๋‹ค ๋„ค์ด๋ฒ„, ์นด์นด์˜ค, ๊ตฌ๊ธ€ ๋“ฑ ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ ์•„์ด๋””๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ๋“ค์„ ๋ณด๋ฉด์„œ ์–ด๋–ป๊ฒŒ ์ด๋Ÿฐ ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€? ๋ผ๋Š” ์˜๋ฌธ์„ ๊ฐ€์ง€๊ฒŒ ๋๋‹ค.

๊ด€๋ จํ•ด์„œ ๊ฒ€์ƒ‰์„ ํ•˜๋‹ค๋ณด๋‹ˆ OAuth2.0 ์ด๋ผ๋Š” ๊ฐœ๋…์„ ์ ‘ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ๋‹จ์ˆœํžˆ social login์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ด๊ฒƒ์„ ์•Œ๊ณ  ๊ฐ€์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ OAuth2.0์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

์ œ ๊ธ€๋งŒ์œผ๋กœ ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ references ๋‚ด์šฉ๋“ค ๊ผญ ์ฝ์–ด๋ณด์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ˜…


OAuth2.0


๐Ÿง OAuth2.0 ์ด๋ž€?

OAuth2.0์— ๋Œ€ํ•œ rfc ๋ฌธ์„œ : https://datatracker.ietf.org/doc/html/rfc6749
์ •๋ฆฌ๋ฅผ ์ž˜ํ•ด๋‘” ํ•œ์ปด์ธํ…”๋ฆฌ์ „์Šค ๋ธ”๋กœ๊ทธ๊ฐ€ ์žˆ์–ด์„œ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€๋‹ค.

OAuth2.0์€ rfc ๋ฌธ์„œ์˜ ์ œ๋ชฉ์—์„œ Authorization Framework์ด๋ผ ์ง€์นญ๋œ๋‹ค. ํ•ต์‹ฌ์€ Third-Party ํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž(Resource Owner)๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„(Resource Server)์—์„œ ์ œ๊ณตํ•˜๋Š” ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์œ„์ž„ํ•˜๋Š” ๋ฐฉ์‹์„ ์ œ๊ณตํ•œ๋‹ค.

๋ญ๊ฐ€ ์ข‹์•„์„œ ์“ฐ๋Š” ๊ฑธ๊นŒ?

ํฐ ์žฅ์ ์œผ๋กœ ๋‹จ์ˆœ์„ฑ์„ ๊ผฝ์„ ์ˆ˜ ์žˆ๋‹ค. ๊ตฌํ˜„์ž์˜ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ OAuth 2๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด ๋„ค์ด๋ฒ„๋‚˜ ์นด์นด์˜ค ๋“ฑ ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ ๋กœ๊ทธ์ธ์„ ํ†ตํ•ด ์ธ์ฆ์„ ํ•˜๊ณ  ์ ‘๊ทผ ๊ถŒํ•œ์„ ์–ป๋Š” ๊ฒƒ์ด๋ฏ€๋กœ, ๋ณต์žกํ•œ ์ธ์ฆ ์ ˆ์ฐจ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ณ  ์ œ๊ณตํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.

๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž๋Š” ๋ญ๊ณ  ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋Š” ๋ญ์ง€?

์—ฌ๊ธฐ์„œ ๋‚˜์˜ค๋Š” ์—ญํ• ๋“ค์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๊ณ  ๋„˜์–ด๊ฐ€์ž.

  1. Resource Owner : ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž ๋˜๋Š” ์‚ฌ์šฉ์ž. ๋ณดํ˜ธ๋œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ž๊ฒฉ์„ ๋ถ€์—ฌํ•ด ์ฃผ๋Š” ์ฃผ์ฒด. ์ฆ‰ id/password๋ฅผ ์ž…๋ ฅํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋œ๋‹ค. ์ธ์ฆ์ด ์™„๋ฃŒ๋˜๋ฉด ๊ถŒํ•œ ํš๋“ ์ž๊ฒฉ(Authorization Grant)์„ Client์—๊ฒŒ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
  2. Client : ๋ณดํ˜ธ๋œ ์ž์›์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์ ‘๊ทผ ์š”์ฒญ์„ ํ•˜๋Š” Application (ex. ๋‚ด fastapi server)
  3. Resource Server : ์‚ฌ์šฉ์ž์˜ ๋ณดํ˜ธ๋œ ์ž์›์„ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” server (ex. ๊ตฌ๊ธ€, ๋„ค์ด๋ฒ„, ์นด์นด์˜ค ๋“ฑ)
  4. Authorization Server : ๊ถŒํ•œ ์„œ๋ฒ„. ์ธ์ฆ/์ธ๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์„œ๋ฒ„๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์ ‘๊ทผ ์ž๊ฒฉ์„ ํ™•์ธํ•˜๊ณ  Access Token์„ ๋ฐœ๊ธ‰ํ•˜์—ฌ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ (ex. ๊ตฌ๊ธ€, ๋„ค์ด๋ฒ„, ์นด์นด์˜ค ๋“ฑ)

์ง€๊ธˆ๊นŒ์ง€์˜ ํ•ต์‹ฌ์€ ๋‚ด fastapi ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž๊ฐ€ authorization server(ex. ๋„ค์ด๋ฒ„)์— ์ธ์ฆํ•˜๋„๋ก ํ•˜๊ณ , ์ธ์ฆ ์™„๋ฃŒ ์‹œ ๊ถŒํ•œ์„ ์–ป์–ด Resource Server(ex. ๋„ค์ด๋ฒ„)์—์„œ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์–ป์–ด ๋‚ด ์„œ๋น„์Šค์— ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

๊ถŒํ•œ์„ ์–ป์—ˆ๋Š” ์ง€ ์–ด๋–ป๊ฒŒ ์•Œ์ง€?

์ธ์ฆ์— ์„ฑ๊ณตํ•˜๋ฉด authorization server๊ฐ€ Access token / Refresh token(Optional)์„ ๋ฐœ๊ธ‰ํ•ด์ค€๋‹ค.

์ด๊ฒƒ๋“ค์€ ๋ญ๋ƒ.. ๊ฐ„๋‹จํžˆ ๋งํ•˜์ž๋ฉด Access token์€ Resource Server(ex. ๋„ค์ด๋ฒ„)์—๊ฒŒ์„œ ์‚ฌ์šฉ์ž์˜ ๋ณดํ˜ธ๋œ ์ž์›์„ ํš๋“ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์ด ์žˆ๋Š” token์ด๊ณ , Refresh token์€ Access token ๋งŒ๋ฃŒ ์‹œ ์ด๋ฅผ ๊ฐฑ์‹ ํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋Š” token์ด๋‹ค.

๋„ค์ด๋ฒ„์™€ ์นด์นด์˜ค์˜ ๊ฒฝ์šฐ Access Token์˜ ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์€ 1~2์‹œ๊ฐ„ ์ •๋„์ด๋‹ค. Refresh Token์˜ ๊ฒฝ์šฐ ๋‘˜ ๋‹ค ์กด์žฌํ•˜๊ณ  ์นด์นด์˜ค๋Š” ๊ธฐ๊ฐ„์ด ๋ช‡ ๋‹ฌ ์ •๋„ ๋˜์ง€๋งŒ, ๋„ค์ด๋ฒ„๋Š” ๋”ฑํžˆ ๋ช…์‹œ๋˜์–ด์žˆ์ง€ ์•Š์•˜๊ณ , ์‘๋‹ต์—๋„ ๋งŒ๋ฃŒ๊ธฐ๊ฐ„์ด ์—†๋Š” ๋“ฏํ–ˆ๋‹ค..?(Refresh token ๋งŒ๋ฃŒ๊ธฐ๊ฐ„ ๊ด€๋ จ ๋„ค์ด๋ฒ„ ๋ฌธ์˜ ๋งํฌ ๋„ค์ด๋ฒ„ ํ˜•...! ๋‹ต ์ข€ ๋‹ฌ์•„์ค˜๋ผ...)

์ž ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋„์‹ํ™”๋œ ๊ทธ๋ฆผ์„ ํ†ตํ•ด ์ „์ฒด ํ๋ฆ„์„ ์‚ดํŽด๋ณด๊ณ  ์ดํ•ดํ•ด๋ณด์ž.

๐Ÿ” OAuth2.0์˜ ์ „์ฒด์ ์ธ ํ๋ฆ„

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

  1. Authorization Code Grant : ๊ถŒํ•œ ๋ถ€์—ฌ ์Šน์ธ ์ฝ”๋“œ ๋ฐฉ์‹
  2. Implicit Grant : ์•”๋ฌต์  ์Šน์ธ ๋ฐฉ์‹
  3. Resource Owner Password Credentials Grant : ์ž์› ์†Œ์œ ์ž ์ž๊ฒฉ์ฆ๋ช… ์Šน์ธ ๋ฐฉ์‹
  4. Client Credentials Grant : ํด๋ผ์ด์–ธํŠธ ์ž๊ฒฉ์ฆ๋ช… ์Šน์ธ ๋ฐฉ์‹

๊ทธ์ค‘์—์„œ 1๋ฒˆ Authorization Code Grant ๋ฐฉ์‹์ด ์ž์ฒด ์ƒ์„ฑํ•œ Authorization Code๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋งŽ์ด ์“ฐ์ด๊ณ  ๊ธฐ๋ณธ์ด ๋˜๋Š” ๋ฐฉ์‹์ด๊ธฐ์— ์ด๊ฒƒ๋งŒ ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ๋‹ค. (๋„ค์ด๋ฒ„, ์นด์นด์˜ค ๋‘˜ ๋‹ค ์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•จ.)

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : https://darutk.medium.com/diagrams-and-movies-of-all-the-oauth-2-0-flows-194f3c3ade85

๊ทธ๋ฆผ์˜ ์ˆœ์„œ๋Œ€๋กœ ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๊ฒƒ์„ ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ์„ fastapi์„œ๋ฒ„๋กœ ๊ตฌํ˜„ํ•œ๋‹ค๋Š” ๋Š๋‚Œ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ •ํ•˜์— ์„ค๋ช…ํ•ด๋ณด๊ฒ ๋‹ค.

๊ทธ๋ฆผ์—์„œ App XYZ = ๋‚ด ์•ฑ ์„œ๋ฒ„(fastapi)
๊ทธ๋ฆผ์—์„œ service ABC Authorization server = ๋„ค์ด๋ฒ„ ์ธ์ฆ ์„œ๋ฒ„
๊ทธ๋ฆผ์—์„œ service ABC Resource server = ๋„ค์ด๋ฒ„ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„

  • 1~5 ์‚ฌ์šฉ์ž๊ฐ€ ๋‚ด ์•ฑ์—์„œ ์ œ๊ณต๋œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ์žˆ๋Š” ๋„ค์ด๋ฒ„ ์•„์ด๋”” ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ํ›„, ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๊ฐ€ ๋œจ๋ฉด์„œ ID/PW๋กœ ๋กœ๊ทธ์ธ์„ ์ง„ํ–‰ํ•œ๋‹ค.
  • 6 ๋„ค์ด๋ฒ„ ์ธ์ฆ ์„œ๋ฒ„๊ฐ€ ID/PW๊ฐ€ ์œ ํšจํ•œ ๊ฒƒ์ด ํ™•์ธ๋˜๋ฉด, ๋‚ด ์„œ๋ฒ„์— ์ธ์ฆ ์ฝ”๋“œ(authorization code)๋ฅผ ๋ณด๋‚ด์ค€๋‹ค.
  • 7~8 ๋‚ด ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ์ธ์ฆ์ฝ”๋“œ๋กœ ๋„ค์ด๋ฒ„ ์ธ์ฆ ์„œ๋ฒ„์— Access token ๋ฐœ๊ธ‰์„ ์š”์ฒญํ•˜์—ฌ ๋ฐœ๊ธ‰๋ฐ›๋Š”๋‹ค.
  • A~D ๋ฐœ๊ธ‰๋ฐ›์€ Access token์œผ๋กœ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

๋‚ด ์„ค๋ช…์ด ๋งž์ง€ ์•Š๊ฑฐ๋‚˜ ์ดํ•ด๊ฐ€ ์•ˆ ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ rfc ๋ฌธ์„œ์˜ ํ•ด๋‹น ๋ถ€๋ถ„์„ ๋งํฌ๋กœ ๋‹ฌ์•„๋‘˜ ํ…Œ๋‹ˆ ํ™•์ธํ•ด๋ณด๊ธธ ๋ฐ”๋ž€๋‹ค. 4.1. Authorization Code Grant

rfc ๋ฌธ์„œ์˜ ๊ทธ๋ฆผ์„ ๋ณด๊ณ  ๋Š๋‚€ ๊ฒƒ์ธ๋ฐ, ์œ„์˜ ๊ทธ๋ฆผ์—์„œ 1๋ฒˆ ๋ถ€๋ถ„์˜ App XYZ๋Š” rfc ๋ฌธ์„œ์—์„œ user-agent์ธ ๊ฒƒ ๊ฐ™๊ณ , ์ดํ›„ 6๋ฒˆ์— ๋‚˜์˜ค๋Š” App XYZ๋Š” rfc ๋ฌธ์„œ์—์„œ๋Š” Client์ด์ง€ ์•Š๋‚˜ ์ƒ๊ฐ์ด ๋“ ๋‹ค.

์œ„ ๊ทธ๋ฆผ์—์„œ๋Š” ํ•˜๋‚˜์˜ App XYZ๋กœ ํ‘œํ˜„์„ ํ–ˆ์ง€๋งŒ ํ˜ผ๋ž€์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด user-agent์™€ client๋กœ ๋”ฐ๋กœ ํ‘œํ˜„๋์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ ์‹ถ๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” App XYZ๊ฐ€ ๊ฒฐ๊ตญ ํ•˜๋‚˜์˜ application์„ ๋งํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ frontend/backend๋ฅผ ์ „๋ถ€ ํฌํ•จํ•œ ๊ฐœ๋…์ด๋ผ ์ƒ๊ฐํ•˜๋ฉด ๋งž๋Š” ๋ง ๊ฐ™๊ธฐ๋„ ํ•˜๊ณ  ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.. ๋‚˜๋งŒ ํ˜ผ๋ž€์Šค๋Ÿฝ๋‚˜..?


๐Ÿ‘ ๋งˆ๋ฌด๋ฆฌ


ํ•ต์‹ฌ ์ •๋ฆฌ

OAuth2.0์˜ ํ•ต์‹ฌ์€ ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์œ„์ž„ํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

์ฆ‰ ๋‚ด app์ด ์žˆ๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ access ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด์ฃผ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ์‚ฌ์šฉ์ž์™€ ๋‚ด app ์‚ฌ์ด์— ๋„ค์ด๋ฒ„๋‚˜ ์นด์นด์˜ค์™€ ๊ฐ™์€ ์ธ์ฆ ์„œ๋ฒ„๊ฐ€ ์ค‘๊ฐœ๋ฅผ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ ๊ฒฐ๊ณผ ๋‚˜๋Š” app์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์ธ์ฆ์„ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ข€ ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋งˆ๋ฌด๋ฆฌ ๋ฉ˜ํŠธ

์ข€ ๋” ๋””ํ…Œ์ผํ•˜๊ฒŒ ๋“ค์–ด๊ฐ€์ž๋ฉด ๋นผ๋จน์€ ๋‚ด์šฉ์ด ๋งŽ๊ฒ ์ง€๋งŒ, ์šฐ์„  ์ปจ์…‰์„ ์•Œ์•„๊ฐ€๋Š” ๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ๊ธ€์„ ์จ๋ดค๋‹ค. ์•ž์œผ๋กœ ๋‚จ๋“ค์ด ๋‹ค ์“ฐ๋‹ˆ๊นŒ ์“ด๋‹ค๋Š” ์ด์œ  ๋ง๊ณ , ์ •ํ™•ํžˆ ์™œ ์“ฐ๋Š” ๊ฑด์ง€, ์–ด๋–ค ์ด์ ์ด ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋ ฅํ•˜์ž.

references