การรับรองความถูกต้องตามโทเค็นคืออะไร?


514

ฉันต้องการเข้าใจว่าการรับรองความถูกต้องโดยใช้โทเค็นหมายถึงอะไร ฉันค้นหาอินเทอร์เน็ต แต่ไม่พบสิ่งที่เข้าใจได้


17
ฉันได้อ่านคำอธิบายมากมาย แต่พวกเขาทั้งหมดดูเบาในรายละเอียดที่เป็นรูปธรรม บทความนี้ในที่สุดก็ช่วยฉัน: scotch.io/tutorials/the-anatomy-of-a-json-web-token
Chris Conover

คำตอบ:


543

ฉันคิดว่ามันอธิบายได้ดีที่นี่ - อ้างอิงเพียงประโยคสำคัญของบทความยาว:

แนวคิดทั่วไปที่อยู่เบื้องหลังระบบการตรวจสอบความถูกต้องด้วยโทเค็นนั้นง่าย อนุญาตให้ผู้ใช้ป้อนชื่อผู้ใช้และรหัสผ่านของพวกเขาเพื่อรับโทเค็นที่ช่วยให้พวกเขาดึงทรัพยากรที่เฉพาะเจาะจง - โดยไม่ต้องใช้ชื่อผู้ใช้และรหัสผ่านของพวกเขา เมื่อได้รับโทเค็นแล้วผู้ใช้สามารถเสนอโทเค็นซึ่งให้การเข้าถึงทรัพยากรที่เจาะจงสำหรับช่วงเวลา - ไปยังไซต์ระยะไกล

กล่าวอีกนัยหนึ่ง: เพิ่มการอ้อมหนึ่งระดับสำหรับการรับรองความถูกต้อง - แทนที่จะต้องรับรองความถูกต้องด้วยชื่อผู้ใช้และรหัสผ่านสำหรับทรัพยากรที่ได้รับการป้องกันแต่ละครั้งผู้ใช้จะตรวจสอบสิทธิ์ด้วยวิธีนั้นหนึ่งครั้ง และใช้โทเค็นนั้นสำหรับการตรวจสอบเพิ่มเติมระหว่างเซสชัน

ข้อดีมีมากมาย - เช่นผู้ใช้สามารถส่งโทเค็นได้เมื่อพวกเขาได้รับมันไปยังระบบอัตโนมัติอื่น ๆ ที่พวกเขาเต็มใจที่จะไว้วางใจในเวลา จำกัด และทรัพยากรที่ จำกัด แต่จะไม่เต็มใจ เพื่อไว้วางใจกับชื่อผู้ใช้และรหัสผ่านของพวกเขา (เช่นกับทรัพยากรที่พวกเขาได้รับอนุญาตให้เข้าถึงตลอดไปหรืออย่างน้อยก็จนกว่าพวกเขาจะเปลี่ยนรหัสผ่าน)

หากมีสิ่งใดที่ยังไม่ชัดเจนโปรดแก้ไขคำถามของคุณเพื่อชี้แจงว่าอะไรไม่ชัดเจน 100% สำหรับคุณและฉันมั่นใจว่าเราสามารถช่วยคุณได้


6
ฉันคิดถูกหรือไม่ว่าในเว็บแอปพลิเคชั่นคุกกี้หนึ่งอัน (หรือมากกว่า) จากเว็บไซต์ระยะไกลจะทำหน้าที่ของโทเค็นหรือไม่
AJP

29
ขณะที่โทเค็นถูกจัดเก็บเป็นคุกกี้มีอะไรบ้างที่จะหยุดบุคคลที่ขโมยคุกกี้ / โทเค็นนั้นและใช้งานเองหลอกให้เซิร์ฟเวอร์คิดว่าพวกเขาเป็นผู้ใช้ที่ได้รับอนุญาตหรือไม่ เห็นได้ชัดว่าพวกเขาสามารถใช้งานได้เป็นระยะเวลา x เท่านั้น แต่ในช่วงเวลานั้นพวกเขาสามารถทำความเสียหายทั้งหมดที่พวกเขาต้องการได้
BenM

40
สิ่งนี้แตกต่างจาก SessionAuthentication ซึ่งผู้ใช้สามารถรับ session_id โดยการป้อนชื่อผู้ใช้และรหัสผ่านของเขาแล้วใช้ session_id นี้ในคำขอที่ตามมา?
Saurabh Verma

