개발자 도구 · JWT 디코더
JWT exp, iat 및 nbf: NumericDate는 밀리초가 아니라 초입니다.
· 작동 방식
jwt 타임스탬프 디버깅
JavaScript는 밀리초를 제공하고 JWT은 초를 원하므로 타임스탬프가 1000분의 1만큼 잘못됩니다. 이 게시물에서는 NumericDate와 세 가지 시간 주장을 올바르게 읽는 방법을 설명합니다.
만료되거나 도착하기 전에 만료되지 않는 토큰 — 단위 실수의 두 가지 증상
1000분의 1의 실수는 극적인 증상을 낳습니다. 토큰 생산자가 에포크 초를 기대하는 곳에 JavaScript 밀리초를 제공하면 만료 시간을 수천 년 앞당길 수 있습니다. 초 값을 다시 나누면 1970 근처에 배치되어 새로 발급된 토큰이 첫 번째 합법적인 요청 전에 만료된 것처럼 보이게 할 수 있습니다.
디코더는 ISO 판독값 옆에 숫자 표시를 표시하여 규모를 노출하는 데 도움이 됩니다. 해당 디스플레이는 진단용일 뿐입니다. 공격자는 서명되지 않거나 위조된 페이로드에 `exp`, `iat` 또는 `nbf` 번호를 쓸 수 있으므로 변환된 시계 시간은 다른 곳에서 서명 및 정책 검증 후에만 권한을 갖습니다.
RFC의 NumericDate 7519 — Unix 시대 이후의 초, JSON 숫자, 분수는 허용되지만 거의 사용되지 않음
JWT 시간 주장은 NumericDate 표현을 사용합니다. 즉, Unix epoch에서 초를 계산하는 JSON 숫자입니다. 소수는 날짜를 구성하기 전에 구현 시 값에 1,000를 곱하기 때문에 1초 미만의 위치를 나타낼 수 있습니다. 유효한 유한수를 먼저 정수로 반올림하지 않습니다.
ToolAcre는 `exp`, `nbf`, `iat`, `auth_time` 및 `updated_at`를 표시할 시간 모양 필드로 인식합니다. 처음 3개만이 등록된 청구범위 설명에 포함됩니다. 숫자가 아니거나 무한하거나 유효하지 않은 날짜 결과는 의미 있는 시간으로 렌더링되지 않고 생략되어 "soon"과 같은 문자열이 타임스탬프로 가장되는 것을 방지합니다.
Date.now()는 밀리초입니다 — 먼 미래의 만료를 생성하는 JavaScript 습관
`Date.now()`은 밀리초를 반환하는 반면 NumericDate 값은 초 단위로 표시됩니다. 따라서 브라우저 시계에서 클레임을 파생하는 생산자는 자체 반올림 정책을 적용하기 전에 일반적으로 1,000로 나누는 명시적인 배율 변환이 필요합니다. ToolAcre 읽기 경로는 표시를 위해서만 역곱셈을 수행합니다.
코드 검토 시 단위 변환이 표시되도록 유지합니다. `exp`의 13자리 값은 유용한 경고 신호이지만 자릿수 계산은 확인이 아니며 생산자의 계약을 대체할 수 없습니다. 디코더는 JavaScript Date가 나타낼 수 있는 유한 숫자 주장을 렌더링하려고 시도합니다. 밀리초를 초로 자동 해석하지 않습니다.
exp, nbf 및 iat — 만료, 이전 및 발행 날짜 및 검증자가 각각을 적용하는 방법
`exp`는 검증자가 해당 정책에 따라 더 이상 토큰을 수락해서는 안 되는 시간을 지정합니다. `nbf`은 허용되지 않아야 하는 경계의 이름을 지정합니다. `iat`는 발급 시간을 기록합니다. ToolAcre는 이러한 의미에 레이블을 지정하고 `exp` 및 `nbf`만 제공된 참조 시계와 비교합니다.
반환된 상태는 디코딩된 만료가 지금보다 이전인 경우 `expired`이고, 이전이 지금보다 늦은 경우 `future`이며, 기타 표시된 시간 주장의 경우 `past`입니다. 이러한 라벨은 페이로드 산술에 대한 관찰입니다. 이는 인증 결정이 아니며 발급자, 대상, 키 또는 서명을 평가하지 않습니다.
시계 차이와 여유는 검증자에게 속합니다. 이 디코더는 둘 다 정의하지 않습니다.
개요에서는 클럭 왜곡이 어느 정도 합리적인지 물었지만 JWT 디코더 구성이나 구현에서는 여유를 정의하지 않았습니다. 해당 번호는 검증자와 해당 배포 요구 사항에 속합니다. 여기서 기본값을 고안하면 검사 항목이 문서화되지 않은 보안 정책으로 바뀌므로 이 섹션에서는 의도적으로 아무 것도 제공하지 않습니다.
서비스가 경계 근처의 토큰을 거부하는 경우 신뢰할 수 있는 로그를 사용하여 서비스 시계, 발급자 시계 및 구성된 검증자 정책을 비교합니다. ToolAcre는 허용 기간 없이 브라우저의 현재 날짜에 대한 청구를 해결합니다. 따라서 둘 다 동일한 숫자를 구문 분석하는 경우에도 의도적으로 여유를 적용하는 서버와 결과가 다를 수 있습니다.
작업된 예 — 샘플 exp 값을 사람이 읽을 수 있는 시간으로 변환하고 이를 iat와 비교하여 확인
합성 페이로드에 `iat: 1717243200` 및 `exp: 1717246800`이 포함되어 있다고 가정합니다. 1,000를 곱하면 ISO 순간이 `2024-06-01T12:00:00.000Z` 및 `2024-06-01T13:00:00.000Z`가 됩니다. 원시 초 값을 빼면 브라우저 밀리초를 계산에 혼합하지 않고 1시간 간격이 생성됩니다.
해당 산술은 페이로드가 말하는 내용을 설명합니다. 발급자가 해당 값을 선택했다는 사실이나 1시간이 모든 애플리케이션에 적합하다는 사실은 표시되지 않습니다. ToolAcre는 숫자를 예쁘게 인쇄하고 UTC 행을 생성하며 오늘을 기준으로 만료일을 이전으로 부를 수 있습니다. 검증자는 자체 승인 규칙을 독립적으로 인증하고 시행해야 합니다.
여기서 다루지 않는 내용 — 특정 서버가 토큰을 수락할지 여부는 시계와 여유에 따라 달라집니다. 디코더는 평결이 아닌 값을 보여줍니다.
디코더는 특정 서버가 토큰을 수락할지 여부를 예측할 수 없습니다. 서버는 다른 시계, 구성된 허용 오차, 더 엄격한 클레임 스키마 또는 추가 발급자 및 대상 확인을 사용할 수 있습니다. 서명 실패만으로도 표시된 NumericDates가 완전히 평범해 보이는 토큰을 거부할 수 있습니다.
반대로, 미래에 예상되는 만료로 인해 확인되지 않은 토큰이 유효해지지 않습니다. 시간표를 가능한 단위 오류를 찾아내고 디버깅을 위한 증거를 수집하는 방법으로 취급하십시오. 실제 판정은 서버 로그 또는 예상 키와 정책을 사용한 제어된 검증 테스트에 속하며 디코드 패널에는 속하지 않습니다.
요약: 주장을 읽고 산술을 수행합니다. ToolAcre JWT 디코더는 exp, iat 및 nbf를 표시하므로 단위를 직접 확인할 수 있습니다.
주장을 읽고 의도적으로 규모 산술을 수행합니다. NumericDate 초는 Date 경계에서만 JavaScript 밀리초가 됩니다. ToolAcre는 소스에서 해당 곱셈을 명시적으로 만들고 결과 ISO 값을 표시하는 동시에 작성자의 의도를 추측하는 대신 잘못된 형식의 시간 유형을 무시합니다.
보안 구별을 똑같이 명확하게 유지하십시오. `exp` 디스플레이는 만료 시행이 아니며, `nbf` 디스플레이는 승인 제어가 아니며, `iat`는 발급 증명이 아닙니다. 일회용 토큰을 검사한 후 신뢰할 수 있는 검증자를 사용하여 이를 인증하고 서비스의 실제 시계 및 클레임 정책을 적용합니다.