รับรองความถูกต้องสงบ


745

การรับรองความถูกต้อง RESTful หมายถึงอะไรและทำงานอย่างไร ฉันไม่พบภาพรวมที่ดีใน Google ความเข้าใจเดียวของฉันคือคุณส่งคีย์เซสชั่น (remeberal) ใน URL แต่สิ่งนี้อาจผิดอย่างมาก


3
เมื่อฉันตรวจสอบสิทธิ์ของฉันฉันพบปลั๊กอิน RoR หนึ่งโหล ฉันสมมติว่านั่นไม่ใช่สิ่งที่คุณกำลังมองหา ถ้าไม่ใช่ RoR แล้วภาษาอะไร? เว็บเซิร์ฟเวอร์ใด
S.Lott

2
มันจะไม่ผิดอย่างน่ากลัวถ้าคุณใช้ HTTPS คำขอ HTTP ที่สมบูรณ์พร้อมกับ URL จะถูกเข้ารหัส
Bharat Khatri

4
@BharatKhatri: ใช่มันจะ ฉันจะไม่ส่งต่อข้อมูลที่ละเอียดอ่อนใน URL ที่ผู้ใช้มองเห็นได้ ข้อมูลนี้มีแนวโน้มที่จะรั่วไหลเพื่อวัตถุประสงค์ในทางปฏิบัติ HTTPS ไม่สามารถช่วยในการรั่วไหลโดยไม่ตั้งใจได้
Jo So

2
@jcoffland: คุณหมายถึงอะไรโดยการรับรองความถูกต้องสงบจริง? ฉันสนใจเพราะฉันเพิ่งใช้วิธีที่สามจากคำตอบที่ยอมรับ แต่ฉันไม่พอใจ (ฉันไม่ชอบพารามิเตอร์เพิ่มเติมใน URL)
BlueLettuce16

4
บางคนใช้jwt.io/introductionเพื่อแก้ปัญหานี้ .. ฉันทำวิจัยเกี่ยวกับเรื่องนี้ตอนนี้เพื่อแก้ปัญหากรณีของฉัน: stackoverflow.com/questions/36974163/… >> หวังว่ามันจะทำงานได้ดี
toha

คำตอบ:


586

วิธีจัดการกับการรับรองความถูกต้องในสถาปัตยกรรม RESTful ไคลเอนต์ - เซิร์ฟเวอร์เป็นเรื่องของการอภิปราย

โดยทั่วไปสามารถทำได้ใน SOA ผ่าน HTTP โลกผ่าน:

  • HTTP การตรวจสอบขั้นพื้นฐานผ่าน HTTPS;
  • คุกกี้และการจัดการเซสชัน
  • โทเค็นในส่วนหัว HTTP (เช่นOAuth 2.0 + JWT);
  • การตรวจสอบแบบสอบถามด้วยพารามิเตอร์ลายเซ็นเพิ่มเติม

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

แต่ละรูปแบบการรับรองความถูกต้องมีข้อดีและข้อเสียของตนเองขึ้นอยู่กับวัตถุประสงค์ของนโยบายความปลอดภัยและสถาปัตยกรรมซอฟต์แวร์ของคุณ

HTTP การตรวจสอบขั้นพื้นฐานผ่าน HTTPS

โซลูชันแรกนี้ใช้ HTTPS โปรโตคอลมาตรฐานซึ่งเว็บเซอร์วิสส่วนใหญ่ใช้

GET /spec.html HTTP/1.1
Host: www.example.org
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

เป็นเรื่องง่ายที่จะติดตั้งใช้งานได้ตามค่าเริ่มต้นในเบราว์เซอร์ทั้งหมด แต่มีข้อบกพร่องบางอย่างที่รู้จักเช่นหน้าต่างการตรวจสอบสิทธิ์ที่น่ากลัวที่แสดงบนเบราว์เซอร์ซึ่งจะคงอยู่ (ไม่มีคุณสมบัติเหมือน LogOut) และความจริงที่ว่าชื่อผู้ใช้และรหัสผ่านถูกส่ง (ผ่าน HTTPS) ไปยังเซิร์ฟเวอร์ (ควรมีความปลอดภัยมากกว่าเพื่อให้รหัสผ่านอยู่ที่ฝั่งไคลเอ็นต์เท่านั้นในระหว่างการป้อนคีย์บอร์ดและถูกเก็บเป็นแฮชที่ปลอดภัยบนเซิร์ฟเวอร์) .

เราอาจใช้การรับรองความถูกต้องแบบแยกย่อยแต่ต้องใช้ HTTPS ด้วยเนื่องจากมีความเสี่ยงต่อการโจมตีแบบMiMหรือReplayและเฉพาะกับ HTTP

เซสชันผ่านคุกกี้

ความจริงแล้วเซสชันที่จัดการบนเซิร์ฟเวอร์นั้นไม่ไร้สัญชาติอย่างแท้จริง

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

GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: theme=light; sessionToken=abc123

เทคนิคคุกกี้นั้นเชื่อมโยงกับ HTTP ดังนั้นจึงไม่สงบจริง ๆ ซึ่งควรเป็นโปรโตคอลอิสระ IMHO มีความเสี่ยงต่อการโจมตีMiMหรือReplay

ได้รับผ่าน Token (OAuth2)

อีกทางเลือกหนึ่งคือการใส่โทเค็นภายในส่วนหัว HTTP เพื่อให้การรับรองความถูกต้อง นี่คือสิ่งที่OAuth 2.0 ทำตัวอย่างเช่น ดูRFC 6749 :

 GET /resource/1 HTTP/1.1
 Host: example.com
 Authorization: Bearer mF_9.B5f-4.1JqM

ในระยะสั้นนี้จะคล้ายกับคุกกี้และเป็นปัญหาเดียวกัน: ไม่ไร้สัญชาติอาศัยรายละเอียดการส่ง HTTP และอาจมีจุดอ่อนด้านความปลอดภัยจำนวนมากรวมถึง MiM และ Replay ดังนั้นจะใช้งานผ่าน HTTPS เท่านั้น โดยทั่วไปแล้วJWTจะใช้เป็นโทเค็น

การรับรองความถูกต้องของแบบสอบถาม

การรับรองความถูกต้องของแบบสอบถามประกอบด้วยการลงนามคำขอ RESTful แต่ละรายการผ่านพารามิเตอร์เพิ่มเติมบางอย่างใน URI ดูบทความนี้อ้างอิง

มันถูกกำหนดเช่นนี้ในบทความนี้:

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

เทคนิคนี้อาจเข้ากันได้กับสถาปัตยกรรมไร้สัญชาติมากขึ้นและยังสามารถนำไปใช้กับการจัดการเซสชันแบบเบา (ใช้เซสชันในหน่วยความจำแทนการคงอยู่ของ DB)

ตัวอย่างเช่นนี่คือตัวอย่าง URI ทั่วไปจากลิงก์ด้านบน:

