JWT(JSON Web Token) À̶õ?
ÀÎÁõ°ú ÅäÅ« ±×¸®°í JWT?
ÃÖ±Ùµé¾î º¸¾È ¹× ÀÎÁõÀ» À§Çؼ JWT¸¦ »ç¿ëÇÏ°Ô µÇ¾ú´Ù.
±×·¡¼ »ç¿ë¸¸ ÇÏ´Ù°¡ À̹ø¿¡ JWT¿¡ ´ëÇÑ °³³ä°ú ±¸Á¶, »ç¿ë¹ý°ú ¹®Á¦Á¡ µîÀ» ¾Ë¾Æº¸°íÀÚ ÇÑ´Ù.
ÀÏ¹Ý ÅäÅ« ±â¹ÝÀÇ ÀÎÁõ°ú Ŭ·¹ÀÓ(Claim) ÅäÅ« ±â¹Ý ÀÎÁõ
ÀÏ¹Ý ÅäÅ« ±â¹ÝÀº °ú°Å¿¡ ¸¹ÀÌ »ç¿ëÇÏ´ø ¹æ½ÄÀÌ´Ù.
ÁÖ·Î Àǹ̰¡ ¾ø´Â ¹®ÀÚ¿(Random string) ±â¹ÝÀ¸·Î ±¸¼ºµÇ¾î ÀÖÀ¸¸ç ¾Æ·¡¿Í °°ÀÌ Ç¥ÇöÀÌ µÈ´Ù
1 | a9ace025c90c0da2161075da6ddd3492a2fca776 |
±×¸®°í »ç¿ëÇÒ ¶§´Â ¾Æ·¡¿Í °°Àº jsonÀ¸·Î º¸³»´Â ¹æ½ÄÀ¸·Î »ç¿ëÇÏ°Ô µË´Ï´Ù.
1 | { |
±×·±µ¥ ÀÌ·± ÀÏ¹Ý ÅäÅ«Àº ´Ü¼øÇÑ ¹®ÀÚ¿À̱⠶§¹®¿¡ Á¤º¸¸¦ ´ã°Å³ª ÇÒ ¼ö ¾ø´Ù.
Å©°Ô º¸ÀÚ¸é ¾Æ·¡¿Í °°Àº ¹®Á¦Á¡À» °¡Áö°í ÀÖ´Ù.
- ¹ß±ÞµÈ ÅäÅ«¿¡ ´ëÇؼ ¸¸·á¸¦ ½Ãų ¼ö´ÜÀÌ ¾ø´Ù.
- ¹ß±ÞµÈ ÅäÅ«À» °Ë»çÇϰųª ó¸®ÇÒ ¶§¸¶´Ù DB¿¡ Á¢±ÙÇÏ¿© °Ë»çÇÒ °æ¿ì ºÎ´ãÀÌ »ý±ä´Ù.
- »ç¿ëÀÚ ·Î±×¾Æ¿ô µîÀ¸·Î ÀÎÇÑ ÅäÅ«À» °ü¸®ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ ¾ø´Ù.
ÀÌ¿Í °°Àº ¹®Á¦¸¦ ¾î´ÀÁ¤µµ ÇØ°áÇÒ ¼ö ÀÖ´Â °ÍÀÌ Å¬·¹ÀÓ(Claim) ±â¹Ý ÅäÅ« ¹æ½ÄÀÌ´Ù.
Ŭ·¹ÀÓ(Claim)À̶õ »ç¿ëÀÚ Á¤º¸³ª µ¥ÀÌÅÍ ¼Ó¼º µîÀ» ÀǹÌÇÑ´Ù.
±×·¡¼ Ŭ·¹ÀÓ ÅäÅ«À̶ó Çϸé ÅäÅ« ¾È¿¡ Àú·± Á¤º¸¸¦ ´ã°í ÀÖ´Â ÅäÅ«À̶ó »ý°¢ÇÏ¸é µÈ´Ù.
¿¹¸¦ µé¸é ¾Æ·¡¿Í °°ÀÌ Á¤º¸¸¦ ´ã°í ÀÖ´Â °ÍÀ» Ŭ·¹ÀÓ ±â¹ÝÀ̶ó ÇÒ ¼ö ÀÖ´Ù.
1 | { |
ÀÌ·± Ŭ·¹ÀÓÀ» ±â¹ÝÇÑ ÅäÅ« Áß °¡Àå ´ëÇ¥ÀûÀÎ °ÍÀÌ ¹Ù·Î JWT´Ù.
What is JWT?
JWT(Json Web Token)Àº À§¿¡¼ À̾߱â ÇÑ Å¬·¹ÀÓ ±â¹Ý ÅäÅ«À̸ç, À̸§¿¡¼ ¾Ë ¼ö ÀÖ´Â °Íó·³ JSONÀ» ÀÌ¿ëÇÑ ÅäÅ«ÀÌ°í À¥ Ç¥ÁØ(RFC 7519)¸¦ ±¸ÇöÇÑ °ÍÀÌ´Ù.
ÀÚ¼¼ÇÑ °ÍÀº JWT °ø½ÄÆäÀÌÁö¿¡¼ È®ÀÎ °¡´ÉÇÏ´Ù.
JWT´Â Çì´õ(header), ÆäÀ̷εå(payload), ¼¸í(signature) ¼¼ °¡Áö·Î ³ª´²Á® ÀÖÀ¸¸ç, ¾Æ·¡¿Í °°Àº ÇüÅ·Π±¸¼ºµÇ¾î ÀÖ´Ù.
1 | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c |
°¢ ±¸ºÐÀº . ±¸ºÐÀÚ·Î ³ª´² Ç¥ÇöµÇ¸ç, °¢ °ªÀº BASE64·Î ÀÎÄÚµù µÇ¾î ÀÖ´Ù.
Header
Çì´õ¿¡´Â typ¿Í alg µÎ °¡Áö Á¤º¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù.
- typ
- ÅäÅ«ÀÇ Å¸ÀÔÀ» ÁöÁ¤ (jwt)
- alg
- ÇØ½Ì ¾Ë°í¸®ÁòÀ» ÁöÁ¤
- ÁÖ·Î HMAC SHA256 ¶Ç´Â RSA¸¦ »ç¿ëÇϸç ÀÌ ¾Ë°í¸®ÁòÀº ¼¸í(signature)¿¡¼ »ç¿ëÇÑ´Ù.
Çì´õ ÇüÅ´ ¾Æ·¡¿Í °°´Ù.
Payload
ÆäÀ̷εå¶ó ºÒ¸®´Â ºÎºÐ¿¡´Â ÅäÅ«¿¡¼ »ç¿ëÇÒ Á¤º¸°¡ ´ã°ÜÀÖ°í À̸¦ À§¿¡¼ ¼³¸íÇÑ Å¬·¹ÀÓÀ̶ó ºÎ¸£´Â °ÍµéÀÌ ÀúÀåµÇ¾î ÀÖ´Ù.
Key/Value ¹æ½ÄÀ¸·Î ÀÌ·ïÁ®ÀÖÀ¸¸ç (JSON°ú À¯»ç) ´Ù¼öÀÇ Á¤º¸¸¦ ³ÖÀ» ¼ö ÀÖ´Ù.
ÀÌ Å¬·¹ÀÓÀº ÃÑ ¼¼ °¡Áö·Î ³ª´¶´Ù.
µî·ÏµÈ Ŭ·¹ÀÓ (Registered Claim)
µî·ÏµÈ Ŭ·¹ÀÓÀº ÅäÅ« Á¤º¸¸¦ Ç¥ÇöÇϱâ À§ÇØ ÀÌ¹Ì Á¤ÇØÁø µ¥ÀÌÅÍ Á¾·ùÀ̸ç, ¸ðµÎ ¼±ÅÃÀûÀ¸·Î ÀÛ¼º °¡´ÉÇÏ´Ù.
Á¾·ù´Â ¾Æ·¡¿Í °°´Ù.
- iss: ÅäÅ« ¹ß±ÞÀÚ (issuer)
- sub: ÅäÅ« Á¦¸ñ (subject)
- aud: ÅäÅ« ´ë»óÀÚ (audience)
- exp: ÅäÅ«ÀÇ ¸¸·á½Ã°£ (expiraton)
- NumericDate Çü½ÄÀ¸·Î µÇ¾îÀÖ¾î¾ß ÇÑ´Ù (Ex: 1480849147370)
- nbf: ÅäÅ« È°¼º ³¯Â¥
- ÀÌ ³¯Â¥°¡ Áö³ª±â Àü ÅäÅ«Àº È°¼ºÈ µÇÁö ¾Ê´Â´Ù.
- iat: ÅäÅ«ÀÌ ¹ß±ÞµÈ ½Ã°£ (issued at)
- ÀÌ °ªÀ» »ç¿ëÇÏ¿© ÅäÅ« ¹ß±Þ ÀÌÈÄ ¾ó¸¶³ª ½Ã°£ÀÌ Áö³µ´ÂÁö¸¦ ¾Ë ¼ö ÀÖ´Ù.
- jti: JWTÀÇ °íÀ¯ ½Äº°ÀÚ
- Áߺ¹ ¹æÁö¸¦ À§ÇØ »ç¿ëÇϸç, ÀÏȸ¿ë ÅäÅ«(Access Token µî)¿¡ »ç¿ëÇÑ´Ù.
°ø°³ Ŭ·¹ÀÓ (Public Claim)
°ø°³ Ŭ·¹ÀÓÀº ¼·Î Ãæµ¹ÀÌ ÀϾÁö ¾Ê´Â À̸§À» °¡Áö°í ÀÖ¾î¾ßÇÑ´Ù.
±×·¡¼ URL ÇüÅ·ΠÀÛ¼ºÇÏ¸ç ¿¹½Ã´Â ¾Æ·¡¿Í °°´Ù.
1 | { "https://hexlant.com": true } |
ºñ°ø°³ Ŭ·¹ÀÓ (Private Claim)
ºñ°ø°³ Ŭ·¹ÀÓÀº ½ÇÁ¦ »ç¿ëÀ» ÇÏ´Â °³¹ßÀÚ°¡ ÁöÁ¤ÇÏ´Â °ÍÀ¸·Î ¼¹ö¿Í Ŭ¶óÀ̾ðÆ®°¡ ¼·Î Á¤ÀÇÇÏ¿© »ç¿ëÇϴ Ŭ·¹ÀÓÀ» ÀǹÌÇÑ´Ù.
¾Æ·¡¿Í °°ÀÌ »ç¿ëÇϱ⵵ ÇÑ´Ù.
1 | { "token_type": "access" } |
°á·ÐÀûÀ¸·Î ÆäÀ̷εå´Â ¾Æ·¡¿Í °°ÀÌ ±¸¼ºµÈ´Ù.
Signature
¼¸íÀº À§¿¡¼ ¸¸µç Header¿Í Payload ÀÇ °¢ °ªÀ» BASE64·Î ÀÎÄÚµù ÇÏ°í, ±× °ªÀ» ºñ¹ÐÅ°¸¦ ÀÌ¿ëÇØ Çì´õ¿¡¼ Á¤ÀÇÇÑ ¾Ë°í¸®ÁòÀ¸·Î (HS256À̳ª SHA256 µî) ÇؽÌÀ» ÇÏ°í, ÀÌ °ªÀ» ´Ù½Ã BASE64·Î ÀÎÄÚµùÇÏ¿© »ý¼ºÇÑ´Ù.
JWT Debugger
JWT °ø½Ä ÆäÀÌÁö¿¡¼´Â JWT¸¦ °£´ÜÇÏ°Ô µð¹ö±ë Çغ¼ ¼ö ÀÖ´Â ±â´ÉÀ» Á¦°øÇÑ´Ù.
ÀÌ°÷¿¡¼ »ç¿ë °¡´ÉÇÏ´Ù.
»çÀÌÆ®¿¡¼ È®ÀÎÇÏ¸é ¾Ë ¼ö ÀÖ´Â °Íó·³ ¼¸í¿¡¼ Å° °ªÀ» º¯°æÇÏ¸é ¾Æ·¡ÀÇ »çÁøó·³ ¼¸íÀÇ BASE64 °ªÀÌ º¯°æµÇ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
JWT¸¦ »ç¿ëÇÒ °æ¿ì¡¦
À§¿¡¼ ¾Ë ¼ö ÀÖ´Â °Íó·³ ¸¸¾à ÅäÅ« °ªÀ» ´©±º°¡ ¼öÁ¤ÇÒ °æ¿ì ¾Æ·¡ÀÇ »çÁøó·³ Debuuger¿¡¼ È®ÀÎÇÒ ¼ö ÀÖ´Â °Íó·³ º¯Á¶°¡ µÈ °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
±×¸®°í JWT ÅäÅ« ÆäÀ̷ε忡´Â BASE64·Î ÀÎÄÚµù¸¸ µÉ »Ó ÀÌ°ÍÀ» ´Ù½Ã µðÄÚµùÇÏ¿© Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù.
±×·¡¼ °¡±ÞÀû ÅäÅ«¿¡´Â Áß¿ä Á¤º¸¸¦ ´ãÁö ¾Ê´Â °ÍÀ» ÃßõÇÑ´Ù.
Á¤¸®
À̷νá JWT¸¦ ¾Ë¾Æº¸¾Ò´Ù.
´ÙÀ½ Æ÷½ºÆÿ¡¼´Â JWT¸¦ ¾î¶² ½ÄÀ¸·Î È°¿ëÇÏ´ÂÁö¿¡ ´ëÇÏ¿© ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú´Ù.