4
หากโทเค็นหมดอายุผู้ใช้จะต้องเข้าสู่ระบบอีกครั้งเพื่อรับโทเค็นใหม่หรือไม่
Anthony ถึง

12
@SaurabhVerma มันแตกต่างจากเซสชันเพราะคุณไม่จำเป็นต้องเก็บข้อมูลไว้ในคุกกี้ เป็นสิ่งที่ยอดเยี่ยมสำหรับอุปกรณ์มือถือซึ่งบางข้อมีข้อ จำกัด ในการใช้คุกกี้
Kebman

182

จากAuth0.com

การรับรองความถูกต้องตามโทเค็นอาศัยโทเค็นที่ลงชื่อซึ่งถูกส่งไปยังเซิร์ฟเวอร์ในแต่ละคำขอ

ประโยชน์ของการใช้วิธีที่ใช้โทเค็นคืออะไร

  • ข้ามโดเมน / CORS:คุกกี้ + CORS เล่นได้ไม่ดีในโดเมนที่ต่างกัน วิธีการที่ใช้โทเค็นช่วยให้คุณทำการโทร AJAX ไปยังเซิร์ฟเวอร์ใด ๆ บนโดเมนใด ๆ เนื่องจากคุณใช้ส่วนหัว HTTP เพื่อส่งข้อมูลผู้ใช้

  • ไร้สัญชาติ (ความยืดหยุ่นด้านเซิร์ฟเวอร์หรือ aka):ไม่จำเป็นต้องเก็บเซสชันไว้โทเค็นเป็นเอนทิตีที่มีอยู่ในตัวเองที่สื่อถึงข้อมูลผู้ใช้ทั้งหมด ส่วนที่เหลือของรัฐอาศัยอยู่ในคุกกี้หรือที่เก็บข้อมูลในตัวเครื่องบนฝั่งไคลเอ็นต์

  • CDN:คุณสามารถให้บริการสินทรัพย์ทั้งหมดของแอปของคุณจาก CDN (เช่น javascript, HTML, รูปภาพ, ฯลฯ ) และฝั่งเซิร์ฟเวอร์ของคุณเป็นเพียง API

  • Decoupling:คุณไม่ได้เชื่อมโยงกับรูปแบบการตรวจสอบสิทธิ์ใด ๆ โทเค็นอาจถูกสร้างขึ้นได้ทุกที่ดังนั้น API ของคุณจึงสามารถเรียกได้จากทุกที่ด้วยวิธีเดียวในการตรวจสอบสิทธิ์การโทรเหล่านั้น

  • พร้อมสำหรับมือถือ:เมื่อคุณเริ่มทำงานบนแพลตฟอร์มเนทีฟ (iOS, Android, Windows 8, ฯลฯ ) คุกกี้ไม่เหมาะเมื่อใช้วิธีที่ใช้โทเค็นทำให้สิ่งนี้ง่ายขึ้นมาก

  • CSRF:เนื่องจากคุณไม่ได้พึ่งพาคุกกี้คุณจึงไม่จำเป็นต้องป้องกันคำขอข้ามไซต์ (เช่นไม่สามารถทำเว็บไซต์ของคุณสร้างคำขอ POST และใช้คุกกี้การตรวจสอบสิทธิ์ที่มีอยู่แล้วซ้ำอีกครั้งเพราะจะไม่มี )

  • ประสิทธิภาพ:เราไม่ได้นำเสนอเกณฑ์มาตรฐานฮาร์ดไดรฟ์ใด ๆ ที่นี่ แต่เครือข่ายไปกลับ (เช่นการค้นหาเซสชั่นในฐานข้อมูล) น่าจะใช้เวลามากกว่าการคำนวณ HMACSHA256 เพื่อตรวจสอบโทเค็นและวิเคราะห์เนื้อหา


6
@ Asik คะแนนทั้งหมดที่นี่มีผลบังคับใช้ยกเว้น "ไร้สัญชาติ" เมื่อคุณเริ่มจัดการกับการเพิกถอนโทเค็น, บัญชีดำ, ตอบกลับการป้องกันการโจมตี ฯลฯ
svlada

ไซต์ที่อ้างถึงแนะนำบทความใหม่ในหัวข้อเดียวกัน: auth0.com/blog/cookies-vs-tokens-definitive-guide
ASalazar

2
คุณอาจต้องการที่จะอ่าน "หยุดใช้ JWT สำหรับการประชุม": cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions
ไรย์ Martinka

