๐Ÿ’ก Computer Science

[JWT] JSON Web Token์˜ ๊ตฌ์กฐ, ์žฅ์ , ํ•œ๊ณ„

์—ฐ_์šฐ๋ฆฌ 2022. 2. 3. 22:28
๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

     

     

     

    JWT์„ ์•Œ์•„๋ณด๊ธฐ ์ „ ์‚ฌ์ „์ง€์‹

     

    Cookie์™€ Session, ๊ทธ๋ฆฌ๊ณ  Token

    ๋ชฉ์ฐจ HTTP์˜ ํŠน์ง• HTTP๋Š” ๋น„์—ฐ๊ฒฐ์„ฑ(Connectionless)๊ณผ ๋ฌด์ƒํƒœ(Stateless)๋ผ๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์—๊ฒŒ Request๋ฅผ ๋ณด๋‚ด๋ฉด์„œ ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ๋˜๋Š”๋ฐ ์ด๋•Œ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ Responseํ•˜๋ฉด์„œ ๋งบ์—ˆ๋˜

    lotuus.tistory.com

     

    ์ •๋ณด๋ณด์•ˆ์˜ 3๋Œ€ ์š”์†Œ(๊ธฐ๋ฐ€์„ฑ, ๋ฌด๊ฒฐ์„ฑ, ๊ฐ€์šฉ์„ฑ)์™€ RSA ์•”ํ˜ธํ™” ๋ฐฉ์‹

    ์ •๋ณด๋ณด์•ˆ์˜ 3๋Œ€ ์š”์†Œ ๊ธฐ๋ฐ€์„ฑ Confidentiality : ํ—ˆ๊ฐ€๋ฐ›์€ ์ž๋งŒ ์ •๋ณด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌด๊ฒฐ์„ฑ Integrity : ํ—ˆ๊ฐ€๋ฐ›์€ ์ž๋งŒ ๋ณ€๊ฒฝํ•ด์•ผํ•œ๋‹ค. ๊ฐ€์šฉ์„ฑ Availability : ํ—ˆ๊ฐ€๋ฐ›์€ ์ž๋ฉด ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

    lotuus.tistory.com

     

     

    JWT : Json Web Token

    JWT๋Š” Token๋ฐฉ์‹์„ ์ด์šฉํ•˜์—ฌ ์„œ๋ฒ„๊ฐ€ SessionDB๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๊ณ , ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋กœ๊ทธ์ธํ•˜๋ฉด, ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ "์ธ์ฆOK"๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ๋กœ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•ด์ค€๋‹ค.

     

    ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ธ์ฆ์ •๋ณด๋ฅผ ์ฃผ๊ฒŒ๋˜๋ฉด? ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ˆ˜์ •๋„ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ!

    ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•˜๊ฒŒ๋˜๋ฉด ์„œ๋ฒ„๋Š” ์ด ํ† ํฐ์ด ์•ˆ์ „ํ•œ ํ† ํฐ์ธ์ง€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ์„๊นŒ??

     

     

     

    JWT ๊ตฌ์กฐ

    ์ฐธ๊ณ  : https://jwt.io/#debugger-io

     

    JWT๋Š” { xxxxxxx . yyyyyyy . zzzzzzz } ์ด๋Ÿฐ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค.

     

    ๐Ÿ“Œ ์ฃผ์˜!! Header์™€ Payload๋Š” ์•”ํ˜ธํ™” ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค!!! 

    ๋”ฐ๋ผ์„œ Payload์—๋Š” ์ ˆ๋Œ€ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

    ๊ตฌ๋ถ„ ๋ช…์นญ ์—ญํ•  ํ˜•ํƒœ
    xxxxxxx Header ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ† ํฐ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค {
      "alg": "HS256",   // signature๋ฅผ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์•”ํ˜ธํ™”ํ• ์ง€
      "typ": "JWT"      // ์–ด๋–ค ํƒ€์ž…์ธ์ง€
    }
    yyyyyyy Payload ์‹ค์ œ ๋ณด๊ด€ํ•  ๋ฐ์ดํ„ฐ๋ฅผ JSONํ˜•์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค {
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }
    zzzzzzz Signature ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ๋Š”์ง€๋ฅผ ํŒ๋‹จํ•œ๋‹ค HMACSHA256(
      base64UrlEncode( header ) + "." +
      base64UrlEncode( payload ),
       secret key      // ์ •๋ณด๋“ค๋กœ ํ•ด์‹œ๊ฐ’ ์ƒ์„ฑ
    )

     * base64Url : ์ธ์ฝ”๋”ฉ & ๋””์ฝ”๋”ฉ์ด ๊ฐ€๋Šฅํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (์ผ์ข…์˜ ์•”ํ˜ธํ™”)

     * HMACSHA256 : HMAC + SHA256

     * HMAC : ์•”ํ˜ธํ™”๋œ ํ•ด์‹œ๊ฐ’(SHA256)๊ณผ ์•”ํ˜ธํ™” ํ‚ค๋ฅผ ๊ฐ€์ง€๋Š” ๋ฉ”์‹œ์ง€ ์ธ์ฆ ์ฝ”๋“œ

     * SHA256 : ๋ณตํ˜ธํ™” ๋ถˆ๊ฐ€๋Šฅํ•œ ํ•ด์‹œ๊ฐ’

     

     

    ์œ ์ €๊ฐ€ ์„œ๋ฒ„๋กœ ํ† ํฐ์„ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„์—์„œ๋Š”

    1. ์œ ์ €๊ฐ€ ๋ณด๋‚ด์ค€ Header์™€ Payload + ์„œ๋ฒ„์˜ secret key๋ฅผ ์กฐํ•ฉํ•˜์—ฌ Signature๋ฅผ ๋งŒ๋“ ๋‹ค

    2. ์œ ์ €๊ฐ€ ๋ณด๋‚ด์ค€ Signature์™€ 1๋ฒˆ์„ ๋น„๊ตํ•œ๋‹ค

    3. ๋งŒ์•ฝ ๊ฐ’์ด ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด? ์กฐ์ž‘๋œ ๋ฐ์ดํ„ฐ!!

     

    JWT์˜ Signature ๋•๋ถ„์— ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ† ํฐ์„ ์ˆ˜์ •ํ•ด๋„ ์„œ๋ฒ„๊ฐ€ ๋ฐ›์€ ํ† ํฐ์ด ์•ˆ์ „ํ•œ์ง€ ๊ตฌ๋ณ„ํ•ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

     

     

     

     

    JWT์˜ ์žฅ์ 

    ๊ธฐ์กด์˜ ์„ธ์…˜๋ฐฉ์‹์—์„œ๋Š” ํŠธ๋ž˜ํ”ฝ์ด ๋Š˜์–ด๋‚ ์ˆ˜๋ก ์„œ๋ฒ„๊ฐ€ SessionDB๋ฅผ ์ฆ์„คํ•ด์•ผํ–ˆ๋‹ค.

    ๋˜ํ•œ, SessionId๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ์ด๋ฆฌ์ €๋ฆฌ ํ—ค๋งค๊ณ  ๋‹ค๋…€์•ผํ–ˆ์—ˆ๋Š”๋ฐ JWT๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋Ÿด์ผ์ด ์—†๋‹ค.

     

    JWT๋Š” ๋”์ด์ƒ SessionDB๊ฐ€ ํ•„์š”์—†๋‹ค. ์œ ์ €ํ•œํ…Œ ๋ฐ›์€ Signature๋ฅผ ๊ฒ€์ฆ๋งŒ ํ•ด์ฃผ๋ฉด๋œ๋‹ค. 

     

     

     

    JWT์˜ ํ•œ๊ณ„

    1. A ์„œ๋น„์Šค๋Š” 1๊ณณ์—์„œ๋งŒ ๋กœ๊ทธ์ธ์„ ํ•˜๊ฒŒ๋” ํ•˜๋ คํ•œ๋‹ค.

       (PC์— ๋กœ๊ทธ์ธํ•˜๋ฉด Mobile์ด ๋กœ๊ทธ์•„์›ƒ๋˜๊ณ , Mobile์— ๋กœ๊ทธ์ธํ•˜๋ฉด PC๊ฐ€ ๋กœ๊ทธ์•„์›ƒ๋˜๊ฒŒ)

       ์„œ๋ฒ„๋Š” ํ† ํฐ์„ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ์š”์ฒญ๋ฐ›์€ ํ† ํฐ์— ๋Œ€ํ•ด์„œ๋งŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋•Œ๋ฌธ์—

       token๊ฐ’๋งŒ์„ ๊ฐ€์ง€๊ณ  ๊ธฐ์กด์— ๋กœ๊ทธ์ธ์ด ๋˜์–ด์žˆ๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์•Œ์ˆ˜๊ฐ€์—†๋‹ค!!

     

    2. ๐Ÿ˜€์œ ์ €๊ฐ€ A ์„œ๋น„์Šค์— ๋กœ๊ทธ์ธํ•˜์—ฌ ์œ ์ €์˜ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜์˜€๋‹ค.

        ๊ทธ๋Ÿฐ๋ฐ ์ค‘๊ฐ„์—์„œ ๐Ÿ˜ˆํ•ด์ปค๊ฐ€ ์ •๋ณด๋ฅผ ๊ฐ€๋กœ์ฑ„๋ฒ„๋ ธ๋‹ค! ๐Ÿ˜ˆํ•ด์ปค๊ฐ€ ๊ฐ€์ง„ ์ •๋ณด๋ฅผ ๋ชป์“ฐ๊ฒŒ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š”๋ฐ

        ์„œ๋ฒ„๋Š” ํ† ํฐ์„ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ์š”์ฒญ๋ฐ›์€ ํ† ํฐ์— ๋Œ€ํ•ด์„œ๋งŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋•Œ๋ฌธ์—

        ๊ฐ™์€ ๐Ÿ˜€์œ ์ €์˜ ์ •๋ณด๋กœ ์ ‘์†ํ•˜๋ฉด ์ง„์งœ ๐Ÿ˜€์œ ์ €๊ฐ€ ์ ‘์†ํ•œ๊ฒƒ์ธ์ง€, ๐Ÿ˜ˆํ•ด์ปค๊ฐ€ ์ ‘์†ํ•œ๊ฒƒ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

        ํ† ํฐ์ด ์œ ์ถœ๋˜์–ด๋ฒ„๋ฆฌ๋ฉด ๋งŒ๋ฃŒ์‹œํ‚ฌ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค!!

     

     

     

     

     

    ๊ฒฐ๋ก 

    JWT์˜ ์‚ฌ์šฉ ๋ชฉ์ ์€ "์•”ํ˜ธํ™”"๊ฐ€ ์•„๋‹Œ "๋ฌด๊ฒฐ์„ฑ"์— ์žˆ๋‹ค.

    ์ฆ‰, "์ด๊ฑฐ ๋‚ด๊ฐ€ ๋ณด๋‚ธ ํ† ํฐ ๋งž์•„! ๋‹ค๋ฅธ์‚ฌ๋žŒ์ด ์ˆ˜์ •์•ˆํ–ˆ์–ด" ํ•˜๊ณ  ๋ฐ์ดํ„ฐ์˜ ์œ„์กฐ๋ฅผ ๋ณด์žฅํ•ด์ฃผ๋Š” ์—ญํ• ์ด ํ•ต์‹ฌ์ด๋‹ค.

     

     

     

     

    ๋ฐ˜์‘ํ˜•
    • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
    • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
    • ํŠธ์œ„ํ„ฐ ๊ณต์œ ํ•˜๊ธฐ
    • ๊ตฌ๊ธ€ ํ”Œ๋Ÿฌ์Šค ๊ณต์œ ํ•˜๊ธฐ
    • ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