GET /object?apiKey=Qwerty2010

ควรถ่ายทอดเช่นนี้:

GET /object?timestamp=1261496500&apiKey=Qwerty2010&signature=abcdef0123456789

สตริงที่กำลังเซ็นชื่อคือ/object?apikey=Qwerty2010&timestamp=1261496500และลายเซ็นต์คือแฮช SHA256 ของสตริงนั้นโดยใช้คอมโพเนนต์ส่วนตัวของคีย์ API

การแคชข้อมูลฝั่งเซิร์ฟเวอร์สามารถใช้ได้เสมอ ตัวอย่างเช่นในกรอบงานของเราเราแคชการตอบสนองในระดับ SQL ไม่ใช่ระดับ URI ดังนั้นการเพิ่มพารามิเตอร์พิเศษนี้จะไม่ทำลายกลไกแคช

ดูบทความนี้สำหรับรายละเอียดบางอย่างเกี่ยวกับการรับรองความถูกต้อง RESTful ในไคลเอนต์ - เซิร์ฟเวอร์ ORM / SOA / MVC เฟรมเวิร์กของเราตาม JSON และ REST เนื่องจากเราอนุญาตการสื่อสารไม่เพียง แต่ผ่าน HTTP / 1.1 แต่ยังมีชื่อไปยัง pipes หรือข้อความ GDI (ในเครื่อง) เราจึงพยายามใช้รูปแบบการรับรองความถูกต้อง RESTful อย่างแท้จริงและไม่พึ่งพา HTTP เฉพาะ (เช่นส่วนหัวหรือคุกกี้)

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

ในทางปฏิบัติการรับรองความถูกต้องของโทเค็น MAC สำหรับ OAuth 2.0อาจเป็นการปรับปรุงอย่างมากเกี่ยวกับรูปแบบปัจจุบัน "ที่ได้รับจากโทเค็น" แต่นี่ยังคงเป็นงานที่อยู่ระหว่างดำเนินการและเชื่อมโยงกับการส่ง HTTP

ข้อสรุป

สรุปได้ว่า REST ไม่เพียงใช้ HTTP เท่านั้นแม้ว่าในทางปฏิบัติจะใช้งานผ่าน HTTP เป็นส่วนใหญ่ REST สามารถใช้เลเยอร์การสื่อสารอื่น ๆ ดังนั้นการรับรองความถูกต้อง RESTful ไม่ได้เป็นเพียงคำพ้องความหมายของการรับรองความถูกต้อง HTTP สิ่งที่ Google ตอบ มันไม่ควรใช้กลไก HTTP เลย แต่จะต้องแยกจากเลเยอร์การสื่อสาร และถ้าคุณใช้การสื่อสาร HTTP ด้วยความคิดริเริ่ม Let's Encryptไม่มีเหตุผลที่จะไม่ใช้ HTTPS ที่เหมาะสมซึ่งเป็นสิ่งจำเป็นนอกเหนือไปจากรูปแบบการตรวจสอบความถูกต้องใด ๆ


5
หากคุณใช้Cookieการแทนที่ที่ดีกว่าสำหรับHTTP Basic Authคุณสามารถทำการพิสูจน์ตัวตนแบบไร้สัญชาติอย่างแท้จริงด้วยวิธีการหมดอายุการรับรองความถูกต้องและความสามารถในการออกจากระบบ ตัวอย่างการใช้งานสามารถใช้คุกกี้ที่เรียกว่าEmulated-HTTP-Basic-Authมีค่าใกล้เคียงกับ Auth HTTP Basic จริงและในเวลาที่กำหนดนอกจากนี้ การออกจากระบบสามารถนำมาใช้โดยการลบคุกกี้นั้น ฉันเดาว่าไคลเอนต์ใด ๆ ที่สามารถรองรับ HTTP Basic Auth สามารถรองรับการรับรองความถูกต้องของคุกกี้ได้ด้วยวิธีนี้
Mikko Rantalainen

4
@MikkoRantalainen แต่คุกกี้นี้จะยังคงได้รับการจัดการโดยเซิร์ฟเวอร์ตามที่ฉันเขียน เป็นคนไร้สัญชาติ แต่ไม่ใช่คนไร้สัญชาติ "บริสุทธิ์" ในทุกกรณีคุณต้องมีรหัส JavaScript ที่ใช้สำหรับการเข้าสู่ระบบ / ออกจากระบบของลูกค้าซึ่งเป็นไปได้อย่างสมบูรณ์แบบเช่นกับ HTTP Digest Auth - ความคิดที่ดี แต่ไม่มีประโยชน์อะไรเลย
Arnaud Bouchez

4
ฉันจะอ้างว่าเซิร์ฟเวอร์ใช้ UI และตรรกะสำหรับการกำหนดค่าส่วนหัว แต่ส่วนหัวของตัวเองนั้นไร้สัญชาติ ไคลเอนต์ที่ออกแบบมาสำหรับ API สามารถข้ามโดยใช้วิธีใช้เซิร์ฟเวอร์สำหรับการกำหนดค่าส่วนหัวและเพียงแค่ส่งข้อมูลที่จำเป็นคล้ายกับ HTTP Basic Auth ประเด็นของฉันคือ UAs ทั่วไป (เบราว์เซอร์) มีการใช้งาน Auth ขั้นพื้นฐานที่แย่จนไม่สามารถใช้งานได้ เซิร์ฟเวอร์ที่มีการจำลองสำหรับสิ่งเดียวกันในส่วนหัวอื่น ( Cookie) สามารถใช้แทนได้
Mikko Rantalainen

6
ฉันเดาคำตอบที่ถูกต้องคือstackoverflow.com/questions/6068113/…
graffic

7
พรอมต์รหัสผ่านที่น่าเกลียดสำหรับการให้สิทธิ์ HTTP จะปรากฏเฉพาะเมื่อเซิร์ฟเวอร์ร้องขอโดยส่งการตอบกลับ 401 Unauthorized หากคุณไม่ชอบให้ส่ง 403 สิ่งต้องห้ามแทน หน้าข้อผิดพลาดอาจรวมถึงวิธีการเข้าสู่ระบบหรือลิงค์ไปยังมัน อย่างไรก็ตาม แต่อาร์กิวเมนต์ที่ใหญ่ที่สุดสำหรับคุกกี้และการรับรองความถูกต้อง http (ไม่ว่าสถานะจะเป็นฝั่งเซิร์ฟเวอร์หรือฝั่งไคลเอ็นต์) ก็คือพวกเขาเสี่ยงต่อการปลอมแปลงคำขอข้ามไซต์ ด้วยเหตุผลนี้วิธีที่ดีที่สุดคือรูปแบบการให้สิทธิ์ที่กำหนดเองหัวข้อการให้สิทธิ์ที่กำหนดเองหรือพารามิเตอร์ GET หรือ POST ที่กำหนดเอง
Dobes Vandermeer

418

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

