๐Ÿ”ฌComputer Science/๋„คํŠธ์›Œํฌ

TIL) ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์ ˆ์ฐจ, OAUTH 2.0 ์ด๋ž€, JWT

hellohailie 2022. 7. 15. 13:16

 

  • ํ† ํฐ์˜ ๊ฐœ๋…(Refresh Token๊ณผ Access Token์˜ ์ฐจ์ด)
  • ์ฟ ํ‚ค / ์„ธ์…˜ ๋ฐฉ์‹๊ณผ ํ† ํฐ ๋ฐฉ์‹์˜ ์ฐจ์ด
  • JWT์˜ ์ž‘๋™์›๋ฆฌ
    • header, payload, signature์˜ ์—ญํ• 
    • JWT๊ฐ€ ์–ด๋–ป๊ฒŒ ํ† ํฐ์˜ ๋ณ€์กฐ๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ์ง€
  • ํ† ํฐ ๋ฐฉ์‹์˜ ํ•œ๊ณ„
  • Authentication๊ณผ Authorization์˜ ์ฐจ์ด
  • Authorization Code์™€ Access Token์˜ ์ฐจ์ด
  • Authorization ์„œ๋ฒ„์™€ Resource ์„œ๋ฒ„์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ† ํฐ ๊ธฐ๋ฐ˜

์„œ๋ฒ„๋‚˜ db์— ์œ ์ € ์ •๋ณด๋ฅผ ๋‹ด๋Š” ์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹์„ ๋ณด์™„ํ•œ ๋ฐฉ์‹

 

ํ† ํฐ์€ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋ณด๊ด€ํ•œ๋‹ค. 

์—ฌ๊ธฐ์„œ ํ† ํฐ์€ ์œ ์ € ์ •๋ณด๋ฅผ ์•”ํ˜ธํ™”ํ•œ ์ƒํƒœ๋กœ ๋‹ด์„ ์ˆ˜ ์žˆ๊ณ , ์•”ํ˜ธํ™”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค. 


๋Œ€ํ‘œ์ ์ธ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ => JWT (JSON WEB TOKEN)

 

header 

- ์–ด๋–ค ์ข…๋ฅ˜์˜ ํ† ํฐ์ธ๊ฐ€?

- ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์•”ํ˜ธํ™” ํ•˜๋Š”๊ฐ€?

{
  "typ": "JWT",
  "alg": "HS256"
}

์ด JSON ๊ฐ์ฒด๋ฅผ base64 ๋ฐฉ์‹์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๋ฉด JWT์˜ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์ธ Header๊ฐ€ ์™„์„ฑ๋œ๋‹ค.

 

 

payload (์•”ํ˜ธํ™”๋˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” No! ๋””์ฝ”๋”ฉ์ด ์‰ฝ๋‹ค.)

- ์œ ์ €์˜ ์ •๋ณด

- ๊ถŒํ•œ์„ ๋ถ€์—ฌ ๋ฐ›์•˜๋Š”๊ฐ€?

- ๊ธฐํƒ€ ํ•„์š”ํ•œ ์ •๋ณด

{
    "iss": "velopert.com",
    "exp": "1485270000000",
    "https://velopert.com/jwt_claims/is_admin": true,
    "userId": "11028373727102",
    "username": "velopert"
}

์ด JSON ๊ฐ์ฒด๋ฅผ base64 ๋ฐฉ์‹์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๋ฉด JWT์˜ ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์ธ Payload๊ฐ€ ์™„์„ฑ๋œ๋‹ค.

 

 

signature

- header, payload๋ฅผ base64 ์ธ์ฝ”๋”ฉํ•œ ๊ฐ’๊ณผ salt๊ฐ’์˜ ์กฐํ•ฉ์œผ๋กœ ์•”ํ˜ธํ™”๋œ ๊ฐ’

 

