JWT(JSON 웹 토큰) 인증은 어떻게 작동합니까?

JWT(JSON 웹 토큰)란 무엇인가요?



JWT(JSON Web Token)는 당사자 간에 정보를 JSON 개체로 안전하게 전송하기 위한 개방형 표준(RFC 7519)입니다.

IdP(Identity Provider)의 개인 키/또는 공개 키 쌍을 사용하여 작고 읽을 수 있으며 디지털 서명됩니다. 따라서 토큰의 무결성과 신뢰성은 관련된 다른 당사자가 확인할 수 있습니다.

JWT를 사용하는 목적은 데이터를 숨기는 것이 아니라 데이터의 신뢰성을 보장하는 것입니다. JWT는 암호화되지 않고 서명되고 인코딩됩니다.

JWT는 토큰 기반 상태 비저장 인증 메커니즘입니다. 클라이언트 측 기반 무상태 세션이므로 서버는 세션 정보를 저장하기 위해 데이터 저장소(데이터베이스)에 전적으로 의존할 필요가 없습니다.

JWT의 구조



JSON 웹 토큰은 마침표로 구분된 세 부분으로 구성됩니다.

header.payload.signature




헤더



JWT 헤더는 서명 및 인코딩에 사용되는 토큰 유형과 알고리즘으로 구성됩니다. 알고리즘은 HMAC, SHA256, RSA, HS256 또는 RS256일 수 있습니다.

{ 
  "typ": "JWT",    
  "alg": "HS256"
}


유효 탑재량



페이로드는 클레임이라는 세션 데이터로 구성됩니다. 다음은 우리가 사용할 수 있는 표준 클레임 중 일부입니다.
  • 발급자(iss)
  • 제목(하위)
  • 청중(AUD)
  • 만료 시간(만료)
  • (iat)에서 발급

  • {
    "sub": "user10001",
    "iat": 1569302116
    }
    


    사용자 지정 클레임도 클레임 집합에 포함될 수 있습니다. 사용자 정의 클레임 세트를 사용하는 경우
  • 클레임 집합에 큰 데이터를 넣지 마십시오. 클레임 세트는 간결함을 의미합니다.

  • JWT는 쉽게 디코딩될 수 있으므로 민감한 정보를 입력하지 마십시오.

  • {
    "sub": "user10001",
    "iat": 1569302116,
    "role": "admin",
    "user_id": "user10001"
    }
    


    서명



    서명은 JSON 웹 토큰(JWT)에서 가장 중요한 부분입니다. 서명은 Base64url 인코딩을 사용하여 헤더와 페이로드를 인코딩하고 마침표 구분 기호로 연결하여 계산됩니다. 그런 다음 암호화 알고리즘에 제공됩니다.

    // signature algorithm
    data = base64urlEncode( header ) + "." + base64urlEncode( payload )
    signature = HMAC-SHA256( data, secret_salt )
    


    따라서 헤더나 페이로드가 변경되면 서명을 다시 계산해야 합니다. IdP(Identity Provider)만이 토큰의 변조를 방지하는 서명을 계산할 수 있는 개인 키를 가지고 있습니다.

    어떻게 작동하나요?



    기본적으로 ID 공급자(IdP)는 사용자 ID를 인증하는 JWT를 생성하고 리소스 서버는 비밀 솔트/공개 키를 사용하여 토큰의 진위를 해독하고 확인합니다.


  • 사용자 이름과 비밀번호 또는 google/facebook을 사용하여 사용자 로그인합니다.
  • 인증 서버는 자격 증명을 확인하고 비밀 솔트 또는 개인 키를 사용하여 서명된 jwt를 발급합니다.
  • 사용자의 클라이언트는 JWT를 사용하여 HTTP 인증 헤더에 JWT를 전달하여 보호된 리소스에 액세스합니다.
  • 그런 다음 리소스 서버는 비밀 솔트/공개 키를 사용하여 토큰의 진위를 확인합니다.

  • 보안



    다른 인증 메커니즘과 마찬가지로 JWT에도 장단점이 있습니다.
  • 승인 헤더를 보호하려면 HTTPS를 사용해야 합니다.

  • 알고리즘 이름을 명시적으로 검증합니다. JWT 헤더에 언급된 알고리즘에 전적으로 의존하지 마십시오. 알고 없음 공격(algo none attack), 헤더 스트리핑(header stripping)과 같은 헤더 기반 공격이 몇 가지 있습니다.

  • 백엔드 서버에서 사용자 세션을 취소하는 것은 어렵습니다. JWT는 자동으로 만료되도록 설정되어 있으므로 만료되기 전에 공격자가 토큰을 얻으면 다양한 익스플로잇으로 이어집니다. 토큰을 무효화하기 위해 서버에 토큰 해지 목록을 작성하는 것이 완화하는 가장 좋은 방법일 수 있습니다.
  • JWT가 쿠키에 유지되는 경우 HttpOnly 쿠키를 생성해야 합니다. 이렇게 하면 타사 자바스크립트가 쿠키에서 jwt 토큰을 읽지 못하도록 제한됩니다.

  • XSS - 백엔드 서버는 항상 사용자 생성 데이터를 삭제해야 합니다.

  • CSRF - JWT가 쿠키에 지속되면 CSRF 공격이 가능합니다. 요청 원본 및 특별 요청 헤더를 사용하여 CSRF를 완화할 수 있습니다.

  • If you like this article, subscribe to the newsletter and Connect with me on to get updates on my future articles. ✅

    좋은 웹페이지 즐겨찾기