JWT (Json Web Tokens)

    JWT (Json Web Tokens)

    • 서버에서 인증된 사용자를 식별하기 위해 부여하는 토큰으로 JSON 객체를 이용함
    • 웹 표준(RFC 7519)
    • 토큰 내에 필요한 모든 정보를 자체적으로 지니고 있음.
      • 토큰에 대한 기본정보
      • 전달할 정보
      • 토큰이 검증됐다는 것을 나타내는 signature

     

     

    1) 토큰 인증 과정

    https://velopert.com/2350

     

    1. 클라이언트: 사용자가 아이디와 비밀번호로 로그인을 함

     

    2. 서버: 계정정보를 검증함

    • 계정정보가 정확하면, 사용자에게 signed 토큰을 발급함
    • signed 토큰은 서버에서 정상적으로 발급된 토큰이라는 것을 증명하는 signature를 지니고 있다는 의미

     

    3. 클라이언트: 전달받은 토큰을 저장하고, 서버에 요청을 보낼 때마다 토큰을 함께 서버에 전달

    • 토큰은 HTTP 요청의 헤더에 포함되어서 전달됨

     

    4. 서버: 유효하고 인증된 토큰인지 검증 후, 요청에 응답함

     

     

    2) 토큰 기반의 인증의 장점

    stateless & scalability

    • stateful 서버: 클라이언트에게서 요청을 받을 때마다 클라이언트의 상태를 계속해서 유지하고, 이 정보를 서비스 제공에 이용함. 대표적인 예시로 세션 기반의 서버가 있음.  세션 기반의 서버는 사용자가 로그인을 하면, 세션에 로그인 상태를 서버의 메모리 또는 DB에 저장하고 사용함
    • stateless 서버: 로그인 상태를 저장하지 않고, 클라이언트의 요청만으로 작업을 처리함. 클라이언트와 서버의 연결고리가 없기 때문에 서버의 scalability가 높아짐. 세션 기반 서버의 경우에는 여러 대의 서버를 사용해서 요청을 분산했다면 사용자가 로그인 상태를 유지하고 있는 서버에만 요청을 보내도록 설정해야 함. 하지만 토큰을 사용하면 이런 문제점이 해결이 됨

     

     

    3) JWT 구성

    [헤더]

    • 토큰의 타입과 해싱 알고리즘 지정
      • typ: 토큰의 타입
      • alg: 해싱 알고리즘
    더보기

    {

        "typ": "JWT",

         "alg": "HS256"

    }

     

    [내용]

    • 토큰에 담을 내용이 들어감
    • claim: 정보의 한 덩어리, key-value로 이루어짐

     

    Claim의 종류

    • registered claim
      • 토큰에 대한 정보를 담기 위한 클레임
      • 이미 이름이 등록되어 있음
        • iss: 토큰 발급자
        • sub: 토큰 제목
        • aud: 토큰 대상자
        • exp: 토큰 만료시간
        • nbf: 토큰의 활성 날짜
        • iat: 토큰 발급 시간
        • jti: JWT 고유 식별자, 주로 일회용 토큰에 사용함
    • public claim
      • 공개 클레임
      • 고유한 이름을 가져야 함
      • 보통 클레임 이름을 URI로 지음
    • private claim
      • 서버-클라이언트 통신을 위해 사용되는 클레임
    더보기

    {

        "iss": "songahh@gmail.com", // registered 클레임

        "iat": 1622370878,

        "exp": 1622372678,

        "https://songahh.com/jwt_claims/is_admin": true, // public 클레임

        "hi": "Hello World!" // private 클레임

    }

     

    [서명]

    토큰이 조작되었거나 변경되지 않았음을 확인하는 용도

    헤더의 인코딩 값과 payload의 인코딩 값을 합친 후에 주어진 secret key를 통해 hash값 생성

    댓글