base64 ์ธ์ฝ”๋”ฉ์€ ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ๋””์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์–ด์„œ Header & Payload ๋Š” ์‰ฝ๊ฒŒ ํ™•์ธ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋น„๋ฐ€ํ‚ค๋ฅผ ์ด์šฉํ•ด์„œ ์•”ํ˜ธํ™”ํ•œ signature๋Š” ๋น„๋ฐ€ํ‚ค๋ฅผ ๋ณด์œ ํ•œ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ๋””์ฝ”๋”ฉ์ด ์–ด๋ ต๋‹ค. 

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

 


ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์ค‘ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ JWT์˜ ์ข…๋ฅ˜

1. ์•ก์„ธ์Šค ํ† ํฐ (access token) = ์œ ์ € ์ด๋ฉ”์ผ, ์—ฐ๋ฝ์ฒ˜, ์‚ฌ์ง„ ๋“ฑ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ ๋ถ€์—ฌ์— ์‚ฌ์šฉํ•œ๋‹ค. / ์œ ํšจ๊ธฐ๊ฐ„์ด ์งง๋‹ค.

2. ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ (refresh token) = ์•ก์„ธ์Šค ํ† ํฐ์˜ ์œ ํšจ๊ธฐ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜๋ฉด ๋ฐœ๊ธ‰๋ฐ›๋Š” ํ† ํฐ. / ์œ ํšจ๊ธฐ๊ฐ„ ๊ธธ๋‹ค. 

 


ํ† ํฐ๊ธฐ๋ฐ˜ ์ธ์ฆ ์ ˆ์ฐจ

1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์•„์ด๋”” / ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋‹ด์•„ ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. 

2. ์•„์ด๋”” / ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ผ ์•”ํ˜ธํ™”๋œ ํ† ํฐ์„ ์ƒ์„ฑํ•œ๋‹ค. (access/ refresh ํ† ํฐ ๋ชจ๋‘ ์ƒ์„ฑ)

3. ์„œ๋ฒ„๊ฐ€ ํ† ํฐ์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ด์ฃผ๋ฉด, ํด๋ผ์ด์–ธํŠธ๋Š” ํ† ํฐ์„ ์ €์žฅํ•œ๋‹ค. (local storage, session storage, cookie ๋“ฑ๋“ฑ)

4. ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTTP ํ—ค๋” ๋˜๋Š” ์ฟ ํ‚ค์— ํ† ํฐ์„ ๋‹ด์•„ ๋ณด๋‚ธ๋‹ค. ์ฟ ํ‚ค์—๋Š” refresh ํ† ํฐ // ํ—ค๋”๋‚˜ ๋ฐ”๋””์—๋Š” access ํ† ํฐ์„ ๋‹ด๋Š”๋‹ค. 

5. ์„œ๋ฒ„๋Š” ํ† ํฐ์„ ํ•ด๋…ํ•ด์„œ ํ† ํฐ์„ ์ธ์ฆํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ ํ›„ ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค. 

 

 


ํ† ํฐ๊ธฐ๋ฐ˜ ์ธ์ฆ์˜ ์žฅ์ ?

1. statelessness & scalability (๋ฌด์ƒํƒœ์„ฑ & ํ™•์žฅ์„ฑ)

- ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. 

- ํ† ํฐ์„ ํ—ค๋”์— ์ถ”๊ฐ€ํ•จ์œผ๋กœ ์ธ์ฆ์ ˆ์ฐจ ์™„๋ฃŒ

 

2. ์•ˆ์ •์„ฑ

- ์•”ํ˜ธํ™” ํ•œ ํ† ํฐ์„ ์‚ฌ์šฉํ•œ๋‹ค. 

- ์•”ํ˜ธํ™” ํ‚ค๋ฅผ ๋…ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. 

 

3. ์–ด๋””์„œ๋‚˜ ์ƒ์„ฑ ๊ฐ€๋Šฅ

-ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋Š” ์„œ๋ฒ„๊ฐ€ ๊ผญ ํ† ํฐ์„ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ๋œ๋‹ค. 

 