ปัญหาที่ฉันพบเมื่อใช้การพิสูจน์ตัวตน HTTP บนเซอร์วิส RESTful ที่สร้างเพจ HTML ที่จะดูในเบราว์เซอร์คือ:

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

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

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

ด้วยการทำให้เซสชันเป็นทรัพยากรที่สงบด้วยกฎต่อไปนี้:

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

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

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

ฉันรู้สึกว่านี่เป็นทางออกที่เพียงพอที่ทำงานได้ดี แต่ฉันต้องยอมรับว่าฉันไม่เพียงพอที่จะรู้ว่าผู้เชี่ยวชาญด้านความปลอดภัยสามารถระบุช่องโหว่ที่อาจเกิดขึ้นได้ในโครงการนี้ - ทั้งหมดที่ฉันรู้ก็คือ โปรโตคอลการเข้าสู่ระบบ ($ _SESSION ใน PHP, HttpSession ใน Java EE และอื่น ๆ ) เนื้อหาส่วนหัวของคุกกี้นั้นใช้เพื่อจัดการกับทรัพยากรฝั่งเซิร์ฟเวอร์เช่นเดียวกับภาษาที่ยอมรับได้อาจถูกใช้เพื่อเข้าถึงทรัพยากรการแปลเป็นต้น ฉันรู้สึกว่ามันเหมือนกัน แต่คนอื่นอาจจะไม่? คุณคิดว่าไงครับ


68
นี่คือคำตอบอย่างจริงจังและวิธีแก้ปัญหาที่นำเสนอใช้งานได้ อย่างไรก็ตามการใช้คำว่า "สงบ" และ "เซสชั่น" ในประโยคเดียวกันนั้นผิด (เว้นแต่จะมี "ไม่" อยู่ระหว่าง;) กล่าวอีกนัยหนึ่ง: บริการเว็บใด ๆ ที่ใช้เซสชันจะไม่สงบ (ตามคำจำกัดความ) อย่าเข้าใจฉันผิด - คุณยังสามารถใช้โซลูชันนี้ (YMMV) ได้ แต่คำว่า "RESTful" ไม่สามารถใช้ได้ ฉันแนะนำหนังสือ O'Reilly เกี่ยวกับ REST ซึ่งสามารถอ่านได้มากและอธิบายเนื้อหาในเชิงลึก
johndodo

23
@skrebbel: โซลูชัน REST บริสุทธิ์จะส่งข้อมูลการตรวจสอบสิทธิ์ทุกครั้งที่ร้องขอทรัพยากรซึ่งน้อยกว่าที่สมบูรณ์แบบ (HTTP Auth ทำสิ่งนี้) โซลูชันที่เสนอทำงานได้ดีและดีกว่าสำหรับกรณีการใช้งานส่วนใหญ่ แต่ก็ไม่ได้สงบ ไม่จำเป็นต้องทำสงครามฉันใช้วิธีนี้เช่นกัน ฉันแค่ไม่อ้างว่ามันสงบ :)
johndodo

94
โอมาเลยยกตัวอย่างแล้ว มีวิธีอื่นใดที่ใช้งานได้ดี ฉันอยากรู้จริงๆ HTTP Auth ไม่แน่นอนคุณไม่สามารถออกจากระบบได้โดยไม่ต้องปิดเบราว์เซอร์และคุณไม่สามารถเสนอ UX สำหรับการเข้าสู่ระบบที่ดีได้โดยไม่ต้องใช้ JS ที่ไม่รองรับอนาคตของเบราว์เซอร์ ฉันไม่สนใจเกี่ยวกับ "RESTful ล้วน ๆ " กับ "RESTful เกือบ" และการอภิปรายทางศาสนาที่เกี่ยวข้องทั้งหมด แต่ถ้าคุณบอกว่ามีหลายวิธีคุณควรสะกดมันออกมา
skrebbel

15
การรับรองความถูกต้อง RESTful อย่างแท้จริงกับตัวแทนผู้ใช้โลกแห่งความจริง (aka "เบราว์เซอร์") ประกอบด้วยคุกกี้ที่มีค่าการรับรองความถูกต้อง HTTP วิธีนี้เซิร์ฟเวอร์สามารถให้ UI สำหรับการเข้าสู่ระบบและรหัสผ่านและเซิร์ฟเวอร์สามารถบังคับให้ออกจากระบบ (โดยการลบคุกกี้) นอกจากนี้แทนที่จะตอบสนอง 401 เพื่อกำหนดให้ต้องลงชื่อเข้าใช้เมื่อการรับรองความถูกต้องล้มเหลวเซิร์ฟเวอร์จะต้องใช้การเปลี่ยนเส้นทางชั่วคราวไปที่หน้าจอการเข้าสู่ระบบและหลังจากการเข้าสู่ระบบสำเร็จให้ใช้การเปลี่ยนเส้นทางชั่วคราวกลับไปยังตำแหน่งก่อนหน้า นอกจากนี้เซิร์ฟเวอร์จะต้องฝังการกระทำการออกจากระบบ (แบบฟอร์ม POST) ให้กับผู้ใช้ที่เข้าสู่ระบบทุกหน้า
Mikko Rantalainen

15
ฉันไม่เห็นอะไรผิดปกติในการใช้ "restful" และ "session" ในประโยคเดียวกันตราบใดที่มันชัดเจนว่าเซสชันนั้นมีเฉพาะฝั่งไคลเอ็นต์ ฉันไม่แน่ใจว่าทำไมเรื่องใหญ่เช่นนี้เกิดขึ้นกับแนวคิดนี้
Joe Phillips

140

เพียงพอแล้วมีการพูดในหัวข้อนี้โดยคนดีที่นี่ แต่นี่คือ 2 เซ็นต์ของฉัน

การโต้ตอบมี 2 โหมด:

  1. มนุษย์กับเครื่องจักร (HTM)
  2. เครื่องจักรต่อเครื่อง (MTM)

เครื่องจักรเป็นตัวส่วนร่วมซึ่งแสดงเป็น REST APIs และนักแสดง / ลูกค้าที่เป็นมนุษย์หรือเครื่องจักร

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

เมื่อเราพิจารณาสิ่งนี้ในบริบทของแอปพลิเคชันที่มนุษย์เป็นเครื่อง "เบราว์เซอร์" ตามที่ Skrebbel กล่าวไว้ข้างต้นนี่หมายความว่าแอปพลิเคชัน (เว็บ) ที่ทำงานในเบราว์เซอร์จะต้องส่งสถานะและข้อมูลที่เกี่ยวข้อง มันทำกับ back end REST APIs

