(เกิดจากหัวข้อนี้ตั้งแต่นี้เป็นจริงคำถามที่เฉพาะเจาะจงของตัวเองและไม่ให้ NodeJS ฯลฯ )
ฉันกำลังใช้เซิร์ฟเวอร์ REST API ด้วยการพิสูจน์ตัวตนและฉันได้ใช้การจัดการโทเค็น JWT สำเร็จแล้วเพื่อให้ผู้ใช้สามารถเข้าสู่ระบบผ่านปลายทาง / login ด้วยชื่อผู้ใช้ / รหัสผ่านซึ่งโทเค็น JWT ถูกสร้างขึ้นจากความลับของเซิร์ฟเวอร์และส่งกลับไปที่ ลูกค้า. จากนั้นโทเค็นจะถูกส่งผ่านจากไคลเอนต์ไปยังเซิร์ฟเวอร์ในแต่ละคำขอ API ที่พิสูจน์ตัวตนซึ่งใช้ความลับของเซิร์ฟเวอร์เพื่อตรวจสอบโทเค็น
อย่างไรก็ตามฉันพยายามทำความเข้าใจแนวทางปฏิบัติที่ดีที่สุดว่าควรตรวจสอบโทเค็นอย่างไรและเพียงใดเพื่อสร้างระบบที่ปลอดภัยอย่างแท้จริง สิ่งที่ควรเกี่ยวข้องในการ "ตรวจสอบ" โทเค็นหรือไม่ เพียงพอหรือไม่ที่สามารถตรวจสอบลายเซ็นโดยใช้ความลับของเซิร์ฟเวอร์ได้หรือฉันควรตรวจสอบโทเค็นและ / หรือเพย์โหลดโทเค็นกับข้อมูลบางอย่างที่เก็บไว้ในเซิร์ฟเวอร์
ระบบตรวจสอบความถูกต้องโดยใช้โทเค็นจะปลอดภัยพอ ๆ กับการส่งชื่อผู้ใช้ / รหัสผ่านในแต่ละคำขอโดยมีเงื่อนไขว่าจะได้รับโทเค็นเท่ากันหรือยากกว่าการได้รับรหัสผ่านของผู้ใช้ อย่างไรก็ตามในตัวอย่างที่ฉันเห็นข้อมูลเดียวที่จำเป็นในการสร้างโทเค็นคือชื่อผู้ใช้และความลับฝั่งเซิร์ฟเวอร์ นี่ไม่ได้หมายความว่าสมมติว่าผู้ใช้ที่เป็นอันตรายได้รับความรู้เกี่ยวกับความลับของเซิร์ฟเวอร์เป็นเวลาหนึ่งนาทีตอนนี้เขาสามารถสร้างโทเค็นในนามของผู้ใช้รายใดก็ได้ดังนั้นการเข้าถึงไม่เพียง แต่ให้กับผู้ใช้ที่ได้รับรายเดียวตามความเป็นจริงถ้ารหัสผ่านคือ ได้รับ แต่ในความเป็นจริงสำหรับบัญชีผู้ใช้ทั้งหมด ?
สิ่งนี้นำฉันไปสู่คำถาม:
1) การตรวจสอบโทเค็น JWT ควร จำกัด เฉพาะการตรวจสอบลายเซ็นของโทเค็นโดยอาศัยความสมบูรณ์ของข้อมูลลับของเซิร์ฟเวอร์เพียงอย่างเดียวหรือมาพร้อมกับกลไกการตรวจสอบที่แยกต่างหาก
ในบางกรณีฉันเคยเห็นการใช้โทเค็นและเซสชันเซิร์ฟเวอร์ร่วมกันซึ่งเมื่อเข้าสู่ระบบสำเร็จผ่านจุดสิ้นสุด / เข้าสู่ระบบจะมีการสร้างเซสชัน คำขอ API ตรวจสอบโทเค็นและเปรียบเทียบข้อมูลถอดรหัสที่พบในโทเค็นกับข้อมูลบางส่วนที่จัดเก็บในเซสชัน อย่างไรก็ตามการใช้เซสชันหมายถึงการใช้คุกกี้และในบางแง่ก็เป็นการเอาชนะวัตถุประสงค์ของการใช้โทเค็นตามวิธีการ นอกจากนี้ยังอาจทำให้เกิดปัญหากับลูกค้าบางราย
อาจจินตนาการได้ว่าเซิร์ฟเวอร์เก็บโทเค็นทั้งหมดที่ใช้อยู่ใน memcache หรือคล้ายกันเพื่อให้แน่ใจว่าแม้ว่าความลับของเซิร์ฟเวอร์จะถูกบุกรุกเพื่อให้ผู้โจมตีสามารถสร้างโทเค็นที่ "ถูกต้อง" ได้เฉพาะโทเค็นที่ถูกสร้างขึ้นผ่านปลายทาง / login เท่านั้น จะได้รับการยอมรับ สิ่งนี้สมเหตุสมผลหรือแค่ซ้ำซ้อน / มากเกินไป?
2) หากการตรวจสอบลายเซ็น JWT เป็นวิธีเดียวในการตรวจสอบโทเค็นซึ่งหมายความว่าความสมบูรณ์ของความลับของเซิร์ฟเวอร์คือจุดแตกหักความลับของเซิร์ฟเวอร์ควรได้รับการจัดการอย่างไร? อ่านจากตัวแปรสภาพแวดล้อมและสร้าง (สุ่ม?) หนึ่งครั้งต่อสแต็กที่ปรับใช้? สร้างใหม่หรือหมุนเวียนเป็นระยะ ๆ (และหากเป็นเช่นนั้นวิธีจัดการโทเค็นที่ถูกต้องที่มีอยู่ซึ่งสร้างขึ้นก่อนการหมุนเวียน แต่จำเป็นต้องได้รับการตรวจสอบความถูกต้องหลังจากการหมุนอาจเพียงพอหากเซิร์ฟเวอร์ยึดข้อมูลปัจจุบันและความลับก่อนหน้าในช่วงเวลาใดเวลาหนึ่ง) เหรอ? อื่น ๆ อีก?
บางทีฉันอาจจะแค่หวาดระแวงมากเกินไปเมื่อต้องเสี่ยงต่อความลับของเซิร์ฟเวอร์ที่ถูกบุกรุกซึ่งแน่นอนว่าเป็นปัญหาทั่วไปที่ต้องได้รับการแก้ไขในสถานการณ์การเข้ารหัสทั้งหมด ...
RSAPrivateKey privateKey
??