1
Asik, ความถูกต้องของโทเค็นและจะหมดอายุเมื่อไหร่? ถ้าคุณเพิ่มข้อมูลเหล่านั้นมันจะดี
Arun Prakash

2
ลิงก์เสียแล้ว
มุมมองวงรี

95

A tokenคือชิ้นส่วนของข้อมูลที่Server Xอาจสร้างได้และมีข้อมูลเพียงพอที่จะระบุผู้ใช้เฉพาะ

คุณอาจจะนำเสนอข้อมูลการเข้าสู่ระบบของคุณและถามServer Xหาtoken; จากนั้นคุณอาจนำเสนอtokenและขอServer Xให้ดำเนินการเฉพาะสำหรับผู้ใช้

Tokens ถูกสร้างขึ้นโดยใช้การผสมผสานของเทคนิคต่าง ๆ จากการเข้ารหัสเช่นเดียวกับการป้อนข้อมูลจากทุ่งกว้างของการวิจัยความปลอดภัย หากคุณตัดสินใจที่จะไปและสร้างtokenระบบของคุณเองคุณจะต้องฉลาดจริง ๆ


4
โดยทั่วไปหากคุณต้องการการรับรองความถูกต้องด้วยโทเค็นคุณควรเริ่มต้นด้วย OAuth
Bob Aman

6
OAuth สามารถทำงานได้อย่างแน่นอนในแอปพลิเคชันบนเว็บ แต่ตัวอย่างเช่นเซสชันการลงชื่อเข้าใช้ระบบปฏิบัติการใช้ระบบโทเค็นเช่นเดียวกับโปรแกรมซอฟต์แวร์อื่น ๆ อีกมากมายดังนั้นความคิดนี้ไม่ได้ จำกัด อยู่ที่เว็บ
yfeldblum

1
โทเค็นอาจเป็นที่นิยมสำหรับระบบการสนับสนุนลูกค้าที่ไม่ใช่แบบสาธารณะ บริษัท ควบคุมชื่อผู้ใช้ / รหัสผ่านและปัญหา & ควบคุมโทเค็น
KevinManx

chrs - แต่ระบบนี้แตกต่างจากระบบที่ใช้เซสชันอย่างไร
BKSpurgeon

@BKSpurgeon - โทเค็นเป็นวิธีทั่วไปในการใช้เซสชันที่มีการรับรองความถูกต้อง
yfeldblum

40

โทเค็นคือชิ้นส่วนของข้อมูลที่สร้างโดยเซิร์ฟเวอร์และมีข้อมูลเพื่อระบุความถูกต้องของผู้ใช้และโทเค็น โทเค็นจะมีข้อมูลของผู้ใช้รวมถึงรหัสโทเค็นพิเศษที่ผู้ใช้สามารถส่งไปยังเซิร์ฟเวอร์ได้ทุกวิธีที่รองรับการตรวจสอบสิทธิ์แทนที่จะส่งชื่อผู้ใช้และรหัสผ่านโดยตรง

การพิสูจน์ตัวตนแบบใช้โทเค็นเป็นเทคนิคความปลอดภัยที่รับรองความถูกต้องของผู้ใช้ที่พยายามเข้าสู่ระบบเซิร์ฟเวอร์เครือข่ายหรือระบบความปลอดภัยอื่น ๆ โดยใช้โทเค็นความปลอดภัยที่จัดหาโดยเซิร์ฟเวอร์

การพิสูจน์ตัวตนสำเร็จถ้าผู้ใช้สามารถพิสูจน์ไปยังเซิร์ฟเวอร์ที่เขาหรือเธอเป็นผู้ใช้ที่ถูกต้องโดยผ่านโทเค็นความปลอดภัย บริการตรวจสอบโทเค็นความปลอดภัยและประมวลผลคำขอของผู้ใช้

หลังจากที่โทเค็นได้รับการตรวจสอบความถูกต้องโดยบริการจะถูกใช้เพื่อสร้างบริบทความปลอดภัยสำหรับลูกค้าดังนั้นบริการสามารถตัดสินใจอนุญาตหรือกิจกรรมตรวจสอบสำหรับคำขอของผู้ใช้ที่ต่อเนื่อง

เยี่ยมชมแหล่งที่มา


22

ตามโทเค็น (ความปลอดภัย / การรับรองความถูกต้อง)