พิจารณาสิ่งนี้: คุณมีแพลตฟอร์มข้อมูล / ข้อมูลที่เปิดเผยของ REST API บางทีคุณอาจมีแพลตฟอร์ม BI แบบบริการตนเองที่จัดการคิวข้อมูลทั้งหมด แต่คุณต้องการให้ลูกค้า (คน) ของคุณเข้าถึงสิ่งนี้ผ่านทาง (1) เว็บแอป (2) แอพมือถือและ (3) แอปพลิเคชันบุคคลที่สามบางส่วน ในที่สุดโซ่ของ MTM ก็นำไปสู่ ​​HTM ได้ดี ดังนั้นผู้ใช้มนุษย์ยังคงอยู่ที่จุดสูงสุดของห่วงโซ่ข้อมูล

ใน 2 กรณีแรกคุณมีกรณีสำหรับการโต้ตอบระหว่างมนุษย์กับเครื่องข้อมูลที่ผู้ใช้มนุษย์ใช้จริง ในกรณีสุดท้ายคุณมีโปรแกรมเครื่องที่ใช้ REST API

แนวคิดของการรับรองความถูกต้องนำไปใช้ทั่วกระดาน คุณจะออกแบบสิ่งนี้อย่างไรเพื่อให้ REST APIs ของคุณเข้าถึงได้อย่างปลอดภัยและสม่ำเสมอ? วิธีที่ฉันเห็นสิ่งนี้มี 2 วิธี:

วิธีที่ 1:

  1. ไม่มีการเข้าสู่ระบบที่จะเริ่มต้นด้วย ทุกคำขอทำการเข้าสู่ระบบ
  2. ลูกค้าส่งพารามิเตอร์การระบุ + พารามิเตอร์เฉพาะคำขอกับแต่ละคำขอ
  3. REST API จะพาพวกเขาหันไปรอบ ๆ ส่ง Ping ไปยังที่เก็บของผู้ใช้ (อะไรก็ตามที่เป็น) และยืนยันการรับรองความถูกต้อง
  4. หากการรับรองความถูกต้องให้บริการคำขอ; มิฉะนั้นปฏิเสธด้วยรหัสสถานะ HTTP ที่เหมาะสม
  5. ทำซ้ำข้างต้นสำหรับทุกคำขอใน REST API ทั้งหมดในแคตตาล็อกของคุณ

วิธีที่ 2:

  1. ลูกค้าเริ่มต้นด้วยการตรวจสอบคำขอ
  2. ล็อกอิน REST API จะจัดการคำขอดังกล่าวทั้งหมด
  3. ใช้ในพารามิเตอร์รับรองความถูกต้อง (คีย์ API, uid / pwd หรืออะไรก็ตามที่คุณเลือก) และตรวจสอบรับรองความถูกต้องกับร้านค้าผู้ใช้ (LDAP, AD หรือ MySQL DB เป็นต้น)
  4. หากตรวจสอบแล้วให้สร้างโทเค็นรับรองความถูกต้องและส่งกลับไปยังลูกค้า / ผู้โทร
  5. จากนั้นผู้เรียกจะส่งโทเค็นรับรองความถูกต้องนี้ + ขอพารามิเตอร์ที่เฉพาะเจาะจงพร้อมกับทุกคำขอที่ตามมาไปยัง REST APIs ธุรกิจอื่นจนกว่าจะออกจากระบบหรือจนกว่าสัญญาเช่าจะหมดอายุ

เห็นได้ชัดว่าใน Way-2 REST APIs จะต้องมีวิธีในการรับรู้และเชื่อถือโทเค็นว่าถูกต้อง API การเข้าสู่ระบบทำการตรวจสอบความถูกต้องดังนั้นจึงจำเป็นต้องมี "valet key" ที่เชื่อถือได้โดย REST API อื่นในแคตตาล็อกของคุณ

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

แต่ฉันเชือนแช

จุดคือ "สถานะ" (เกี่ยวกับสถานะการรับรองความถูกต้องของลูกค้า) จะต้องได้รับการดูแลและแบ่งปันเพื่อให้ REST APIs ทั้งหมดสามารถสร้างวงกลมของความไว้วางใจ หากเราไม่ทำเช่นนี้ซึ่งเป็นวิธีที่ 1 เราต้องยอมรับว่าจะต้องดำเนินการตรวจสอบสิทธิ์สำหรับคำขอใด ๆ / ทั้งหมดที่เข้ามา

การดำเนินการรับรองความถูกต้องเป็นกระบวนการที่ใช้ทรัพยากรมาก ลองนึกภาพการดำเนินการค้นหา SQL สำหรับคำขอเข้ามาทุกครั้งกับร้านค้าผู้ใช้ของคุณเพื่อตรวจสอบการจับคู่ uid / pwd หรือเพื่อเข้ารหัสและทำการแฮชแมตช์ (สไตล์ AWS) และในเชิงสถาปัตยกรรม REST API ทุกตัวจะต้องทำสิ่งนี้ฉันสงสัยว่าใช้บริการเข้าสู่ระบบแบ็คเอนด์ทั่วไป เพราะถ้าคุณทำไม่ได้คุณจะทิ้งรหัสรับรองความถูกต้องทุกที่ ความยุ่งเหยิงครั้งใหญ่

เลเยอร์มากกว่าแฝงมากขึ้น

ตอนนี้ใช้ Way-1 และนำไปใช้กับ HTM ผู้ใช้ (คน) ของคุณสนใจจริง ๆ หรือไม่ถ้าคุณต้องส่ง uid / pwd / hash หรืออะไรก็ตามที่มีการร้องขอทุกครั้ง ไม่ตราบใดที่คุณไม่รบกวนเธอด้วยการโยนหน้า auth / login ทุกวินาที โชคดีที่มีลูกค้าถ้าคุณทำ ดังนั้นสิ่งที่คุณจะทำคือการจัดเก็บข้อมูลการเข้าสู่ระบบที่ไหนสักแห่งในฝั่งลูกค้าในเบราว์เซอร์ที่จุดเริ่มต้นและส่งไปพร้อมกับทุกคำขอ สำหรับผู้ใช้ (คน) เธอได้เข้าสู่ระบบแล้วและมี "เซสชัน" พร้อมใช้งาน แต่ในความเป็นจริงเธอได้รับการรับรองในทุกคำขอ

เหมือนกับ Way-2 ผู้ใช้ (คน) ของคุณจะไม่สังเกตเห็น ดังนั้นจึงไม่มีอันตรายใด ๆ เกิดขึ้น

จะเป็นอย่างไรถ้าเราใช้ Way-1 กับ MTM ในกรณีนี้เนื่องจากเครื่องเราสามารถเจาะนรกออกจากผู้ชายคนนี้โดยขอให้มันส่งข้อมูลการตรวจสอบสิทธิ์กับทุกคำขอ ไม่มีใครสนใจ! การแสดง Way-2 บน MTM จะไม่ทำให้เกิดปฏิกิริยาพิเศษใด ๆ มันเป็นเครื่องจักรกล มันน่าสนใจน้อยกว่า!

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

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


