เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ · ตัวถอดรหัส JWT
JWT exp, iat และ nbf: วันที่เป็นตัวเลขคือวินาที ไม่ใช่มิลลิวินาที
· มันทำงานอย่างไร
jwt การประทับเวลา การดีบัก
JavaScript ให้เวลาเป็นมิลลิวินาที และ JWT ต้องการวินาที ดังนั้นการประทับเวลาจึงผิดพลาดไปหนึ่งพัน โพสต์นี้จะอธิบาย NumericDate และวิธีอ่านการอ้างสิทธิ์สามครั้งอย่างถูกต้อง
โทเค็นที่ไม่มีวันหมดอายุหรือหมดอายุก่อนที่จะมาถึง — อาการสองประการของความผิดพลาดของหน่วย
ความผิดพลาดจำนวนหนึ่งในพันทำให้เกิดอาการที่น่าทึ่ง การจัดหา JavaScript มิลลิวินาที โดยที่ผู้ผลิตโทเค็นคาดหวังว่าช่วงเวลาวินาทีจะสามารถผลักดันการหมดอายุออกไปนับพันปีได้ การแบ่งค่าวินาทีอีกครั้งสามารถวางไว้ใกล้ 1970 ซึ่งทำให้โทเค็นที่ออกใหม่ปรากฏหมดอายุก่อนคำขอที่ถูกต้องตามกฎหมายครั้งแรก
ตัวถอดรหัสช่วยเปิดเผยมาตราส่วนโดยการแสดงการอ้างสิทธิ์ที่เป็นตัวเลขข้างการอ่าน ISO จอแสดงผลนั้นใช้สำหรับการวินิจฉัยเท่านั้น ผู้โจมตีสามารถเขียนหมายเลข `exp`, `iat` หรือ `nbf` ใดๆ ลงในเพย์โหลดที่ไม่ได้ลงนามหรือปลอมแปลง ดังนั้นเวลานาฬิกาที่แปลงแล้วจะมีอำนาจเฉพาะหลังจากการตรวจสอบลายเซ็นและนโยบายในที่อื่นเท่านั้น
NumericDate ใน RFC 7519 — วินาทีนับตั้งแต่ยุค Unix เป็นตัวเลข JSON โดยอนุญาตให้ใช้เศษส่วนได้ แต่ไม่ค่อยได้ใช้
การอ้างสิทธิ์เวลา JWT ใช้การแทนค่า NumericDate: ตัวเลข JSON นับวินาทีจากยุค Unix ตัวเลขเศษส่วนสามารถแสดงถึงตำแหน่งรองวินาทีได้เนื่องจากการนำไปใช้จะคูณค่าด้วย 1,000 ก่อนที่จะสร้างวันที่ มันไม่ได้ปัดเศษจำนวนจำกัดที่ถูกต้องให้เป็นจำนวนเต็มก่อน
ToolAcre รู้จัก `exp`, `nbf`, `iat`, `auth_time` และ `updated_at` เป็นช่องรูปเวลาสำหรับการแสดงผล มีเพียงสามรายการแรกเท่านั้นที่อยู่ในคำอธิบายการอ้างสิทธิ์ที่ลงทะเบียน ผลลัพธ์วันที่ที่ไม่ใช่ตัวเลข ไม่มีที่สิ้นสุด หรือไม่ถูกต้องจะถูกละเว้นแทนที่จะแสดงผลเป็นเวลาที่มีความหมาย เพื่อป้องกันไม่ให้สตริง เช่น "เร็วๆ นี้" ปลอมแปลงเป็นการประทับเวลา
Date.now() คือมิลลิวินาที — พฤติกรรม JavaScript ที่ทำให้เกิดการหมดอายุในอนาคตอันไกล
`Date.now()` ส่งคืนมิลลิวินาที ในขณะที่ค่า NumericDate จะแสดงเป็นวินาที ผู้ผลิตที่ได้รับการอ้างสิทธิ์จากนาฬิกาของเบราว์เซอร์จึงจำเป็นต้องมีการแปลงมาตราส่วนที่ชัดเจน โดยทั่วไปจะหารด้วย 1,000 ก่อนที่จะใช้นโยบายการปัดเศษของตนเอง เส้นทางการอ่าน ToolAcre ทำการคูณแบบผกผันสำหรับการแสดงผลเท่านั้น
ทำให้มองเห็นการแปลงหน่วยได้ในการตรวจสอบโค้ด ค่าสิบสามหลักใน `exp` เป็นสัญญาณเตือนที่มีประโยชน์ แต่การนับหลักไม่ใช่การยืนยันและไม่สามารถแทนที่สัญญาของผู้ผลิตได้ ตัวถอดรหัสจะพยายามแสดงการอ้างสิทธิ์ที่เป็นตัวเลขอันจำกัดที่ JavaScript วันที่สามารถเป็นตัวแทนได้ มันไม่ได้ตีความมิลลิวินาทีใหม่เป็นวินาทีอย่างเงียบๆ
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` การลบค่าวินาทีดิบจะทำให้มีช่วงเวลาหนึ่งชั่วโมงโดยไม่ต้องผสมมิลลิวินาทีของเบราว์เซอร์ในการคำนวณ
เลขคณิตนั้นอธิบายสิ่งที่เพย์โหลดพูด ไม่ได้แสดงว่าผู้ออกเลือกค่าเหล่านั้นหรือหนึ่งชั่วโมงนั้นเหมาะสมกับการใช้งานใดๆ ToolAcre พิมพ์ตัวเลขสวย ๆ สร้าง UTC แถวและอาจเรียกวันหมดอายุเก่าสัมพันธ์กับวันนี้ ผู้ตรวจสอบจะต้องตรวจสอบความถูกต้องและบังคับใช้กฎการยอมรับของตนเองอย่างเป็นอิสระ
สิ่งนี้ไม่ครอบคลุม — เซิร์ฟเวอร์เฉพาะจะยอมรับโทเค็นหรือไม่ ซึ่งขึ้นอยู่กับนาฬิกาและระยะเวลาที่ยังเหลืออยู่ ตัวถอดรหัสจะแสดงค่า ไม่ใช่คำตัดสิน
ตัวถอดรหัสไม่สามารถคาดเดาได้ว่าเซิร์ฟเวอร์เฉพาะจะยอมรับโทเค็นหรือไม่ เซิร์ฟเวอร์อาจใช้นาฬิกาที่แตกต่างกัน เกณฑ์ความคลาดเคลื่อนที่กำหนดค่าไว้ โครงสร้างการเรียกร้องที่เข้มงวดยิ่งขึ้น หรือการตรวจสอบผู้ออกและผู้ชมเพิ่มเติม ความล้มเหลวของลายเซ็นเพียงอย่างเดียวสามารถปฏิเสธโทเค็นที่แสดง NumericDates ที่ดูธรรมดาอย่างสมบูรณ์ได้
ในทางกลับกัน การหมดอายุในอนาคตไม่ได้ทำให้โทเค็นที่ไม่ได้รับการตรวจสอบสามารถใช้ได้ ปฏิบัติต่อตารางเวลาเป็นวิธีหนึ่งในการตรวจจับข้อผิดพลาดของหน่วยที่อาจเกิดขึ้นและรวบรวมหลักฐานสำหรับการแก้ไขจุดบกพร่อง คำตัดสินที่แท้จริงอยู่ในบันทึกของเซิร์ฟเวอร์หรือการทดสอบการตรวจสอบที่มีการควบคุมด้วยคีย์และนโยบายที่คาดหวัง ไม่เคยอยู่ในแผงถอดรหัส
ประเด็นสำคัญ: อ่านคำกล่าวอ้าง ทำการคำนวณ — ตัวถอดรหัส ToolAcre JWT แสดง exp, iat และ nbf เพื่อให้คุณสามารถตรวจสอบหน่วยได้ด้วยตัวเอง
อ่านข้อกล่าวอ้างและคำนวณมาตราส่วนอย่างจงใจ: NumericDate วินาทีกลายเป็น JavaScript มิลลิวินาทีที่ขอบเขต Date เท่านั้น ToolAcre ทำให้การคูณนั้นชัดเจนในแหล่งที่มา และแสดงค่า ISO ผลลัพธ์ โดยไม่สนใจประเภทเวลาที่มีรูปแบบไม่ถูกต้อง แทนที่จะคาดเดาว่าผู้เขียนตั้งใจอะไร
รักษาความแตกต่างด้านความปลอดภัยให้ชัดเจนเท่าเทียมกัน จอแสดงผล `exp` ไม่ใช่การบังคับใช้การหมดอายุ จอแสดงผล `nbf` ไม่ใช่การควบคุมการรับเข้า และ `iat` ไม่ใช่หลักฐานการออก หลังจากตรวจสอบโทเค็นที่ใช้แล้วทิ้ง ให้ใช้เครื่องมือตรวจสอบที่เชื่อถือได้เพื่อตรวจสอบสิทธิ์ และใช้นาฬิกาจริงและนโยบายการเรียกร้องสิทธิ์