4. ๊ถŒํ•œ ๋ถ€์—ฌ์— ์šฉ์ด

- ํ† ํฐ์˜ payload(๋‚ด์šฉ๋ฌผ) ์•ˆ์— ์–ด๋–ค ์ •๋ณด์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ์ง€ ์ •์˜

ex) ์‚ฌ์ง„ ๊ถŒํ•œ๋งŒ ๋ถ€์—ฌ / ์—ฐ๋ฝ์ฒ˜ ๊ถŒํ•œ๋งŒ ๋ถ€์—ฌ / ์‚ฌ์ง„๊ณผ ์—ฐ๋ฝ์ฒ˜ ์‚ฌ์šฉ๊ถŒํ•œ ๋ถ€์—ฌ

 

 


OAUTH 2.0

 

OAUTH๋Š” ์ธ์ฆ์„ ์ค‘๊ฐœํ•ด์ฃผ๋Š” ๋งค์ปค๋‹ˆ์ฆ˜์ด๋‹ค. (์ธ์ฆ์„ ์œ„ํ•œ ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ์˜ ํ•œ ์ข…๋ฅ˜์ด๋‹ค. )

๋ณด์™„๋œ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๊ถŒํ•œ์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค. 

 

๐Ÿ‘‰ ์ด๋ฏธ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์›น ์„œ๋น„์Šค(๋„ค์ด๋ฒ„, ๊นƒํ—™, ํŽ˜์ด์Šค๋ถ, ์นด์นด์˜คํ†ก ๋“ฑ)์—์„œ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ์„ ๋Œ€์‹ ํ•ด์ฃผ๊ณ , ์ ‘๊ทผ ๊ถŒํ•œ์— ๋Œ€ํ•œ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•œ ํ›„ ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์„œ๋ฒ„์—์„œ ์ธ์ฆ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. 

 

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

์šฉ์–ด ์„ค๋ช…
resource owner ์•ก์„ธ์Šค ์ค‘์ธ ๋ฆฌ์†Œ์Šค์˜ ์œ ์ € // ex) hailie
client resource owner๋ฅผ ๋Œ€์‹ ํ•ด์„œ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•˜๋Š” ์‘์šฉํ”„๋กœ๊ทธ๋žจ // ex) ์ƒˆ๋กœ ๋‹ค์šด๋ฐ›์€ app
resource server client ์˜ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๊ณ  ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„ // ex) ์นด์นด์˜คํ†ก
authorization server resource server๊ฐ€ ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›๋Š” ์„œ๋ฒ„ // ex) ์นด์นด์˜คํ†ก
authorization grant client๊ฐ€ ์•ก์„ธ์Šค ํ† ํฐ์„ ์–ป์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ž๊ฒฉ ์ฆ๋ช…
authorization code ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ ์ „์— ํ•„์š”ํ•œ ์ฝ”๋“œ
access token ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” credentials
scope ์ฃผ์–ด์ง„ ์•ก์„ธ์Šค ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค ๋ฒ”์œ„ // ex) ํ”„๋กœํ•„

 


Grant type์ด๋ž€?

client๊ฐ€ ์•ก์„ธ์Šค ํ† ํฐ์„ ์–ป๋Š” ๋ฐฉ๋ฒ•

 

 

Grant type ์ข…๋ฅ˜

- Authorization Code Grant Type : ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•จ

์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด์„œ ๋จผ์ € Authorization Code๋ฅผ ๋ฐ›์•„ ์•ก์„ธ์Šค ํ† ํฐ๊ณผ ๊ตํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•

 

  1. resource owner๊ฐ€ client ๋กœ ์ ‘๊ทผ
  2. client๊ฐ€ resource owner๋ฅผ authorization server๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
  3. resource owner๊ฐ€ authorization server์—๊ฒŒ ์•ก์„ธ์Šค ๊ถŒํ•œ ๋ถ€์—ฌ ์š”์ฒญ
  4. authorization server๊ฐ€ client์—๊ฒŒ authorization code ์ œ๊ณต
  5. client๋Š” authorization server์—๊ฒŒ authorization code๋ฅผ access token์œผ๋กœ ๊ตํ™˜
  6. client๋Š”  access token์„ ํ†ตํ•ด resource server์— ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•ด์ง
  7. client๊ฐ€ resource server์—๊ฒŒ ์•ก์„ธ์Šค ํ† ํฐ๊ณผ ํ•จ๊ป˜ API ์š”์ฒญ์„ ๋ณด๋ƒ„
  8. resource server๋Š” client๊ฐ€ ์š”์ฒญํ•œ resource ์ „๋‹ฌ

 

 