3
ท่านท่านอธิบายสิ่งนี้ได้อย่างสวยงามมากจนข้าพเจ้ามีความคิดที่ชัดเจนเกี่ยวกับปัญหา / คำถามพื้นฐานในมือ คุณเป็นเหมือนพระพุทธเจ้า! ฉันสามารถเพิ่มได้โดยใช้ HTTPS ที่เลเยอร์การขนส่งเราสามารถป้องกันการโจมตี Man In the Middle ได้ดังนั้นจึงไม่มีใครจี้กุญแจตัวระบุของฉัน (หากเลือกวิธีที่ 1)
Vishnoo Rath

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

9
ฉันอ่านคำตอบของคุณ; ในโซลูชันของคุณสำหรับทุกคำขอทางเว็บที่เกิดขึ้นในเบราว์เซอร์โดยการคลิกของผู้ใช้จะต้องส่ง "auth token" กลับไปที่ API ใด ๆ ที่ผู้ใช้คลิกเรียก ถ้าเช่นนั้นจะเป็นอย่างไร API ทำการตรวจสอบโทเค็น กับอะไร เทียบกับ "ร้านค้าโทเค็น" บางประเภทที่ยืนยันว่าโทเค็นนั้นถูกต้องหรือไม่ คุณไม่เห็นด้วยที่ "ร้านขายโทเค็น" นั้นกลายเป็นผู้ดูแล "รัฐ" หรือไม่? อย่างไรก็ตามจริงๆแล้วคุณเห็นสิ่งนี้บางคนต้องรู้อะไรบางอย่างเกี่ยวกับ "โทเค็น" ที่ถูกส่งผ่านไปในกิจกรรมของผู้ใช้ นั่นคือที่ข้อมูลของรัฐมีชีวิตอยู่
Kingz

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

1
คุณหายไปWay-3วิธีไฮบริด ลูกค้าเข้าสู่ระบบในWay-2แต่ในขณะที่ในWay-1หนังสือรับรองไม่ได้ตรวจสอบกับสถานะด้านเซิร์ฟเวอร์ใด ๆ Way-2โดยไม่คำนึงถึงโทเค็นการรับรองความถูกต้องถูกสร้างขึ้นและส่งกลับไปยังลูกค้าในขณะที่ โทเค็นนี้จะถูกตรวจสอบเพื่อความถูกต้องในภายหลังโดยใช้ asymmetric crypto โดยไม่ต้องมองหาสถานะของลูกค้า
jcoffland

50

นี่คือโซลูชันการรับรองความถูกต้อง RESTful ที่แท้จริงและสมบูรณ์:

  1. สร้างคู่คีย์สาธารณะ / ส่วนตัวบนเซิร์ฟเวอร์การตรวจสอบความถูกต้อง
  2. กระจายกุญแจสาธารณะไปยังเซิร์ฟเวอร์ทั้งหมด
  3. เมื่อลูกค้ารับรองความถูกต้อง:

    3.1 ออกโทเค็นซึ่งมีสิ่งต่อไปนี้:

    • เวลาหมดอายุ
    • ชื่อผู้ใช้ (ไม่จำเป็น)
    • IP ของผู้ใช้ (เป็นทางเลือก)
    • แฮชของรหัสผ่าน (ไม่จำเป็น)

    3.2 เข้ารหัสโทเค็นด้วยคีย์ส่วนตัว

    3.3 ส่งโทเค็นเข้ารหัสกลับไปยังผู้ใช้

  4. เมื่อผู้ใช้เข้าถึง API ใด ๆ พวกเขาจะต้องผ่านการตรวจสอบความถูกต้องของโทเค็นด้วย

  5. เซิร์ฟเวอร์สามารถตรวจสอบว่าโทเค็นนั้นถูกต้องโดยการถอดรหัสโดยใช้รหัสสาธารณะของเซิร์ฟเวอร์รับรองความถูกต้อง

นี่คือการพิสูจน์ตัวตนแบบไร้สัญชาติ / RESTful

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


5
จะเกิดอะไรขึ้นถ้ามีคนถือโทเค็นการรับรองความถูกต้องและเรียกใช้ API โดยอ้างว่าเป็นลูกค้า
Abidi

2
@Abidi ใช่ว่าเป็นปัญหา คุณอาจต้องการรหัสผ่าน แฮชของรหัสผ่านอาจรวมอยู่ในโทเค็นการรับรองความถูกต้อง หากใครบางคนสามารถขโมยโทเค็นได้จะมีความเสี่ยงต่อการโจมตีด้วยกำลังดุร้ายแบบออฟไลน์ หากเลือกข้อความรหัสผ่านที่คาดเดายากว่าจะไม่มีปัญหา โปรดทราบว่าหากคุณใช้การขโมยโทเค็นของ https จะต้องให้ผู้โจมตีเข้าใช้เครื่องของลูกค้าก่อน
jcoffland

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

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

3
@ jcoffland คุณส่งเสริมคำตอบของคุณจริงๆที่นี่ (ซ้ำ ๆ :-) แต่ฉันไม่สามารถให้ความเห็นเกี่ยวกับปัญหาด้านประสิทธิภาพ (ความเข้มของการคำนวณ) ของการใช้การเข้ารหัสแบบอสมมาตรในการโทรทุกครั้ง ฉันไม่เห็นโซลูชันที่มีความสามารถในการขยายขนาด ค้นหา HTTPS และโปรโตคอล SPDY มันใช้ความยาวในการเปิดการเชื่อมต่อ (HTTP keep-alives ซึ่งเป็นสถานะ) และให้บริการหลายทรัพยากรในแบตช์ผ่านการเชื่อมต่อเดียวกัน (สถานะมากขึ้น) และแน่นอน SSL เองใช้การเข้ารหัสแบบอสมมาตรเพื่อแลกเปลี่ยนคีย์ตัวเลขแบบสมมาตร รัฐด้วย)
Craig

37

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

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

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

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


2
ผู้คนไม่พยายามห้ามไม่ให้คุณใช้เซสชัน คุณมีอิสระที่จะทำ แต่ถ้าคุณทำมันไม่ได้เป็นแบบ REST
André Caldas

6
@ AndréCaldasไม่ใช่ส่วนที่เหลือในลักษณะเดียวกับที่มีฟังก์ชั่นหรือประเภทดั้งเดิมในภาษาที่ไม่ได้เป็น oop ฉันไม่ได้บอกว่ามีช่วงที่แนะนำ ฉันแค่ให้ความเห็นเกี่ยวกับการทำตามชุดของการปฏิบัติในขอบเขตที่พวกเขาไม่ให้ประโยชน์กับใครบางคนอีกต่อไป (Btw สังเกตว่าฉันไม่ได้ต่อต้านคำพูดของคุณ แต่ฉันจะไม่บอกว่ามันไม่ใช่ REST แต่ฉันจะบอกว่ามันไม่ใช่REST ที่บริสุทธิ์ )
arg20

แล้วเราจะเรียกมันว่าอะไรถ้ามันไม่สงบ และแน่นอนถ้าคำขอมีรหัสเซสชันนั่นคือไร้สัญชาติเหมือนกับคำขอรวมถึงรหัสผู้ใช้หรือไม่ ทำไมสถานะผู้ใช้และสถานะเซสชันไม่มีสถานะของผู้ใช้
mfhholmes

