JWT(Json Web Token)

2 분 소요

0. JWT(Json Web Token)

JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed. JWTs can be signed using a secret (with the HMAC algorithm) or a public/private key pair using RSA or ECDSA.

JSON Web Token(JWT)은 당사자 간의 정보를 안전하게 전송하기 위한 간결하고 자체적인 방법을 JSON 객체로 정의하는 개방형 표준(RFC 7519)입니다. 이 정보는 디지털 방식으로 서명되기 때문에 검증되고 신뢰될 수 있습니다. JWT는 비밀(HMAC 알고리즘으로)을 사용하거나 RSA 또는 ECDSA를 사용하여 공개/개인 키 쌍을 사용하여 서명할 수 있습니다.

  • 서버에서 클라이언트 인증을 확인하는 방식은 Cookie, Session, Token 3가지 방식이 있습니다.
  • 이번 글에서는 우선 Token 방식의 인증 방식(Authentication Method)에 대해서 다룰 생각입니다.



1. JWT(Json Web Token)

  • 1.1 Conception

    • 클라이언트와 서버간에 인증에 필요한 정보들을 암호화시킨 JSON 토큰이다.
    • JWT 토큰(Access Token)을 Http header에 실어 서버에서 클라이언트를 식별한다.
    • 해당 토큰은 클라이언트에 대한 정보를 인코딩하여 가지고 있다.
  • 1.2 Json Format

    • JWT(Json Web Token) = Header + Payload + Signature image info

    • 1.2.1 Header
      • alg, typ에 대한 정보를 가지고 있다.
      • alg은 서명 암호화 알고리즘을 결정한다.
        • HMAC, SHA256, RSA
      • typ은 토큰 유형을 결정한다.
      {
        "alg": "HS256",
        "typ": "JWT"
      }
      
    • 1.2.2 Paylod
      • Base64URL 방식으로 인코딩 되어있다.
      • 하나의 클레임(Claim)은 이름-값(name-value)를 한 쌍으로 구성된다.

      • 1.2.2.1 Claim
        • Registed Claims(등록된 클레임) : 미리 정의된 클레임(Claim)
          • sub(subject) : 제목
          • iss(issuer) : 발급자
          • aud(audience) : 대상자
          • exp(expiration) : 만료 시간
          • nbf(not before) : 활성화 날짜
          • iat(issued at) : 발급 시간
          • jti(jwt id) : 고유 식별자
        • Public Claims(공개 클레임) : 사용자가 정의할 수 있는 공개용 클레임(Claim)
        • Private Claims(비공개 클레임) : 사용자의 특정할 수 있는 정보를 담은 클레임(Claim)
      {
        "exp": "1535300000000", //Registed Claim
        "woon7650.github.io": true, //Public Claim
        "name": "woon7650" //Prvate Claim
      }
      
    • 1.2.3 Signature
      • Header와 Payload의 데이터 무결성 및 변조 방지를 위한 서명 정보.
      • 서버에서 Signature를 비교해서 위조된 토큰인지 아닌지 여부를 판단할 수 있다.
      HMACSHA256(
          Base64Url(Header) + "." +
          Base64Url(PayLoad),
          server's key
      )
      


  • 1.3 Example

    • https://jwt.io/ 에서 실제 JWT(Json Web Token)의 인코딩(Encoding), 디코딩(Decoding) 할 수 있다.

image info



2. Access Token, Refresh Token

  • 2.1 신뢰성(Realiablity)

    • 사용자 JWT : A(Header) + B(Payloaod) + C(Signature)
    • Payload가 변경됬을 때
      • 변경된 JWT : A + B’ + C
      • 서버에서 검증 후 JWT : A + B’ + C’
      • 서명(Signature) 불일치 -> 유저의 정보가 임의로 변경됨을 알 수 있다.
  • 2.2 주의사항(Caution)

    • JWT는 Base64로 암호화하기 때문에 복호화도 가능하다.
    • Payload 부분이 노출될 수 있기 때문에 중요한 정보는 삼가해야 한다.
    • 토큰 인증의 목적은 정보 보호가 아닌 위조 방지이다.
  • 2.3 해결책(Solution)

    • 현업에서는 토큰 탈취의 위험성이 있기 때문에 Access Token, Refresh Token으로 이중으로 나누어 인증한다.
    • Access Token(접근용 토큰), Refresh Token(재발급용 토큰)으로 나뉜다.

    • 2.3.1 Access Token
      • 클라이언트가 갖고 있는 유의 정보가 담긴 토큰이다.
      • 서버에서 해당 토큰에 있는 정보를 바탕으로 응답한다.
    • 2.3.2 Refresh Token
      • 새로운 Access Token을 발급해주기 위한 토큰이다.
      • DB에 유저 정보와 같이 기록한다.



Refernce

  • https://jwt.io/introduction
  • https://velog.io/@chuu1019/%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-JWTJson-Web-Token
  • https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-JWTjson-web-token-%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC#jwt_json_web_token_%EC%9D%B4%EB%9E%80
  • https://datatracker.ietf.org/doc/html/rfc7519#section-4.1