ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [GDSC/Front-End] JWT ๋กœ๊ทธ์ธ
    Front-end/GDSC 2022. 12. 6. 16:46

    ๐Ÿ“• JSON Web Token

    • ์ธ์ฆ์— ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ ์•”ํ˜ธํ™”์‹œํ‚จ JSON ํ† ํฐ
    • ์›นํ‘œ์ค€์œผ๋กœ์„œ, ๋‘ ๊ฐœ์ฒด์—์„œ JSON ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋ณ๊ณ  ์ž๊ฐ€์ˆ˜์šฉ์ ์ธ(self-contained) ๋ฐฉ์‹์œผ๋กœ ์ •๋ณด๋ฅผ ์•ˆ์ •์„ฑ ์žˆ๊ฒŒ ์ „๋‹ฌ
    • JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ์€ JWT ํ† ํฐ(Access Token)์„ HTTP ํ—ค๋”์— ์‹ค์–ด ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐฉ์‹

     

    ๐Ÿ“Œ JWT ์‚ฌ์šฉ ์ˆœ์„œ

    1. ํด๋ผ์ด์–ธํŠธ ์‚ฌ์šฉ์ž๊ฐ€ ์•„์ด๋””, ํŒจ์Šค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์›น์„œ๋น„์Šค ์ธ์ฆ
    2. ์„œ๋ฒ„์—์„œ ์„œ๋ช…๋œ JWT๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ต์œผ๋กœ ๋Œ๋ ค์คŒ
    3. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์š”๊ตฌํ•  ๋•Œ JWT๋ฅผ HTTP Header์— ์ฒจ๋ถ€
    4. ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์˜จ JWT๋ฅผ ๊ฒ€์ฆ

     

    ๐Ÿ“Œ JWT ๊ตฌ์กฐ

    WT๋Š” ‘.’์„ ๊ตฌ๋ถ„์ž๋กœ 3๊ฐ€์ง€์˜ ๋ฌธ์ž์—ด๋กœ ๋˜์–ด ์žˆ๋‹ค.

    aaaaaa.bbbbbb.cccccc
    ํ—ค๋”(header).๋‚ด์šฉ(payload).์„œ๋ช…(signature)

    (1) header

    ์ •์˜/๊ฐœ๋…

    • JWT ์—์„œ ์‚ฌ์šฉํ•  ํƒ€์ž…๊ณผ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ข…๋ฅ˜
    • JWT์—์„œ ์‚ฌ์šฉํ•  ํƒ€์ž…๊ณผ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ข…๋ฅ˜๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค.

    ์“ฐ์ž„ 

    • ๋‘ ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ๋งŒ๋“ค๊ณ , URL-safe BASE64 ์ธ์ฝ”๋”ฉํ•˜๋ฉด ์™„์„ฑ

    typ 

    • ํ† ํฐ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•œ๋‹ค. ์ฆ‰, JWT์ด๋‹ค.

    alg 

    • ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง€์ •ํ•œ๋‹ค. ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ๋Š” ๋ณดํ†ต HMAC SHA256 ํ˜น์€ RSA๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ† ํฐ์„ ๊ฒ€์ฆํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” signature ๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

     

    (2) payload

    ์ •์˜/๊ฐœ๋…

    • ์„œ๋ฒ„์—์„œ ์ฒจ๋ถ€ํ•œ ์‚ฌ์šฉ์ž ๊ถŒํ•œ ์ •๋ณด์™€ ๋ฐ์ดํ„ฐ
    • ์ฆ‰, ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฃผ๊ณ ๋ฐ›๋Š” ์‹œ์Šคํ…œ์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋  ์ •๋ณด์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ๋Š” ์„น์…˜
    • payload ๋ถ€๋ถ„์—๋Š” ํ† ํฐ์— ๋‹ด์„ ์ •๋ณด๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค. ์—ฌ๊ธฐ์— ๋‹ด๋Š” '์ •๋ณด์˜ ํ•œ ์กฐ๊ฐ'์„ ํด๋ ˆ์ž„(claim)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
    • name/value์˜ ํ•œ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ํ† ํฐ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํด๋ ˆ์ž„๋“ค์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

    ์“ฐ์ž„ 

    • ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ๋งŒ๋“ค๊ณ , URL-safe BASE 64 ์ธ์ฝ”๋”ฉํ•˜๋ฉด ์™„์„ฑ

    ์„ธ ๊ฐ€์ง€ ํด๋ ˆ์ž„

    • ํด๋ ˆ์ž„์€ ๋“ฑ๋ก๋œ(registered) ํด๋ ˆ์ž„๊ณต๊ฐœ(public) ํด๋ ˆ์ž„๋น„๊ณต๊ฐœ(private) ํด๋ ˆ์ž„์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋‹ค.

     

    (3) signature

    ์ •์˜/๊ฐœ๋… 

    • ์„œ๋ช…์€ ํ—ค๋”์˜ ์ธ์ฝ”๋”ฉ ๊ฐ’๊ณผ, ์ •๋ณด์˜ ์ธ์ฝ”๋”ฉ ๊ฐ’์„ ํ•ฉ์นœ ํ›„, ์ฃผ์–ด์ง„ ๋น„๋ฐ€ํ‚ค๋กœ ํ•ด์‰ฌ๋ฅผ ํ•˜์—ฌ ์ƒ์„ฑ
    • Header, Payload ๋ฅผ Base64 URL-safe Encode ๋ฅผ ํ•œ ์ดํ›„ Header ์— ๋ช…์‹œ๋œ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๊ณ , ๊ฐœ์ธํ‚ค(Private Key)๋กœ ์„œ๋ช…ํ•œ ์ „์ž์„œ๋ช…์ด ๋‹ด๊ฒจ์žˆ๋‹ค.

    ํŠน์ง• 

    • ์‹œ๊ทธ๋‹ˆ์ฒ˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ—ค๋”์—์„œ ์ •์˜ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐฉ์‹(alg)์„ ํ™œ์šฉํ•œ๋‹ค.
    • ์‹œ๊ทธ๋‹ˆ์ฒ˜์˜ ๊ตฌ์กฐ๋Š” (ํ—ค๋” + ํŽ˜์ด๋กœ๋“œ)์™€ ์„œ๋ฒ„๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ์œ ์ผํ•œ key ๊ฐ’์„ ํ•ฉ์นœ ๊ฒƒ์„ ํ—ค๋”์—์„œ ์ •์˜ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์•”ํ˜ธํ™”๋ฅผ ํ•œ๋‹ค.

    ์“ฐ์ž„ 

    • header๊ณผ payload๋ฅผ URL-safe BASE64 ์ธ์ฝ”๋”ฉ ํ›„, ๋งˆ์นจํ‘œ(.)๋กœ ์ด์–ด์ค€ ๋’ค, ์„œ๋ฒ„์—์„œ ์ •ํ•œ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋”ฐ๋ผ, ์„œ๋ฒ„์—์„œ ์ƒ์„ฑํ•œ ๋น„๋ฐ€ํ‚ค๋ฅผ ์ด์šฉํ•ด ์•”ํ˜ธํ™”ํ•œ ํ›„, URL-safe BASE64 ์ธ์ฝ”๋”ฉ์„ ํ•˜๋ฉด ์™„์„ฑ

     


    ๐Ÿ“• OAuth

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

     

     

    ๐Ÿ“Œ ๋™์ž‘ ๋งค์ปค๋‹ˆ์ฆ˜

    1 ~ 2. ๋กœ๊ทธ์ธ ์š”์ฒญ

    Resource Owner๊ฐ€ ์šฐ๋ฆฌ ์„œ๋น„์Šค์˜ '๊ตฌ๊ธ€๋กœ ๋กœ๊ทธ์ธํ•˜๊ธฐ' ๋“ฑ์˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด ๋กœ๊ทธ์ธ์„ ์š”์ฒญํ•œ๋‹ค.

    3 ~ 4. ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์ œ๊ณต, ID/PW ์ œ๊ณต

    5 ~ 6. Authorization Code ๋ฐœ๊ธ‰, Redirect URI๋กœ ๋ฆฌ๋””๋ ‰ํŠธ

    Authorization Code๋ž€ Client๊ฐ€ Access Token์„ ํš๋“ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ž„์‹œ ์ฝ”๋“œ์ด๋‹ค. ์ด ์ฝ”๋“œ๋Š” ์ˆ˜๋ช…์ด ๋งค์šฐ ์งง๋‹ค. (์ผ๋ฐ˜์ ์œผ๋กœ 1~10๋ถ„)

    7 ~ 8. Authorization Code์™€ Access Token ๊ตํ™˜

    9. ๋กœ๊ทธ์ธ ์„ฑ๊ณต

    10 ~ 13. Access Token์œผ๋กœ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ

     

     

    ๐Ÿ“Œ React์—์„œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

     

    [React17]React์—์„œ JWT ์ธ์ฆ ๊ตฌํ˜„ํ•˜๊ธฐ

    React์—์„œ JWT๋ฅผ ์ด์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

    5xJIN.github.io

     

    'Front-end > GDSC' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

    [GDSC/์ŠˆํŒŒ์ธ๋“œ] ๊ฐœ๋ฐœ ์ผ์ง€ #1-2์ฃผ ์ฐจ  (0) 2023.01.09
    [GDSC/Front-End] React lazy loading  (0) 2022.11.08
Designed by Tistory.