1
คุกกี้มีความเสี่ยงที่จะเกิดการปลอมแปลงคำขอข้ามไซต์ดังนั้นจึงทำให้การละเมิดความปลอดภัยง่ายขึ้น ดีกว่าที่จะใช้สิ่งที่ไม่ได้ส่งโดยอัตโนมัติจากเบราว์เซอร์เช่นส่วนหัวที่กำหนดเองหรือรูปแบบการอนุมัติที่กำหนดเอง
Dobes Vandermeer

1
ในความเป็นจริงการพยายามไร้สัญชาตินั้นไม่ได้เกี่ยวกับความหยิ่งยโส แต่เป็นแนวคิดทั่วไปของ SOA บริการควรได้รับประโยชน์จากการไม่ถูกแยกจากกันและไร้สัญชาติ: ในทางปฏิบัติจะลดความพร้อมใช้งานและความสามารถในการบำรุงรักษา แน่นอนว่าควรจะมากที่สุดและในที่สุดคุณจะต้องมี "บริการการประสาน" เพื่อจัดการบริการไร้สัญชาติเหล่านั้นให้เป็นวิธีปฏิบัติที่เป็นประโยชน์
Arnaud Bouchez

32

สิ่งแรกและสำคัญที่สุดบริการบนเว็บที่สงบเงียบคือSTATELESS (หรือกล่าวอีกนัยหนึ่งคือSESSIONLESS)) ดังนั้นบริการ RESTful จึงไม่มีและไม่ควรมีแนวคิดเกี่ยวกับเซสชันหรือคุกกี้ที่เกี่ยวข้อง วิธีการตรวจสอบความถูกต้องหรือการอนุญาตในบริการ RESTful คือการใช้ส่วนหัว HTTP Authorization ตามที่กำหนดไว้ในข้อกำหนด RFC 2616 HTTP ทุกคำขอเดียวควรมีส่วนหัว HTTP Authorization และควรส่งคำขอผ่านการเชื่อมต่อ HTTP (SSL) นี่เป็นวิธีที่ถูกต้องในการตรวจสอบความถูกต้องและเพื่อตรวจสอบการอนุญาตในคำขอใช้บริการเว็บ HTTP RESTful ฉันได้ติดตั้งบริการเว็บสงบสำหรับแอปพลิเคชัน Cisco PRIME Performance Manager ที่ Cisco Systems และเป็นส่วนหนึ่งของบริการเว็บนั้นฉันได้ใช้การพิสูจน์ตัวตน / การอนุญาตด้วย


5
การตรวจสอบความถูกต้อง HTTP ยังคงต้องใช้เซิร์ฟเวอร์ในการติดตามรหัสผู้ใช้และรหัสผ่าน นี่ไม่ใช่ไร้สัญชาติอย่างสมบูรณ์
jcoffland

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

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

1
@jcoffland โซลูชันของคุณยังต้องอาศัยความสามารถของเซิร์ฟเวอร์ API ในการถอดรหัสโทเค็นที่ลงชื่อ ฉันคิดว่าวิธีการนี้ไม่เพียง แต่เฉพาะเจาะจงเท่านั้น แต่ยังซับซ้อนเกินกว่าที่จะคิดเหมือน The approah R. Fielding มีความคิดที่จะจัดการกับปัญหาของการรับรองความถูกต้อง RESTful
Michael Ekoka

2
@jcoffland คุณเข้าใจหรือไม่ว่าการเข้ารหัสแบบอสมมาตรเข้มข้นมากขึ้น (และด้วยเหตุนี้การเข้ารหัสแบบอสมมาตรที่ใช้ทรัพยากรมากและช้า) จึงเป็นอย่างไร คุณกำลังพูดถึงรูปแบบที่จะใช้การเข้ารหัสแบบอสมมาตรในทุกคำขอ ด้านที่ช้าที่สุดของ HTTPS ไม่มีแถบคือการจับมือเริ่มต้นซึ่งเกี่ยวข้องกับการสร้างกุญแจสาธารณะ / ส่วนตัวเพื่อเข้ารหัสลับที่ไม่ใช้ร่วมกันแบบไม่สมมาตรซึ่งจะถูกใช้เพื่อเข้ารหัสการสื่อสารที่ตามมาแบบสมมาตรทั้งหมด
Craig

22

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

วิธีที่ง่ายที่สุดที่จะเข้าใกล้นี้โดยเริ่มต้นด้วย HTTP ในตัวกลไกการตรวจสอบในRFC 2617


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

3
@jcoffland: นั่นไม่ใช่เรื่องจริงทั้งสองบัญชี HTTP Auth แรกไม่ต้องการให้เซิร์ฟเวอร์เก็บรหัสผ่าน กัญชารหัสผ่านจะถูกเก็บไว้แทน (bcrypt กับ 8+ รอบแนะนำ) ประการที่สองเซิร์ฟเวอร์ไม่มีสถานะใด ๆ เนื่องจากส่วนหัวการให้สิทธิ์จะถูกส่งไปพร้อมกับทุกคำขอ และถ้าคุณพิจารณาแฮชรหัสผ่านที่เก็บไว้เป็นสถานะจะไม่มีสถานะมากกว่าคีย์สาธารณะที่เก็บไว้
Boris B.

1
@ Boris B. ใช่ฉันเข้าใจว่ารหัสผ่านถูกเก็บเป็นแฮช รหัสผ่านที่แฮชยังคงเป็นสถานะเฉพาะของลูกค้า ความแตกต่างของการเก็บคีย์สาธารณะดังที่อธิบายไว้ในโซลูชันของฉันคือมีคีย์สาธารณะเพียงคีย์เดียวเท่านั้นของเซิร์ฟเวอร์การตรวจสอบสิทธิ์ สิ่งนี้แตกต่างจากการจัดเก็บแฮรหัสผ่านต่อผู้ใช้ ไม่ว่าคุณจะแต่งตัวอย่างไรถ้าเซิร์ฟเวอร์จัดเก็บรหัสผ่านสำหรับผู้ใช้แต่ละคนแล้วมันจะถูกจัดเก็บตามสถานะผู้ใช้และไม่ใช่ 100% REST
jcoffland

7
ฉันไม่คิดว่าการจัดเก็บรหัสผ่านที่ผู้ใช้แฮชบนเซิร์ฟเวอร์ควรได้รับการพิจารณาสถานะฝั่งเซิร์ฟเวอร์ ผู้ใช้คือทรัพยากรที่มีข้อมูลเช่นชื่อที่อยู่หรือรหัสผ่านที่แฮช
Codepunkt

15

