be_better

[Springboot] 서비스의 인증과 권한 부여 - JWT 본문

Springboot/이론

[Springboot] 서비스의 인증과 권한 부여 - JWT

NiceTry 2023. 12. 6. 23:44

목차

    JWT(JSON Web Token)

    JWT 특징

    • 당사자 간의 정보를 JSON 형태안전하게 전송하기 위한 토큰.
    • URL로 이용할 수 있는 문자열로만 구성되어 있으며, 디지털 서명이 적용되어 있어 신뢰 가능.
    • 주로 서버와의 통신에서 권한 인가를 위해 사용.
    • HTTP 구성요소 어디든 위치할 수 있음.

    JWT 구조

    JWT는 헤더(Header), 내용(Payload), 서명(Signature) 을 "."으로 구분하여 구성된다.

     

    헤더

    검증과 관련된 내용

    {
      /*
      해싱 알고리즘 지정,
      SHA256 또는 RSA 사용
      서명 부분에서 사용됨
      "HS256" 은 "HMAC SHA256" 알고리즘 사용을 의미
      */
      "alg": "HS256",
      /*
      토큰의 타입 지정
      */
      "typ": "JWT"
    }

    이렇게 완성된 헤더는 Base64Url 형식으로 인코딩되어 사용된다.

     

    내용

    토큰에 담는 정보 포함.

     

    내용에 담기는 속성들은 클레임(Claim) 이라고 하며

    • 등록된 클레임(Registered Claims)
    • 공개 클레임(Public Claims)
    • 비공개 클레임(Private Claims)

    세 가지로 분류된다.

     

    등록된 클레임(Registered Claims)

    • 필수는 아니지만 이미 이름이 정해져 있는 클레임을 뜻함
    • iss: JWT의 발급자(Issuer) 주체를 나타냄. iss의 값은 문자열이나 URI를 포함하는 대소문자를 구분하는 문자열
    • sub: JWT의 제목(Subject)
    • aud: JWT의 수신인(Audience). JWT를 처리하려는 각 주체는 해당 값으로 자신을 식별해야함. 요청을 처리하는 주체가 'aud' 값으로 자신을 식별하지 않으면 JWT는 거부됨.
    • exp: JWT의 만료기간(Expriation). NumericDate 형식으로 지정
    • nbf: 'Not Before'를 의미
    • iat: JWT가 발급된 시간(issued at)
    • jti: JWT의 식별자(JWT ID). 주로 중복 처리를 방지하기 위해 사용

    공개 클레임(Public Claims)

    키 값을 마음대로 정의.

    충돌이 발생하지 않을 이름으로 설정해야함.

     

    비공개 클레임(Private Claims)

    통신 간에 상호 합의되고 등록된 클레임과 공개된 클레임이 아닌 클레임을 의미

     

    JWT 내용 예시
    {
      "sub": "wikibooks payload",
      "exp": "1602076408",
      "userId": "wikibooks",
      "username": "jnjeaaaat"
    }

    이렇게 완성된 내용은 Base64Url 형식으로 인코딩되어 사용된다.

     

    서명

    <인코딩된 헤더, 인코딩된 내용, 비밀키, 헤더의 알고리즘 속성값> 으로 생성

     

    HMAC SHA256 알고리즘을 사용해서 서명을 생성한다면,

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

    이와 같은 방식으로 생성됨.

     

    -> 메시지가 도중에 변경되지 않았는지 확인할 때 사용

     

    JWT 디버거 사용하기

    https://jwt.io/#debugger-io 

     

    JWT.IO

    JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

    jwt.io

    사이트에서 Header, Payload, Signature 내용 확인 가능