การรับรองความถูกต้อง RESTful หมายถึงอะไรและทำงานอย่างไร ฉันไม่พบภาพรวมที่ดีใน Google ความเข้าใจเดียวของฉันคือคุณส่งคีย์เซสชั่น (remeberal) ใน URL แต่สิ่งนี้อาจผิดอย่างมาก
การรับรองความถูกต้อง RESTful หมายถึงอะไรและทำงานอย่างไร ฉันไม่พบภาพรวมที่ดีใน Google ความเข้าใจเดียวของฉันคือคุณส่งคีย์เซสชั่น (remeberal) ใน URL แต่สิ่งนี้อาจผิดอย่างมาก
คำตอบ:
วิธีจัดการกับการรับรองความถูกต้องในสถาปัตยกรรม RESTful ไคลเอนต์ - เซิร์ฟเวอร์เป็นเรื่องของการอภิปราย
โดยทั่วไปสามารถทำได้ใน SOA ผ่าน HTTP โลกผ่าน:
คุณจะต้องปรับหรือผสมผสานเทคนิคเหล่านั้นให้ดีขึ้นเพื่อให้เข้ากับสถาปัตยกรรมซอฟต์แวร์ของคุณอย่างดีที่สุด
แต่ละรูปแบบการรับรองความถูกต้องมีข้อดีและข้อเสียของตนเองขึ้นอยู่กับวัตถุประสงค์ของนโยบายความปลอดภัยและสถาปัตยกรรมซอฟต์แวร์ของคุณ
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×tamp=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 ที่เหมาะสมซึ่งเป็นสิ่งจำเป็นนอกเหนือไปจากรูปแบบการตรวจสอบความถูกต้องใด ๆ
Cookie
การแทนที่ที่ดีกว่าสำหรับHTTP Basic Auth
คุณสามารถทำการพิสูจน์ตัวตนแบบไร้สัญชาติอย่างแท้จริงด้วยวิธีการหมดอายุการรับรองความถูกต้องและความสามารถในการออกจากระบบ ตัวอย่างการใช้งานสามารถใช้คุกกี้ที่เรียกว่าEmulated-HTTP-Basic-Auth
มีค่าใกล้เคียงกับ Auth HTTP Basic จริงและในเวลาที่กำหนดนอกจากนี้ การออกจากระบบสามารถนำมาใช้โดยการลบคุกกี้นั้น ฉันเดาว่าไคลเอนต์ใด ๆ ที่สามารถรองรับ HTTP Basic Auth สามารถรองรับการรับรองความถูกต้องของคุกกี้ได้ด้วยวิธีนี้
Cookie
) สามารถใช้แทนได้
ฉันสงสัยว่าผู้คนตะโกน "HTTP Authentication" อย่างกระตือรือร้นเคยลองสร้างแอปพลิเคชั่นบนเบราว์เซอร์ (แทนที่จะเป็นบริการบนเว็บแบบเครื่องจักรถึงเครื่องจักร) ด้วย REST (ไม่มีความผิดที่ตั้งใจทำ - ฉันไม่คิดว่าพวกเขาจะเคยเจอปัญหาแทรกซ้อน) .
ปัญหาที่ฉันพบเมื่อใช้การพิสูจน์ตัวตน HTTP บนเซอร์วิส RESTful ที่สร้างเพจ HTML ที่จะดูในเบราว์เซอร์คือ:
บทความที่ชาญฉลาดอย่างมากที่จัดการกับประเด็นเหล่านี้ทีละจุดอยู่ที่นี่แต่สิ่งนี้ส่งผลให้แฮกเกอร์จาวาสคริปต์เฉพาะเบราว์เซอร์จำนวนมากวิธีแก้ปัญหาสำหรับการแก้ไขปัญหาและอื่น ๆ ดังนั้นจึงไม่รองรับการส่งต่อดังนั้นจะต้องมีการบำรุงรักษาอย่างต่อเนื่องเนื่องจากมีการเปิดตัวเบราว์เซอร์ใหม่ ฉันไม่คิดว่าการออกแบบที่สะอาดและชัดเจนรวมถึงฉันรู้สึกว่ามันเป็นงานพิเศษและปวดหัวมากเพื่อที่ฉันจะได้แสดงตราสัญลักษณ์ส่วนที่เหลือกับเพื่อนของฉันอย่างกระตือรือร้น
ฉันเชื่อว่าคุกกี้เป็นวิธีแก้ปัญหา แต่เดี๋ยวก่อนคุกกี้นั้นชั่วร้ายใช่ไหม ไม่พวกมันไม่ใช่วิธีที่คุกกี้ใช้กันบ่อยๆนั้นเป็นความชั่ว คุกกี้เป็นเพียงข้อมูลชิ้นส่วนของลูกค้าเช่นเดียวกับข้อมูลการตรวจสอบสิทธิ์ HTTP ที่เบราว์เซอร์จะติดตามในขณะที่คุณเรียกดู และข้อมูลฝั่งไคลเอ็นต์ชิ้นนี้จะถูกส่งไปยังเซิร์ฟเวอร์ทุกครั้งที่ร้องขออีกครั้งเช่นเดียวกับข้อมูลการตรวจสอบสิทธิ์ HTTP แนวคิดความแตกต่างเพียงอย่างเดียวคือเนื้อหาของสถานะฝั่งไคลเอ็นต์นี้สามารถกำหนดได้โดยเซิร์ฟเวอร์ซึ่งเป็นส่วนหนึ่งของการตอบสนอง
ด้วยการทำให้เซสชันเป็นทรัพยากรที่สงบด้วยกฎต่อไปนี้:
ความแตกต่างเพียงอย่างเดียวกับการตรวจสอบความถูกต้องของ HTTP ในตอนนี้คือรหัสการรับรองความถูกต้องถูกสร้างขึ้นโดยเซิร์ฟเวอร์และส่งไปยังไคลเอนต์ที่ส่งมันกลับมาเรื่อย ๆ แทนที่จะเป็นไคลเอนต์คำนวณจากข้อมูลประจำตัวที่ป้อน
converter42 เสริมว่าเมื่อใช้ https (ซึ่งเราควร) เป็นสิ่งสำคัญที่คุกกี้จะมีการตั้งค่าสถานะที่ปลอดภัยเพื่อให้ข้อมูลการรับรองความถูกต้องจะไม่ส่งผ่านการเชื่อมต่อที่ไม่ปลอดภัย จุดที่ดีไม่ได้เห็นมันด้วยตัวเอง
ฉันรู้สึกว่านี่เป็นทางออกที่เพียงพอที่ทำงานได้ดี แต่ฉันต้องยอมรับว่าฉันไม่เพียงพอที่จะรู้ว่าผู้เชี่ยวชาญด้านความปลอดภัยสามารถระบุช่องโหว่ที่อาจเกิดขึ้นได้ในโครงการนี้ - ทั้งหมดที่ฉันรู้ก็คือ โปรโตคอลการเข้าสู่ระบบ ($ _SESSION ใน PHP, HttpSession ใน Java EE และอื่น ๆ ) เนื้อหาส่วนหัวของคุกกี้นั้นใช้เพื่อจัดการกับทรัพยากรฝั่งเซิร์ฟเวอร์เช่นเดียวกับภาษาที่ยอมรับได้อาจถูกใช้เพื่อเข้าถึงทรัพยากรการแปลเป็นต้น ฉันรู้สึกว่ามันเหมือนกัน แต่คนอื่นอาจจะไม่? คุณคิดว่าไงครับ
เพียงพอแล้วมีการพูดในหัวข้อนี้โดยคนดีที่นี่ แต่นี่คือ 2 เซ็นต์ของฉัน
การโต้ตอบมี 2 โหมด:
เครื่องจักรเป็นตัวส่วนร่วมซึ่งแสดงเป็น REST APIs และนักแสดง / ลูกค้าที่เป็นมนุษย์หรือเครื่องจักร
ตอนนี้ในสถาปัตยกรรมที่สงบเงียบอย่างแท้จริงแนวคิดเกี่ยวกับการไร้สัญชาติก็หมายความว่าสถานะแอปพลิเคชันที่เกี่ยวข้องทั้งหมด (หมายถึงสถานะฝั่งไคลเอ็นต์) จะต้องได้รับการร้องขอทุกครั้ง ตามความเกี่ยวข้องหมายความว่าอะไรก็ตามที่ REST API ต้องการในการประมวลผลคำขอและตอบสนองที่เหมาะสม
เมื่อเราพิจารณาสิ่งนี้ในบริบทของแอปพลิเคชันที่มนุษย์เป็นเครื่อง "เบราว์เซอร์" ตามที่ Skrebbel กล่าวไว้ข้างต้นนี่หมายความว่าแอปพลิเคชัน (เว็บ) ที่ทำงานในเบราว์เซอร์จะต้องส่งสถานะและข้อมูลที่เกี่ยวข้อง มันทำกับ back end REST APIs
พิจารณาสิ่งนี้: คุณมีแพลตฟอร์มข้อมูล / ข้อมูลที่เปิดเผยของ REST API บางทีคุณอาจมีแพลตฟอร์ม BI แบบบริการตนเองที่จัดการคิวข้อมูลทั้งหมด แต่คุณต้องการให้ลูกค้า (คน) ของคุณเข้าถึงสิ่งนี้ผ่านทาง (1) เว็บแอป (2) แอพมือถือและ (3) แอปพลิเคชันบุคคลที่สามบางส่วน ในที่สุดโซ่ของ MTM ก็นำไปสู่ HTM ได้ดี ดังนั้นผู้ใช้มนุษย์ยังคงอยู่ที่จุดสูงสุดของห่วงโซ่ข้อมูล
ใน 2 กรณีแรกคุณมีกรณีสำหรับการโต้ตอบระหว่างมนุษย์กับเครื่องข้อมูลที่ผู้ใช้มนุษย์ใช้จริง ในกรณีสุดท้ายคุณมีโปรแกรมเครื่องที่ใช้ REST API
แนวคิดของการรับรองความถูกต้องนำไปใช้ทั่วกระดาน คุณจะออกแบบสิ่งนี้อย่างไรเพื่อให้ REST APIs ของคุณเข้าถึงได้อย่างปลอดภัยและสม่ำเสมอ? วิธีที่ฉันเห็นสิ่งนี้มี 2 วิธี:
วิธีที่ 1:
วิธีที่ 2:
เห็นได้ชัดว่าใน 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 ของคุณคุณก็ทำงานของคุณ
Way-3
วิธีไฮบริด ลูกค้าเข้าสู่ระบบในWay-2
แต่ในขณะที่ในWay-1
หนังสือรับรองไม่ได้ตรวจสอบกับสถานะด้านเซิร์ฟเวอร์ใด ๆ Way-2
โดยไม่คำนึงถึงโทเค็นการรับรองความถูกต้องถูกสร้างขึ้นและส่งกลับไปยังลูกค้าในขณะที่ โทเค็นนี้จะถูกตรวจสอบเพื่อความถูกต้องในภายหลังโดยใช้ asymmetric crypto โดยไม่ต้องมองหาสถานะของลูกค้า
นี่คือโซลูชันการรับรองความถูกต้อง RESTful ที่แท้จริงและสมบูรณ์:
เมื่อลูกค้ารับรองความถูกต้อง:
3.1 ออกโทเค็นซึ่งมีสิ่งต่อไปนี้:
3.2 เข้ารหัสโทเค็นด้วยคีย์ส่วนตัว
3.3 ส่งโทเค็นเข้ารหัสกลับไปยังผู้ใช้
เมื่อผู้ใช้เข้าถึง API ใด ๆ พวกเขาจะต้องผ่านการตรวจสอบความถูกต้องของโทเค็นด้วย
นี่คือการพิสูจน์ตัวตนแบบไร้สัญชาติ / RESTful
โปรดทราบว่าหากมีการแฮชรหัสผ่านผู้ใช้จะส่งรหัสผ่านที่ไม่ได้เข้ารหัสพร้อมกับโทเค็นการตรวจสอบสิทธิ์ด้วย เซิร์ฟเวอร์สามารถตรวจสอบว่ารหัสผ่านตรงกับรหัสผ่านที่ใช้ในการสร้างโทเค็นการตรวจสอบความถูกต้องโดยการเปรียบเทียบแฮช การเชื่อมต่อที่ปลอดภัยโดยใช้บางอย่างเช่น HTTPS เป็นสิ่งจำเป็น Javascript ทางฝั่งไคลเอ็นต์สามารถจัดการกับการรับรหัสผ่านของผู้ใช้และเก็บไว้ในฝั่งไคลเอ็นต์ไม่ว่าในหน่วยความจำหรือในคุกกี้อาจเข้ารหัสด้วยกุญแจสาธารณะของเซิร์ฟเวอร์
การซื่อสัตย์กับคุณฉันได้เห็นคำตอบที่ดีที่นี่ แต่สิ่งที่รบกวนฉันเล็กน้อยคือเมื่อมีคนจะนำแนวคิดไร้สัญชาติทั้งหมดไปสู่จุดที่มันกลายเป็นดันทุรัง มันทำให้ฉันนึกถึงแฟน ๆ ของสมอลล์ทอล์คผู้เก่าที่ต้องการโอบกอด OO บริสุทธิ์และถ้ามีอะไรบางอย่างไม่ใช่วัตถุคุณก็ทำผิด ให้ฉันได้พัก.
วิธีสงบควรจะทำให้ชีวิตของคุณง่ายขึ้นและลดค่าใช้จ่ายและค่าใช้จ่ายของเซสชันพยายามที่จะทำตามที่มันเป็นสิ่งที่ฉลาดที่จะทำ แต่นาทีที่คุณทำตามวินัย (วินัย / แนวทางใด ๆ ) ถึงที่สุด ไม่ให้ประโยชน์ตามที่ตั้งใจไว้อีกต่อไปแล้วคุณจะทำผิด ภาษาที่ดีที่สุดบางภาษาในปัจจุบันมีทั้งการเขียนโปรแกรมใช้งานและการวางแนววัตถุ
หากวิธีที่ง่ายที่สุดสำหรับคุณในการแก้ไขปัญหาของคุณคือการจัดเก็บรหัสการรับรองความถูกต้องในคุกกี้และส่งไปที่ส่วนหัว HTTP จากนั้นให้ทำเพียงแค่ไม่ทำผิดกฎ โปรดจำไว้ว่าเซสชันนั้นไม่ดีเมื่อมันหนักและใหญ่ถ้าเซสชันทั้งหมดของคุณประกอบด้วยสตริงสั้น ๆ ที่มีคีย์ดังนั้นเรื่องใหญ่คืออะไร
ฉันเปิดให้ยอมรับการแก้ไขในความคิดเห็น แต่ฉันไม่เห็นจุด (จนถึง) ในการทำให้ชีวิตของเรามีความสุขเพียงหลีกเลี่ยงการเก็บพจนานุกรมใหญ่ของแฮชในเซิร์ฟเวอร์ของเรา
สิ่งแรกและสำคัญที่สุดบริการบนเว็บที่สงบเงียบคือSTATELESS (หรือกล่าวอีกนัยหนึ่งคือSESSIONLESS)) ดังนั้นบริการ RESTful จึงไม่มีและไม่ควรมีแนวคิดเกี่ยวกับเซสชันหรือคุกกี้ที่เกี่ยวข้อง วิธีการตรวจสอบความถูกต้องหรือการอนุญาตในบริการ RESTful คือการใช้ส่วนหัว HTTP Authorization ตามที่กำหนดไว้ในข้อกำหนด RFC 2616 HTTP ทุกคำขอเดียวควรมีส่วนหัว HTTP Authorization และควรส่งคำขอผ่านการเชื่อมต่อ HTTP (SSL) นี่เป็นวิธีที่ถูกต้องในการตรวจสอบความถูกต้องและเพื่อตรวจสอบการอนุญาตในคำขอใช้บริการเว็บ HTTP RESTful ฉันได้ติดตั้งบริการเว็บสงบสำหรับแอปพลิเคชัน Cisco PRIME Performance Manager ที่ Cisco Systems และเป็นส่วนหนึ่งของบริการเว็บนั้นฉันได้ใช้การพิสูจน์ตัวตน / การอนุญาตด้วย
ไม่แน่นอนเกี่ยวกับ "คีย์เซสชัน" เนื่องจากโดยทั่วไปใช้เพื่ออ้างถึงการตรวจสอบสิทธิ์เซสชันซึ่งดำเนินการภายใต้ข้อ จำกัด ทั้งหมดของ REST การร้องขอแต่ละครั้งจะอธิบายด้วยตนเองโดยมีข้อมูลเพียงพอที่จะอนุญาตการร้องขอด้วยตนเองโดยไม่มีสถานะแอปพลิเคชันฝั่งเซิร์ฟเวอร์
วิธีที่ง่ายที่สุดที่จะเข้าใกล้นี้โดยเริ่มต้นด้วย HTTP ในตัวกลไกการตรวจสอบในRFC 2617
บทความ 'ลึกซึ้งมาก' ที่กล่าวถึงโดย @skrebel ( http://www.berenddeboer.net/rest/authentication.html ) กล่าวถึงวิธีการตรวจสอบที่ซับซ้อน แต่แตกหักจริงๆ
คุณอาจลองไปที่หน้า (ซึ่งควรจะดูได้เฉพาะผู้ใช้ที่ผ่านการตรวจสอบแล้ว) http://www.berenddeboer.net/rest/site/authenticated.htmlโดยไม่มีข้อมูลการเข้าสู่ระบบใด ๆ
(ขออภัยฉันไม่สามารถออกความเห็นในคำตอบ)
ฉันจะบอกว่าส่วนที่เหลือและรับรองความถูกต้องก็ไม่ได้ผสม REST หมายถึงไร้สัญชาติ แต่ 'รับรองความถูกต้อง' เป็นสถานะ คุณไม่สามารถมีทั้งสองอย่างในเลเยอร์เดียวกัน หากคุณเป็นผู้สนับสนุน RESTful และขมวดคิ้วต่อรัฐคุณต้องไปกับ HTTPS (เช่นปล่อยปัญหาด้านความปลอดภัยไปยังเลเยอร์อื่น)
ฉันคิดว่าการรับรองความถูกต้องที่เกี่ยวข้องกับการผ่านโทเค็นการรับรองความถูกต้องเป็นพารามิเตอร์ในคำขอ ตัวอย่างการใช้ apikeys โดย api ฉันไม่เชื่อว่าการใช้คุกกี้หรือ http auth ผ่านการรับรอง
วิธีการที่กล่าวก่อนหน้านี้ด้านล่างเป็นหลัก "รหัสผ่านเจ้าของทรัพยากร Credential" ประเภททุนของOAuth2.0 นี่เป็นวิธีที่ง่ายในการเริ่มต้นใช้งาน อย่างไรก็ตามด้วยวิธีนี้ทุกแอปพลิเคชันในองค์กรจะจบลงด้วยกลไกการพิสูจน์ตัวตนและการอนุญาต วิธีการที่แนะนำคือประเภทการอนุญาต "รหัสอนุญาต" นอกจากนี้ในคำตอบก่อนหน้าของฉันด้านล่างฉันแนะนำเบราว์เซอร์ localStorage สำหรับการจัดเก็บโทเค็นรับรองความถูกต้อง อย่างไรก็ตามฉันเชื่อว่าคุกกี้เป็นตัวเลือกที่เหมาะสมสำหรับวัตถุประสงค์นี้ ฉันมีรายละเอียดเหตุผลของฉันวิธีการใช้งานประเภทการให้สิทธิ์รหัสการพิจารณาความปลอดภัย ฯลฯ ในคำตอบ StackOverflowนี้
ฉันคิดว่าวิธีการต่อไปนี้สามารถใช้สำหรับการรับรองความถูกต้องของบริการ REST:
ด้วยวิธีการนี้เรากำลังทำการดำเนินการที่มีราคาแพงในการโหลดแคชพร้อมรายละเอียดการเข้าถึงเฉพาะของผู้ใช้ทุก ๆ 30 นาที ดังนั้นหากมีการเพิกถอนการเข้าถึงหรือการอนุญาตให้เข้าถึงใหม่จะใช้เวลา 30 นาทีในการสะท้อนกลับหรือออกจากระบบตามด้วยการเข้าสู่ระบบ
นั่นคือวิธีที่จะทำ: การใช้ OAuth 2.0 สำหรับเข้าสู่ระบบ
คุณสามารถใช้วิธีการรับรองความถูกต้องอื่น ๆ ตามด้วย Google ตราบเท่าที่รองรับ OAuth
การใช้พับลิกคีย์สาธารณะซึ่งการลงทะเบียนคีย์เกี่ยวข้องกับการเชื่อมโยงที่เหมาะสมทำให้แน่ใจว่าคีย์สาธารณะนั้นถูกผูกไว้กับบุคคลที่คีย์นั้นกำหนดให้ในลักษณะที่รับรองว่าจะไม่ปฏิเสธ
ดูhttp://en.wikipedia.org/wiki/Public_key_infrastructure หากคุณปฏิบัติตามมาตรฐาน PKI ที่เหมาะสมบุคคลหรือตัวแทนที่ใช้รหัสที่ถูกขโมยอย่างไม่เหมาะสมจะสามารถระบุและล็อคได้ ถ้าเอเจนต์จำเป็นต้องใช้ใบรับรองการผูกจะค่อนข้างแน่น ขโมยที่ฉลาดและเคลื่อนไหวเร็วสามารถหลบหนีได้ แต่พวกมันจะทิ้งเศษขยะเพิ่มขึ้น
เพื่อตอบคำถามนี้จากความเข้าใจของฉัน ...
ระบบการพิสูจน์ตัวตนที่ใช้ 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 ที่แมปกับความหมายของฐานข้อมูลแล้วสร้างระบบการรับรองความถูกต้องโดยที่คุณไม่จำเป็นต้องส่งรหัสเซสชันหรือแทร็กเซสชันใด ๆ
ฉันยังคงเรียนรู้ - หากคุณพบสิ่งที่ฉันพูดผิดโปรดแก้ไขฉันและถ้าคุณเรียนรู้เพิ่มเติมโพสต์กลับมาที่นี่ ขอบคุณ
เคล็ดลับที่ถูกต้องสำหรับการรักษาความปลอดภัยแอปพลิเคชันเว็บใด ๆ
หากคุณต้องการรักษาความปลอดภัยแอปพลิเคชันของคุณคุณควรเริ่มต้นอย่างแน่นอนด้วยการใช้ 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 ได้จากลิงค์นี้