บทความ 'ลึกซึ้งมาก' ที่กล่าวถึงโดย @skrebel ( http://www.berenddeboer.net/rest/authentication.html ) กล่าวถึงวิธีการตรวจสอบที่ซับซ้อน แต่แตกหักจริงๆ

คุณอาจลองไปที่หน้า (ซึ่งควรจะดูได้เฉพาะผู้ใช้ที่ผ่านการตรวจสอบแล้ว) http://www.berenddeboer.net/rest/site/authenticated.htmlโดยไม่มีข้อมูลการเข้าสู่ระบบใด ๆ

(ขออภัยฉันไม่สามารถออกความเห็นในคำตอบ)

ฉันจะบอกว่าส่วนที่เหลือและรับรองความถูกต้องก็ไม่ได้ผสม REST หมายถึงไร้สัญชาติ แต่ 'รับรองความถูกต้อง' เป็นสถานะ คุณไม่สามารถมีทั้งสองอย่างในเลเยอร์เดียวกัน หากคุณเป็นผู้สนับสนุน RESTful และขมวดคิ้วต่อรัฐคุณต้องไปกับ HTTPS (เช่นปล่อยปัญหาด้านความปลอดภัยไปยังเลเยอร์อื่น)


Stripe.com จะบอกว่ามิฉะนั้นความคิดเห็นของคุณในส่วนที่เหลือและรับรองความถูกต้องไม่ผสม ..
เอริค

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

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

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

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

12

ฉันคิดว่าการรับรองความถูกต้องที่เกี่ยวข้องกับการผ่านโทเค็นการรับรองความถูกต้องเป็นพารามิเตอร์ในคำขอ ตัวอย่างการใช้ apikeys โดย api ฉันไม่เชื่อว่าการใช้คุกกี้หรือ http auth ผ่านการรับรอง


ควรหลีกเลี่ยงคุกกี้และ HTTP Auth เนื่องจากช่องโหว่ CSRF
Dobes Vandermeer

@DobesVandermeer คุณช่วยโปรดดูคำถามของฉันถ้าคุณสามารถช่วยได้? stackoverflow.com/questions/60111743/…
Hemant Metalia

12

อัปเดตในวันที่ 16 กุมภาพันธ์ 2019

วิธีการที่กล่าวก่อนหน้านี้ด้านล่างเป็นหลัก "รหัสผ่านเจ้าของทรัพยากร Credential" ประเภททุนของOAuth2.0 นี่เป็นวิธีที่ง่ายในการเริ่มต้นใช้งาน อย่างไรก็ตามด้วยวิธีนี้ทุกแอปพลิเคชันในองค์กรจะจบลงด้วยกลไกการพิสูจน์ตัวตนและการอนุญาต วิธีการที่แนะนำคือประเภทการอนุญาต "รหัสอนุญาต" นอกจากนี้ในคำตอบก่อนหน้าของฉันด้านล่างฉันแนะนำเบราว์เซอร์ localStorage สำหรับการจัดเก็บโทเค็นรับรองความถูกต้อง อย่างไรก็ตามฉันเชื่อว่าคุกกี้เป็นตัวเลือกที่เหมาะสมสำหรับวัตถุประสงค์นี้ ฉันมีรายละเอียดเหตุผลของฉันวิธีการใช้งานประเภทการให้สิทธิ์รหัสการพิจารณาความปลอดภัย ฯลฯ ในคำตอบ StackOverflowนี้


ฉันคิดว่าวิธีการต่อไปนี้สามารถใช้สำหรับการรับรองความถูกต้องของบริการ REST:

  1. สร้างล็อกอิน RESTful API เพื่อยอมรับชื่อผู้ใช้และรหัสผ่านสำหรับการตรวจสอบสิทธิ์ ใช้วิธี HTTP POST เพื่อป้องกันการแคชและ SSL เพื่อความปลอดภัยระหว่างการขนส่งเมื่อตรวจสอบสำเร็จ API จะส่งคืน JWT สองครั้ง - โทเค็นการเข้าถึงหนึ่งครั้ง (ความถูกต้องที่สั้นกว่าพูด 30 นาที) และหนึ่งโทเค็นการรีเฟรช
  2. ไคลเอนต์ (UI บนเว็บ) เก็บ JWTs ในที่จัดเก็บในตัวเครื่องและในทุกการเรียก API ที่ตามมาจะผ่านโทเค็นการเข้าถึงในส่วนหัว "การอนุญาต: Bearer #access token"
  3. API ตรวจสอบความถูกต้องของโทเค็นโดยการตรวจสอบลายเซ็นและวันหมดอายุ หากโทเค็นนั้นถูกต้องให้ตรวจสอบว่าผู้ใช้ (ซึ่งแปลว่าการเรียกร้อง "sub" ใน JWT เป็นชื่อผู้ใช้) มีการเข้าถึง API ด้วยการค้นหาแคช หากผู้ใช้ได้รับอนุญาตให้เข้าถึง API ให้ดำเนินการตามตรรกะทางธุรกิจ
  4. หากโทเค็นหมดอายุ API จะส่งคืนรหัสตอบกลับ HTTP 400
  5. ลูกค้าที่รับ 400/401 จะเรียกใช้ REST API อีกอันด้วยโทเค็นการรีเฟรชในหัวข้อ "การอนุญาต: ผู้ถือ #refresh โทเค็น" เพื่อรับโทเค็นการเข้าถึงใหม่
  6. ในการรับสายที่มีโทเค็นการรีเฟรชให้ตรวจสอบว่าโทเค็นการรีเฟรชนั้นถูกต้องหรือไม่โดยตรวจสอบลายเซ็นและวันหมดอายุ หากโทเค็นการรีเฟรชนั้นถูกต้องให้รีเฟรชแคชด้านขวาของผู้ใช้จากฐานข้อมูลและส่งกลับโทเค็นการเข้าถึงใหม่และโทเค็นการรีเฟรช หากโทเค็นการรีเฟรชไม่ถูกต้องให้ส่งคืนรหัสตอบกลับ HTTP 400
  7. หากมีการส่งคืนโทเค็นการเข้าถึงและโทเค็นการรีเฟรชใหม่ให้ไปที่ขั้นตอนที่ 2 หากมีการส่งคืนรหัสตอบกลับ HTTP 400 ไคลเอ็นต์จะถือว่าโทเค็นการรีเฟรชหมดอายุแล้วและขอชื่อผู้ใช้และรหัสผ่านจากผู้ใช้
  8. สำหรับการล็อกเอาต์ให้ล้างหน่วยเก็บข้อมูลโลคัล

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


คุณจะใช้สิ่งนี้กับ api กับเว็บไซต์แบบคงที่ที่ทำด้วย angular หรือไม่? แล้วแอพมือถือล่ะ?
Yazan Rawashdeh

8

นั่นคือวิธีที่จะทำ: การใช้ OAuth 2.0 สำหรับเข้าสู่ระบบ

คุณสามารถใช้วิธีการรับรองความถูกต้องอื่น ๆ ตามด้วย Google ตราบเท่าที่รองรับ OAuth


1
OAuth2 ไม่ปลอดภัยหากไม่มี HTTPS หรือไร้สัญชาติ
Arnaud Bouchez

4
ไม่มีอะไรปลอดภัยหากไม่มี HTTPS
Craig

1
@Craig และ HTTPS อาจไม่ได้รับการรักษาความปลอดภัยอย่างใดอย่างหนึ่งถ้าห่วงโซ่ใบรับรองเสียซึ่งอาจจะดีกว่า - en.wikipedia.org/wiki/Bullrun_(decryption_program) ;)
Arnaud Bouchez