หมายความว่าเพื่อให้เราพิสูจน์ได้ว่าเราเข้าถึงก่อนอื่นเราต้องได้รับโทเค็น ในสถานการณ์ชีวิตจริงโทเค็นอาจเป็นการ์ดเข้าถึงอาคารมันอาจเป็นกุญแจสำคัญในการล็อคบ้านของคุณ เพื่อให้คุณได้รับคีย์การ์ดสำหรับสำนักงานหรือกุญแจไปที่บ้านของคุณคุณต้องพิสูจน์ว่าคุณคือใครและในความเป็นจริงคุณสามารถเข้าถึงโทเค็นนั้นได้ อาจเป็นเรื่องง่ายเหมือนการแสดง ID ของคุณใครบางคนหรือให้รหัสลับแก่พวกเขา ลองจินตนาการว่าฉันต้องเข้าถึงสำนักงานของฉัน ฉันลงไปที่สำนักงานรักษาความปลอดภัยฉันแสดง ID ของพวกเขาและพวกเขามอบโทเค็นนี้ให้ฉันซึ่งทำให้ฉันเข้าไปในอาคาร ตอนนี้ฉันสามารถเข้าถึงสิ่งที่ฉันต้องการภายในอาคารได้ไม่ จำกัด ตราบเท่าที่ฉันมีโทเค็นของฉัน

ประโยชน์ของการรักษาความปลอดภัยด้วยโทเค็นคืออะไร

หากเรานึกย้อนกลับไปใน API ที่ไม่ปลอดภัยสิ่งที่เราต้องทำในกรณีนี้คือเราต้องให้รหัสผ่านสำหรับทุกสิ่งที่เราต้องการจะทำ

จินตนาการทุกครั้งที่เราเข้าประตูในสำนักงานของเราเราต้องให้ทุกคนนั่งถัดจากประตูรหัสผ่านของเรา ตอนนี้จะไม่ดีสวยเพราะนั่นหมายความว่าทุกคนในสำนักงานของเราสามารถใช้รหัสผ่านของเราและปลอมตัวเราและที่ไม่ดี สิ่งที่เราทำคือการดึงโทเค็นแน่นอนพร้อมด้วยรหัสผ่าน แต่เราเรียกคืนจากบุคคลหนึ่ง จากนั้นเราสามารถใช้โทเค็นนี้ทุกที่ที่เราต้องการภายในอาคาร แน่นอนถ้าเราสูญเสียโทเค็นเรามีปัญหาเช่นเดียวกับคนอื่นรู้รหัสผ่านของเรา แต่นั่นทำให้เราเป็นอย่างที่เรามั่นใจได้ว่าถ้าเราสูญเสียโทเค็นเราสามารถยกเลิกการเข้าถึงและโทเค็นอาจ ไม่ควรอยู่นานเกิน 24 ชั่วโมงดังนั้นในวันถัดไปที่เรามาที่สำนักงานเราต้องแสดง ID ของเราอีกครั้ง แต่ยังมีเพียงคนเดียวที่เราแสดง ID ให้


15

คำถามนั้นเก่าและเทคโนโลยีก้าวหน้าไปแล้วนี่คือสถานะปัจจุบัน:

JSON Web Token (JWT) เป็นมาตรฐานแบบเปิดที่ใช้ JSON (RFC 7519) สำหรับการส่งผ่านการอ้างสิทธิ์ระหว่างฝ่ายต่างๆในสภาพแวดล้อมของเว็บแอปพลิเคชัน โทเค็นได้รับการออกแบบให้มีขนาดกะทัดรัดปลอดภัยต่อ URL และใช้งานได้โดยเฉพาะอย่างยิ่งในบริบทการลงชื่อเข้าใช้ครั้งเดียว (SSO) ของเว็บเบราว์เซอร์

https://en.wikipedia.org/wiki/JSON_Web_Token


1
ฉันไม่คิดว่า JWT แสดงถึงสถานะปัจจุบันของเทคโนโลยีสำหรับการใช้การรับรองความถูกต้องตามโทเค็น มันเป็นเพียงวิธีหนึ่งในการนำมันมาใช้และมีข้อบกพร่องมากมายที่ถูกกล่าวถึงในบทความเช่นcryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions
Sung Cho

3