Authorization Code๋Š” ๋ณด์™„์„ฑ์„ ๊ฐ•ํ™”ํ•œ๋‹ค. 

client์—์„œ client-secret์„ ๊ณต์œ ํ•˜๊ณ  ์•ก์„ธ์Šค ํ† ํฐ์„ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๊ฒƒ์€ ํƒˆ์ทจ๋  ์œ„ํ—˜์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— client์—์„œ๋Š” authorization code๋งŒ ๋ฐ›์•„์˜ค๊ณ  server์—์„œ access token ์š”์ฒญ์„ ์ง„ํ–‰ํ•œ๋‹ค.

 

- Refresh Token Grant Type

์ผ์ • ๊ธฐ๊ฐ„ ์œ ํšจ ์‹œ๊ฐ„์ด ์ง€๋‚˜์„œ ๋งŒ๋ฃŒ๋œ ์•ก์„ธ์Šค ํ† ํฐ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋‹ค์‹œ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

 

access token๋ณด๋‹ค refresh token์˜ ์œ ํšจ ์‹œ๊ฐ„์ด ๋Œ€์ฒด๋กœ ์กฐ๊ธˆ ๋” ๊ธธ๊ฒŒ ์„ค์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. 

(์„œ๋ฒ„๋งˆ๋‹ค refresh token์— ๋Œ€ํ•œ ์ •์ฑ…์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— refresh token ์‚ฌ์šฉ์ „์— ์„œ๋ฒ„ ์ •์ฑ… ์•Œ์•„๋ณด๊ธฐ)

 

  1. client๊ฐ€ authorization server์—๊ฒŒ refresh token์„ ํ†ตํ•ด์„œ ์ƒˆ๋กœ์šด ์•ก์„ธ์Šค ํ† ํฐ์„ ์š”์ฒญ
  2. authorization server๋Š” client์—๊ฒŒ ์ƒˆ๋กœ์šด ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐ˜ํ™˜ํ•จ
  3. client๋Š” ์•ก์„ธ์Šค ํ† ํฐ์„ ํ†ตํ•ด resource server์˜ resource์— ์•ก์„ธ์Šค ๊ฐ€๋Šฅ

 

- Implicit Grant Type

- Client Credentials Grant Type

- Resource Owner Credentials Grant Type


์ฐธ๊ณ )

https://defineall.tistory.com/1011

https://yung-developer.tistory.com/112

https://ingg.dev/cors/#cors_solution

https://krpeppermint100.medium.com/ts-nodejs-express%EC%9D%98-%EC%9A%94%EC%B2%AD-%EC%9D%91%EB%8B%B5-%EC%97%90%EB%9F%AC-%ED%95%B8%EB%93%A4%EB%A7%81-8943ab7bd13b

https://cinema4dr12.tistory.com/838

https://velog.io/@guswlsapdlf/Session-Cookie-Persistent-Cookie

https://velog.io/@yaytomato/ํ”„๋ก ํŠธ์—์„œ-์•ˆ์ „ํ•˜๊ฒŒ-๋กœ๊ทธ์ธ-์ฒ˜๋ฆฌํ•˜๊ธฐ

๐Ÿ˜ƒ ์ž˜๋ชป๋œ ๊ฐœ๋… ์ „๋‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €์˜ ์„ฑ์žฅ์— ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค๐Ÿค“