1
@ArnaudBouchez โปรดอธิบายว่าการมีห่วงโซ่ใบรับรองที่ใช้งานไม่ได้มีไว้เพื่อประโยชน์ที่ดีกว่านี้อย่างไร ฉันไม่เข้าใจว่าคุณจะไปไหนด้วย ;)
Craig

@Craig โปรดไปที่ลิงค์และสนุกได้เลย! วิธีการ "ดีกว่า" นี้มีความเห็นถี่ถ้วนอย่างชัดเจนในความคิดเห็นของฉัน: ระบบที่เหมือนกันของ Bullrun นั้นมีไว้สำหรับ "ความดีของเรา" โดยรัฐบาลอันเป็นที่รักและเชื่อถือได้ของเรา
Arnaud Bouchez

3

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

ดูhttp://en.wikipedia.org/wiki/Public_key_infrastructure หากคุณปฏิบัติตามมาตรฐาน PKI ที่เหมาะสมบุคคลหรือตัวแทนที่ใช้รหัสที่ถูกขโมยอย่างไม่เหมาะสมจะสามารถระบุและล็อคได้ ถ้าเอเจนต์จำเป็นต้องใช้ใบรับรองการผูกจะค่อนข้างแน่น ขโมยที่ฉลาดและเคลื่อนไหวเร็วสามารถหลบหนีได้ แต่พวกมันจะทิ้งเศษขยะเพิ่มขึ้น


2

เพื่อตอบคำถามนี้จากความเข้าใจของฉัน ...

ระบบการพิสูจน์ตัวตนที่ใช้ REST เพื่อให้คุณไม่จำเป็นต้องติดตามหรือจัดการผู้ใช้ในระบบของคุณ สิ่งนี้ทำได้โดยใช้เมธอด HTTP POST, GET, PUT, DELETE เราใช้ 4 วิธีการเหล่านี้และคิดในแง่ของการโต้ตอบกับฐานข้อมูลในฐานะ CREATE, READ, UPDATE, DELETE (แต่ในเว็บที่เราใช้ POST และ GET เพราะนั่นเป็นสิ่งที่แท็กสมอสนับสนุนในปัจจุบัน) ดังนั้นการรักษา POST และ GET ในฐานะ CREATE / READ / UPDATE / DELETE (CRUD) ของเรานั้นเราสามารถออกแบบเส้นทางในเว็บแอปพลิเคชันของเราที่จะสามารถสรุปได้ว่า CRUD ที่เรากำลังทำอยู่นั้นเป็นอย่างไร

ตัวอย่างเช่นในแอปพลิเคชัน Ruby on Rails เราสามารถสร้างแอปพลิเคชันเว็บของเราได้เช่นหากผู้ใช้ที่เข้าสู่ระบบhttp://store.com/account/logoutจากนั้น GET ของหน้านั้นสามารถดูได้ว่าผู้ใช้พยายามออกจากระบบ . ในตัวควบคุมรางของเราเราจะสร้างการกระทำในการบันทึกผู้ใช้ออกและส่งพวกเขากลับไปที่หน้าแรก

GET บนหน้าเข้าสู่ระบบจะให้แบบฟอร์ม POST ในหน้าเข้าสู่ระบบจะถูกมองว่าเป็นความพยายามในการเข้าสู่ระบบและใช้ข้อมูล POST และใช้เพื่อเข้าสู่ระบบ

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

ฉันยังคงเรียนรู้ - หากคุณพบสิ่งที่ฉันพูดผิดโปรดแก้ไขฉันและถ้าคุณเรียนรู้เพิ่มเติมโพสต์กลับมาที่นี่ ขอบคุณ


2

เคล็ดลับที่ถูกต้องสำหรับการรักษาความปลอดภัยแอปพลิเคชันเว็บใด ๆ

หากคุณต้องการรักษาความปลอดภัยแอปพลิเคชันของคุณคุณควรเริ่มต้นอย่างแน่นอนด้วยการใช้ HTTPS แทน HTTPสิ่งนี้จะช่วยสร้างความมั่นใจในการสร้างช่องทางที่ปลอดภัยระหว่างคุณกับผู้ใช้ที่จะป้องกันไม่ให้ดมข้อมูลที่ส่งกลับไปยังผู้ใช้ แลกเปลี่ยนเป็นความลับ

คุณสามารถใช้ JWTs (JSON Web Tokens) เพื่อรักษาความปลอดภัย RESTful APIsซึ่งมีประโยชน์มากมายเมื่อเทียบกับเซสชันฝั่งเซิร์ฟเวอร์ประโยชน์ส่วนใหญ่:

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

2- เจดับบลิวทีมีอยู่ในตัวเองและมีการเรียกร้องที่กำหนดบทบาทของผู้ใช้เช่น & สิ่งที่เขาสามารถเข้าถึงและออก ณ วันที่ & วันหมดอายุ (หลังจากที่เจดับบลิวทีจะไม่ถูกต้อง)

3- ง่ายต่อการจัดการข้าม load balancer & หากคุณมีเซิร์ฟเวอร์ API หลายตัวเนื่องจากคุณไม่ต้องแชร์ข้อมูลเซสชันหรือกำหนดค่าเซิร์ฟเวอร์เพื่อกำหนดเส้นทางเซสชันไปยังเซิร์ฟเวอร์เดียวกันเมื่อใดก็ตามที่คำขอที่มี JWT เข้าชมเซิร์ฟเวอร์ใด ๆ & ได้รับอนุญาต

4- ลดแรงกดดันต่อฐานข้อมูลของคุณรวมถึงคุณไม่จำเป็นต้องจัดเก็บและรับรหัสเซสชันและข้อมูลสำหรับคำขอแต่ละครั้ง

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

ห้องสมุดหลายแห่งมีวิธีง่าย ๆ ในการสร้างและตรวจสอบ JWT ในภาษาการเขียนโปรแกรมส่วนใหญ่ตัวอย่างเช่น: ใน node.js หนึ่งในความนิยมมากที่สุดคือjsonwebtoken

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

สิ่งสำคัญที่ควรทราบคือคุณต้องส่ง JWT ให้กับลูกค้าอย่างปลอดภัยโดยใช้ HTTPS และบันทึกไว้ในที่ปลอดภัย (ตัวอย่างเช่นในที่จัดเก็บในตัวเครื่อง)

คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับ JWT ได้จากลิงค์นี้

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