มันเป็นแค่แฮชที่เชื่อมโยงกับผู้ใช้ในฐานข้อมูลหรือวิธีอื่น โทเค็นนั้นสามารถใช้เพื่อรับรองความถูกต้องแล้วให้สิทธิ์ผู้ใช้ในการเข้าถึงเนื้อหาที่เกี่ยวข้องของแอปพลิเคชัน เพื่อดึงโทเค็นนี้ในการเข้าสู่ระบบฝั่งไคลเอ็นต์จำเป็นต้องมี หลังจากเข้าสู่ระบบครั้งแรกคุณต้องบันทึกโทเค็นที่ดึงข้อมูลไม่ใช่ข้อมูลอื่น ๆ เช่นเซสชัน, รหัสเซสชันเพราะที่นี่ทุกอย่างเป็นโทเค็นเพื่อเข้าถึงทรัพยากรอื่น ๆ ของแอปพลิเคชัน

Token ใช้เพื่อรับรองความถูกต้องของผู้ใช้


3

วิธีที่ต้องการมากที่สุดในปัจจุบันเพื่อรักษาความปลอดภัยทรัพยากร Web API คือการตรวจสอบผู้ใช้ในเซิร์ฟเวอร์ Web API โดยใช้โทเค็นที่ลงชื่อ (ซึ่งมีข้อมูลเพียงพอที่จะระบุผู้ใช้เฉพาะ) ซึ่งต้องส่งไปยังเซิร์ฟเวอร์โดยไคลเอนต์ ทุกคำขอ สิ่งนี้เรียกว่าการรับรองความถูกต้องโดยใช้ Token

การรับรองความถูกต้องโดยใช้โทเค็นทำงานดังนี้:

ผู้ใช้ป้อนชื่อและรหัสผ่านลงในไคลเอนต์ (ไคลเอนต์หมายถึงเบราว์เซอร์หรืออุปกรณ์มือถือ ฯลฯ )

จากนั้นไคลเอ็นต์จะส่งข้อมูลประจำตัวเหล่านี้ (เช่นชื่อผู้ใช้และรหัสผ่าน) ไปยังเซิร์ฟเวอร์การอนุญาต

จากนั้นเซิร์ฟเวอร์การอนุญาตจะตรวจสอบความถูกต้องของข้อมูลประจำตัวลูกค้า (เช่นชื่อผู้ใช้และรหัสผ่าน) จากนั้นจะสร้างและส่งคืนโทเค็นการเข้าถึง โทเค็นการเข้าถึงนี้มีข้อมูลเพียงพอที่จะระบุผู้ใช้และยังมีเวลาโทเค็นหมดอายุ

แอปพลิเคชันไคลเอนต์จะรวมโทเค็นการเข้าถึงในส่วนหัวการอนุญาตของคำขอ HTTP เพื่อเข้าถึงทรัพยากรที่ถูก จำกัด จากเซิร์ฟเวอร์ทรัพยากรจนกว่าโทเค็นจะหมดอายุ

บทความต่อไปนี้แสดงวิธีใช้การรับรองความถูกต้องโดยใช้ Token ใน WEB API ทีละขั้นตอน

https://dotnettutorials.net/lesson/token-based-authentication-web-api/


-2

เมื่อคุณลงทะเบียนสำหรับเว็บไซต์ใหม่บ่อยครั้งคุณจะได้รับอีเมลเพื่อเปิดใช้งานบัญชีของคุณ โดยทั่วไปแล้วอีเมลนั้นจะมีลิงค์สำหรับคลิก ส่วนหนึ่งของลิงค์นั้นมีโทเค็นเซิร์ฟเวอร์รู้เกี่ยวกับโทเค็นนี้และสามารถเชื่อมโยงกับบัญชีของคุณ โทเค็นมักจะมีวันหมดอายุที่เกี่ยวข้องดังนั้นคุณอาจมีเวลาเพียงหนึ่งชั่วโมงในการคลิกที่ลิงก์และเปิดใช้งานบัญชีของคุณ สิ่งนี้จะไม่เกิดขึ้นกับคุกกี้หรือตัวแปรเซสชันเนื่องจากไม่ทราบว่าอุปกรณ์หรือเบราว์เซอร์ใดที่ลูกค้าใช้เพื่อตรวจสอบอีเมล


11
โทเค็น / ลิงก์ครั้งเดียวเป็นแนวคิดที่แตกต่างจากการตรวจสอบความถูกต้องด้วยโทเค็น
Emile Bergeron

ชื่อของสิ่งที่คุณพูดก็เป็นโทเค็นเช่นกัน แต่นั่นไม่ใช่คำถาม
sajjad Yosefi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.