403 ต้องห้าม vs 401 การตอบกลับ HTTP ที่ไม่ได้รับอนุญาต


2782

สำหรับหน้าเว็บที่มีอยู่ แต่ผู้ใช้ไม่มีสิทธิ์เพียงพอ (ไม่ได้ล็อกอินหรือไม่ได้อยู่ในกลุ่มผู้ใช้ที่เหมาะสม) การตอบสนอง HTTP ที่เหมาะสมในการแสดงคืออะไร?

401 Unauthorized?
403 Forbidden?
อื่น ๆ อีก?

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


358
401 'ไม่ได้รับอนุญาต' ควรเป็น 401 'ไม่ได้รับการรับรองความถูกต้อง' แก้ไขปัญหาแล้ว!
Christophe Roussy

47
ฉันจำไม่ได้ว่าฉันและเพื่อนร่วมงานของฉันกลับมาที่ stackoverflow สำหรับคำถามนี้กี่ครั้ง บางทีมาตรฐาน HTTP ควรพิจารณาการปรับเปลี่ยนชื่อหรือคำอธิบายสำหรับ 401 และ 403
neurite

อันที่จริงฉันได้รับข้อผิดพลาดนี้ในเวอร์ชันอื่น เช่น "os_authType คือ 'any' และมีการส่งคุกกี้ที่ไม่ถูกต้อง" ดังนั้นจึงไม่สามารถหาวิธีแก้ปัญหานั้นได้ Googled ใช้เวลามากรับเหตุผล แต่ไม่ได้รับการแก้ไข
Sandeep Anand

@Qwerty no RFC7231 ใหม่นั้นล้าสมัย RFC2616 403 มีความหมายแตกต่างกันในขณะนี้
ก้างปลา

1
@fishbone คุณยังไม่ทราบว่ารหัสสถานะ 401 ถูกลบออกจาก RFC นั้น: D
Barkermn01

คำตอบ:


4112

คำอธิบายที่ชัดเจนจากDaniel Irvine :

มีปัญหากับ401 Unauthorized , รหัสสถานะ HTTP สำหรับข้อผิดพลาดในการตรวจสอบสิทธิ์ และนั่นเป็นเพียง: สำหรับการรับรองความถูกต้องไม่ได้รับอนุญาต การรับการตอบกลับ 401 เป็นเซิร์ฟเวอร์ที่บอกคุณว่า“ คุณไม่ได้รับการรับรองความถูกต้อง - ไม่ได้รับการรับรองความถูกต้องทั้งหมดหรือรับรองความถูกต้องไม่ถูกต้อง - แต่โปรดตรวจสอบสิทธิ์อีกครั้งแล้วลองอีกครั้ง " เพื่อช่วยให้คุณมีส่วนหัวWWW-Authenticateที่อธิบายวิธีการตรวจสอบสิทธิ์เสมอ

นี่เป็นคำตอบที่เว็บเซิร์ฟเวอร์ของคุณส่งกลับไม่ใช่เว็บแอปพลิเคชันของคุณ

มันเป็นอะไรที่ชั่วคราวมาก เซิร์ฟเวอร์ขอให้คุณลองอีกครั้ง

ดังนั้นสำหรับการให้สิทธิ์ฉันใช้403 Forbidden response มันถาวรมันเชื่อมโยงกับตรรกะแอปพลิเคชันของฉันและเป็นการตอบสนองที่เป็นรูปธรรมมากกว่า 401

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

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

อีกรูปแบบภาพที่ดีของวิธีการใช้รหัสสถานะ http

ป้อนคำอธิบายรูปภาพที่นี่


43
ข้อความ IIS 403 เริ่มต้นคือ "นี่เป็นข้อผิดพลาดทั่วไป 403 และหมายความว่าผู้ใช้ที่ผ่านการรับรองความถูกต้องจะไม่ได้รับอนุญาตให้ดูหน้า" ซึ่งดูเหมือนว่าจะเห็นด้วย
Ben Challenor

333
@JPReddy คำตอบของคุณถูกต้อง อย่างไรก็ตามฉันคาดหวังว่า 401 จะมีชื่อว่า "Unauthenticated" และ 403 เป็นชื่อ "Unauthorized" มันค่อนข้างสับสนว่า 401 ซึ่งเกี่ยวข้องกับการพิสูจน์ตัวตนมีรูปแบบของข้อความ "ไม่ได้รับอนุญาต" .... นอกจากว่าฉันไม่เก่งภาษาอังกฤษ (ซึ่งค่อนข้างเป็นไปได้)
p.matsinopoulos

64
@ZaidMasud ตาม RFC การตีความนี้ไม่ถูกต้อง คำตอบของ Cumbayah ทำให้ถูกต้อง 401 หมายความว่า "คุณไม่มีสิทธิ์ที่ถูกต้อง" มันหมายถึง "ถ้าคุณต้องการคุณอาจลองพิสูจน์ตัวเอง" ดังนั้นทั้งลูกค้าที่ไม่ได้ตรวจสอบตัวเองอย่างถูกต้องและลูกค้าที่ขาดการรับรองความถูกต้องจะได้รับ 401 403 หมายถึง "ฉันจะไม่ตอบคำถามนี้ไม่ว่าคุณจะเป็นใคร" RFC ระบุไว้อย่างชัดเจนว่า "การอนุญาตจะไม่ช่วย" ในกรณีของ 403
Davide R.

84
401 คือข้อผิดพลาดการรับรองความถูกต้อง 403 เป็นข้อผิดพลาดการอนุญาต เรียบง่ายเหมือนที่
Shahriyar Imanov

30
คุณออกจาก "นั่นคือมุมมองของฉันต่อไป :)" เมื่อคัดลอกจากโพสต์บล็อกของเขาและน่าเสียดายที่มุมมองของเขาผิด ตามที่คนอื่น ๆ ระบุไว้ 403 หมายความว่าคุณไม่สามารถเข้าถึงทรัพยากรได้ไม่ว่าคุณจะได้รับการรับรองความถูกต้องเป็นใคร ฉันมักจะใช้รหัสสถานะนี้สำหรับทรัพยากรที่ถูกล็อคโดยช่วงที่อยู่ IP หรือไฟล์ใน webroot ของฉันที่ฉันไม่ต้องการเข้าถึงโดยตรง (เช่นสคริปต์ต้องให้บริการ)
Kyle

402

ดูRFC2616 :

401 ไม่ได้รับอนุญาต:

หากคำร้องขอนั้นมีข้อมูลประจำตัวการอนุญาตแล้วการตอบสนอง 401 บ่งชี้ว่าการอนุญาตนั้นถูกปฏิเสธสำหรับข้อมูลรับรองเหล่านั้น

403 ต้องห้าม:

เซิร์ฟเวอร์เข้าใจคำขอ แต่ปฏิเสธที่จะปฏิบัติตาม

ปรับปรุง

จากกรณีการใช้งานของคุณปรากฏว่าผู้ใช้ไม่ได้รับการตรวจสอบความถูกต้อง ฉันจะกลับ 401


แก้ไข: RFC2616เป็นล้าสมัยดูRFC7231และRFC7235


21
ขอบคุณที่ช่วยอธิบายให้ฉัน ฉันใช้ทั้งคู่ - 401 สำหรับผู้ใช้ที่ไม่ผ่านการรับรองความถูกต้อง, 403 สำหรับผู้ใช้ที่ผ่านการรับรองความถูกต้องโดยมีสิทธิ์ไม่เพียงพอ
VirtuosiMedia

52
ฉันไม่ได้ลงคะแนน แต่ฉันพบคำตอบนี้ค่อนข้างทำให้เข้าใจผิด 403 ต้องห้ามถูกนำมาใช้อย่างเหมาะสมมากขึ้นในเนื้อหาที่จะไม่แสดง (เช่นไฟล์. config ใน asp.net) อย่างใดอย่างหนึ่งหรือ 404 imho มันจะไม่เหมาะสมที่จะกลับ 403 สำหรับสิ่งที่สามารถเข้าถึงได้ แต่คุณก็ไม่ได้มีสิทธิที่ถูกต้อง โซลูชันของฉันจะให้ข้อความที่ถูกปฏิเสธการเข้าถึงด้วยวิธีการเปลี่ยนข้อมูลประจำตัว ที่หรือ 401
เมล

27
"การตอบสนองต้องรวมฟิลด์ส่วนหัว WWW- รับรองความถูกต้อง (ส่วน 14.47) ที่มีความท้าทายที่เกี่ยวข้องกับทรัพยากรที่ร้องขอ" ดูเหมือนว่าหากคุณไม่ต้องการใช้การพิสูจน์ตัวตน HTTP สไตล์รหัสตอบกลับ 401 ไม่เหมาะสม
Brilliand

8
ฉันจะกลับ Billiand ที่นี่ คำสั่งคือ "ถ้าคำขอรวมข้อมูลรับรองสิทธิ์แล้ว" ซึ่งหมายความว่าหากนี่คือการตอบสนองจากคำขอที่ให้ข้อมูลประจำตัว (เช่นการตอบสนองจากความพยายามในการรับรองความถูกต้อง RFC2617) โดยพื้นฐานแล้วการอนุญาตให้เซิร์ฟเวอร์บอกว่า "คู่บัญชี / รหัสผ่านไม่ถูกต้องลองอีกครั้ง" ในคำถามที่โพสต์ผู้ใช้จะได้รับการพิสูจน์ตัวจริง แต่ไม่ได้รับอนุญาต 401 ไม่เคยตอบสนองที่เหมาะสมสำหรับสถานการณ์เหล่านั้น
ldrut

6
Brilliand ถูกต้อง 401 เหมาะสำหรับการตรวจสอบสิทธิ์ HTTP เท่านั้น
Juampi

296

สิ่งที่คำตอบอื่น ๆ หายไปคือต้องเข้าใจว่าการรับรองความถูกต้องและการอนุญาตในบริบทของ RFC 2616 อ้างถึงโปรโตคอล HTTP Authentication ของ RFC 2617 เท่านั้นการรับรองความถูกต้องโดยแบบแผนภายนอกของ RFC2617 ไม่ได้รับการสนับสนุนในรหัสสถานะ HTTP และไม่พิจารณา เมื่อตัดสินใจว่าจะใช้ 401 หรือ 403

บทสรุปและ Terse

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

หมายความว่าหากคุณมีกระบวนการเข้าสู่ระบบของคุณเองและไม่เคยใช้การรับรองความถูกต้องของ HTTP 403 เป็นคำตอบที่เหมาะสมเสมอและไม่ควรใช้ 401

รายละเอียดและในเชิงลึก

จาก RFC2616

10.4.2 401 ไม่ได้รับอนุญาต

คำขอต้องมีการตรวจสอบผู้ใช้ การตอบสนองต้องมีฟิลด์ส่วนหัว WWW-Authenticate (ส่วน 14.47) ที่มีความท้าทายที่เกี่ยวข้องกับทรัพยากรที่ร้องขอ ไคลเอนต์อาจทำซ้ำการร้องขอด้วยฟิลด์หัวข้อการอนุญาตที่เหมาะสม (ส่วน 14.8)

และ

10.4.4 403 ต้องห้ามเซิร์ฟเวอร์เข้าใจคำขอ แต่ปฏิเสธที่จะทำตาม การอนุญาตจะไม่ช่วยและคำขอจะไม่ถูกทำซ้ำ

สิ่งแรกที่ต้องจำไว้คือ "การรับรองความถูกต้อง" และ "การอนุญาต" ในบริบทของเอกสารนี้อ้างอิงถึงโปรโตคอล HTTP Authentication จาก RFC 2617 โดยเฉพาะพวกเขาไม่ได้อ้างถึงโปรโตคอลการตรวจสอบสิทธิ์แบบม้วนของคุณเองที่คุณอาจสร้างขึ้น ใช้หน้าเข้าสู่ระบบ ฯลฯ ฉันจะใช้ "เข้าสู่ระบบ" เพื่ออ้างถึงการตรวจสอบและการอนุญาตโดยวิธีการอื่นนอกเหนือจาก RFC2617

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

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

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


แก้ไข: RFC2616เป็นล้าสมัยดูRFC7231และRFC7235


7
ดังนั้นเราควรทำอย่างไรเมื่อผู้ใช้ร้องขอหน้าเว็บที่ต้องมีการรับรองความถูกต้องที่ไม่ใช่ http ส่งรหัสสถานะ 403 หรือไม่
marcovtwout

2
นี่คือคำตอบที่ตอบคำถามของฉันเกี่ยวกับความแตกต่าง
Patrick

9
สิ่งนี้มีความสำคัญ: "ถ้าคุณมีกระบวนการเข้าสู่ระบบของคุณเองและไม่เคยใช้การรับรองความถูกต้องของ HTTP 403 จะตอบสนองที่เหมาะสมเสมอและไม่ควรใช้ 401"
ggg

1
@marcovtwout ส่ง 302 ไปยังหน้าเข้าสู่ระบบของคุณหรือ 403 ที่มีเนื้อหาพร้อมข้อมูลวิธีการลงชื่อเข้าใช้หรือไม่
อเล็กซ์

4
RFC7235 ไม่ได้จัดให้มี "ความท้าทายของคุณเอง" หรือการตรวจสอบสิทธิ์แบบอื่นหรือไม่? ทำไมขั้นตอนการลงชื่อเข้าใช้ของแอพไม่สามารถแสดงความท้าทายในรูปแบบWWW-Authenticateส่วนหัวได้ แม้ว่าเบราว์เซอร์จะไม่สนับสนุนแอป React ของฉันก็สามารถ ...
jchook

127
  + -----------------------
  | มีทรัพยากรออกมา? (ถ้าเป็นส่วนตัวก็มักจะตรวจสอบหลังจากตรวจสอบรับรองความถูกต้อง)
  + -----------------------
    | |
 ไม่ v ใช่
    v + -----------------------
   404 | เข้าสู่ระบบหรือไม่ (รับรองความถูกต้อง, aka มีเซสชันหรือคุกกี้ JWT)
   หรือ + -----------------------
   401 | |
   403 NO | | ใช่
   3xx vv
              401 + -----------------------
       (404 ไม่เปิดเผย) สามารถเข้าถึงทรัพยากรได้หรือไม่ (การอนุญาต, ผู้มีอำนาจ, ... )
              หรือ + -----------------------
             เปลี่ยนเส้นทาง | |
             เพื่อเข้าสู่ระบบ NO | | ใช่
                               | |
                               VV
                               403 ตกลง 200 เปลี่ยนเส้นทาง ...
                      (หรือ 404: ไม่เปิดเผย)
                      (หรือ 404: ทรัพยากรไม่มีอยู่ถ้าเป็นส่วนตัว)
                      (หรือ 3xx: การเปลี่ยนเส้นทาง)

เช็คมักจะทำตามคำสั่งนี้:

  • 404 ถ้าทรัพยากรเป็นสาธารณะและไม่มีอยู่หรือเปลี่ยนเส้นทาง 3xx
  • มิฉะนั้น:
  • 401 ถ้าไม่ได้เข้าสู่ระบบหรือเซสชันหมดอายุ
  • 403 หากผู้ใช้ไม่ได้รับอนุญาตให้เข้าถึงทรัพยากร (ไฟล์, json, ... )
  • 404 ถ้าทรัพยากรไม่มีอยู่หรือไม่เต็มใจเปิดเผยอะไรเลยหรือเปลี่ยนเส้นทาง 3xx

ไม่ได้รับอนุญาต : รหัสสถานะ (401) ที่ระบุว่าคำขอต้องการการรับรองความถูกต้องซึ่งปกติหมายถึงผู้ใช้จำเป็นต้องเข้าสู่ระบบ (เซสชัน) ผู้ใช้ / ตัวแทนไม่รู้จักโดยเซิร์ฟเวอร์ สามารถทำซ้ำกับข้อมูลประจำตัวอื่น ๆ หมายเหตุ: สิ่งนี้ทำให้เกิดความสับสนเนื่องจากควรมีชื่อ 'ไม่ได้รับการรับรองความถูกต้อง' แทน 'ไม่ได้รับอนุญาต' สิ่งนี้สามารถเกิดขึ้นได้หลังจากเข้าสู่ระบบหากเซสชันหมดอายุ กรณีพิเศษ: สามารถใช้แทน 404 เพื่อหลีกเลี่ยงการแสดงตนหรือไม่ปรากฏตัวของทรัพยากร (สินเชื่อ @gingerCodeNinja)

FORBIDDEN : รหัสสถานะ (403) ที่ระบุว่าเซิร์ฟเวอร์เข้าใจคำขอ แต่ปฏิเสธที่จะปฏิบัติตาม ผู้ใช้ / ตัวแทนที่รู้จักกันโดยเซิร์ฟเวอร์ แต่มีข้อมูลประจำตัวที่ไม่เพียงพอ คำขอทำซ้ำจะไม่ทำงานจนกว่าข้อมูลรับรองจะเปลี่ยนแปลงซึ่งไม่น่าเป็นไปได้มากในช่วงเวลาสั้น ๆ กรณีพิเศษ: สามารถใช้แทน 404 เพื่อหลีกเลี่ยงการแสดงตนหรือไม่ปรากฏตัวของทรัพยากร (สินเชื่อ @gingerCodeNinja)

ไม่พบ : รหัสสถานะ (404) ระบุว่าทรัพยากรที่ร้องขอไม่สามารถใช้ได้ รู้จักผู้ใช้ / เอเจนต์ แต่เซิร์ฟเวอร์จะไม่เปิดเผยอะไรเกี่ยวกับทรัพยากรทำราวกับว่าไม่มีอยู่ การทำซ้ำจะไม่ทำงาน นี่คือการใช้งานพิเศษ 404 (ตัวอย่างเช่น GitHub)

ดังที่ @ChrisH มีตัวเลือกสำหรับการเปลี่ยนเส้นทาง 3xx (301, 302, 303, 307 หรือไม่เปลี่ยนเส้นทางเลยและใช้ 401):


ตัวอย่างเช่นฉันได้เข้าสู่ระบบและฉันสามารถเข้าถึงหน้า แต่ไม่ได้รับอนุญาตเปิดใช้งานสำหรับฉัน รหัสสถานะใดจะส่งคืน
barteloma

@bookmarker การเข้าสู่ระบบเรียกว่าการรับรองความถูกต้องซึ่งเป็นขั้นตอนแรก ดังนั้นหากคุณไม่มีสิทธิ์หลังจากเข้าสู่ระบบคุณจะได้รับ 403 สิ่งต้องห้าม (ข้อมูลรับรองไม่เพียงพอหมายความว่าคุณมีสิทธิ์ไม่เพียงพอ)
Christophe Roussy

3
คำอธิบายที่ชัดเจนและเรียบง่าย สิ่งที่ฉันต้องการ
Estevez

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

1
@MattKocaj โปรดทราบว่าno revealบางครั้งกรณีนี้สามารถตรวจจับได้ผ่านความแตกต่างของเวลาเล็กน้อยและไม่ควรมองว่าเป็นคุณลักษณะด้านความปลอดภัยมันอาจทำให้ผู้โจมตีช้าลงหรือช่วยรักษาความเป็นส่วนตัวเล็กน้อย
Christophe Roussy

113

ตามRFC 2616 (HTTP / 1.1) 403 จะถูกส่งเมื่อ:

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

กล่าวอีกนัยหนึ่งหากลูกค้าสามารถเข้าถึงทรัพยากรโดยการตรวจสอบสิทธิ์ควรส่ง 401


5
และถ้ามันไม่ชัดเจนว่าพวกเขาสามารถเข้าถึงหรือไม่? บอกว่าฉันมี 3 ระดับผู้ใช้ - สาธารณะสมาชิกและสมาชิกพรีเมี่ยม สมมติว่าหน้านี้มีไว้สำหรับสมาชิกพรีเมี่ยมเท่านั้น ผู้ใช้สาธารณะโดยทั่วไปจะไม่ได้รับการรับรองและอาจเป็นสมาชิกหรือสมาชิกพรีเมี่ยมเมื่อพวกเขาเข้าสู่ระบบสำหรับระดับผู้ใช้สมาชิก 403 จะดูเหมาะสม สำหรับสมาชิกพรีเมี่ยม 401 แต่คุณให้บริการสาธารณะอะไร
VirtuosiMedia

27
imho นี่เป็นคำตอบที่ถูกต้องที่สุด มันขึ้นอยู่กับแอปพลิเคชัน แต่โดยทั่วไปหากผู้ใช้ที่ผ่านการตรวจสอบแล้วไม่มีสิทธิ์เพียงพอในทรัพยากรคุณอาจต้องการเปลี่ยนวิธีการรับรองหรือส่ง 401 ฉันคิดว่า 403 เหมาะที่สุดสำหรับเนื้อหาที่ไม่เคยแสดง ใน asp.net นี่จะหมายถึงไฟล์ web.config * .resx และอื่น ๆ เพราะไม่ว่าผู้ใช้จะเข้าสู่ระบบใดไฟล์เหล่านี้จะไม่ถูกนำมาใช้ดังนั้นจึงไม่มีประเด็นในการลองอีกครั้ง
Mel

6
+1 แต่ +1 ไม่แน่นอน ข้อสรุปเชิงตรรกะคือไม่ควรคืน 403 เนื่องจาก 401 หรือ 404 จะเป็นการตอบสนองที่ดีกว่าอย่างเคร่งครัด
CurtainDog

12
@ เมลฉันคิดว่าไฟล์ที่ไม่ควรเข้าถึงโดยไคลเอนต์ควรเป็น 404 มันเป็นไฟล์ที่อยู่ภายในระบบ ข้างนอกไม่ควรรู้ว่ามันมีอยู่จริง ด้วยการคืน 403 คุณจะทำให้ลูกค้ารู้ว่ามันมีอยู่ไม่จำเป็นต้องให้ข้อมูลนั้นแก่แฮ็กเกอร์ สเป็คสำหรับ 403 พูดว่าAn origin server that wishes to "hide" the current existence of a forbidden target resource MAY instead respond with a status code of 404 (Not Found).
Juan Mendes

3
ในขณะที่สิ่งนี้ดูเหมือนว่าฉันชอบมันอาจเป็นการตีความที่ถูกต้องของ RFC 2616 เก่าโปรดทราบว่า RFC 7231 กำหนดความหมายของ 403 ที่แตกต่างกันและในความเป็นจริงระบุอย่างชัดเจนว่า"ลูกค้าอาจทำซ้ำคำขอด้วยข้อมูลประจำตัวใหม่ ดังนั้นในขณะที่คำตอบนี้ถูกต้องในปี 2010 มันผิดอย่างสิ้นเชิงในวันนี้เพราะความหมายของรหัสสถานะได้ถูกเขียนใหม่ใต้ฝ่าเท้าของเรา (น่ารำคาญการเปลี่ยนแปลงจากภาคผนวกRFC 2616ไม่ยอมรับการเปลี่ยนแปลง!)
Mark Amery

46

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

403 ต้องห้ามถูกใช้เมื่อทุกคนเข้าถึงทรัพยากรต้องห้ามหรือ จำกัด เครือข่ายที่กำหนดหรืออนุญาตผ่าน SSL เท่านั้นไม่ว่าจะเกี่ยวข้องกับการตรวจสอบสิทธิ์ HTTP หรือไม่ก็ตาม

หากไม่ได้ใช้การตรวจสอบความถูกต้องของ HTTPและให้บริการรูปแบบการตรวจสอบความถูกต้องของคุกกี้ตามปกติในปัจจุบันดังนั้นควรส่งคืน 403 หรือ 404

เกี่ยวกับ 401 นี่มาจาก RFC 7235 (Hypertext Transfer Protocol (HTTP / 1.1): การรับรองความถูกต้อง):

3.1 401 ไม่ได้รับอนุญาต

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

ความหมายของ 403 (และ 404) มีการเปลี่ยนแปลงเมื่อเวลาผ่านไป นี่คือจากปี 1999 (RFC 2616):

10.4.4 403 สิ่งต้องห้าม

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

ในปี 2014 RFC 7231 (Hypertext Transfer Protocol (HTTP / 1.1): ความหมายและเนื้อหา) เปลี่ยนความหมายของ 403:

6.5.3 403 ต้องห้าม

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

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

เซิร์ฟเวอร์ต้นทางที่ต้องการ "ซ่อน" การมีอยู่ของ
ทรัพยากรเป้าหมายต้องห้ามในปัจจุบันอาจตอบกลับด้วยรหัสสถานะ
404 (ไม่พบ)

ดังนั้นตอนนี้ 403 (หรือ 404) อาจหมายถึงอะไรก็ได้ การให้ข้อมูลประจำตัวใหม่อาจช่วย ... หรืออาจจะไม่

ฉันเชื่อว่าเหตุผลที่ทำให้สิ่งนี้เปลี่ยนไปคือ RFC 2616 สันนิษฐานว่าการรับรองความถูกต้อง HTTP จะใช้เมื่อในทางปฏิบัติเว็บแอปในปัจจุบันสร้างโครงร่างการรับรองความถูกต้องที่กำหนดเองโดยใช้ตัวอย่างเช่นฟอร์มและคุกกี้


2
สิ่งนี้น่าสนใจ จาก RFC 7231 และ RFC 7235 ฉันไม่เห็นความแตกต่างที่ชัดเจนระหว่าง 401 และ 403
Brian

2
403 หมายถึง "ฉันรู้จักคุณ แต่คุณไม่เห็นแหล่งข้อมูลนี้" ไม่มีเหตุผลสำหรับความสับสน
Michael Blackburn

"ถ้าคำขอนั้นมีข้อมูลรับรองการตรวจสอบสิทธิ์อยู่ด้วยการตอบสนอง 401 บ่งชี้ว่าการอนุญาตนั้นถูกปฏิเสธสำหรับข้อมูลรับรองเหล่านั้นลูกค้าอาจทำซ้ำการร้องขอด้วยฟิลด์หัวข้อการอนุญาตใหม่หรือแทนที่ (ส่วน 4.1)" อย่างไรก็ตามจากนั้น "4.2. ฟิลด์ส่วนหัว 'การอนุญาต' อนุญาตให้ตัวแทนผู้ใช้รับรองความถูกต้องตัวเองกับเซิร์ฟเวอร์ต้นทาง" ดูเหมือนว่าใน RFC7235 พวกเขาใช้คำว่า "การอนุญาต" เช่นเดียวกับ "การรับรองความถูกต้อง" ในกรณีนั้นอาจดูเหมือนว่าผู้ใช้ที่ได้รับการรับรองความถูกต้อง แต่ไม่ได้รับอนุญาตไม่ควรรับ 401 แต่เป็น 403
arcuri82

28

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

OWASP มีข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่ผู้โจมตีสามารถใช้ข้อมูลประเภทนี้เป็นส่วนหนึ่งของการโจมตี


3
การใช้ 404 ได้รับการกล่าวถึงในคำตอบก่อนหน้า คุณกำลังอยู่ในจุด: การรั่วไหลของข้อมูลและสิ่งนี้ควรเป็นข้อพิจารณาที่สำคัญสำหรับทุกคนที่นำเสนอแผนการตรวจสอบ / การอนุญาตของตนเอง +1 สำหรับการกล่าวถึง OWASP
Dave Watts

ตอนนี้ลิงก์ OWASP ไปยังหน้า 404 อย่างแดกดัน ฉันพบสิ่งที่คล้ายกัน (ฉันคิดว่า) ในowasp.org/index.php/ …
anned20

ขอบคุณสำหรับหัวขึ้นฉันอัปเดต!
Patrick White

ขึ้นอยู่กับ API และวิธีการเข้าถึง แต่ "การรั่วไหล" ไม่ใช่ปัญหาหากส่งคืน 401 สำหรับชื่อผู้ใช้ / รหัสผ่านมันจะเหมือนกับเว็บฟอร์มอย่างแน่นอนใช่ไหม
James

26
  • 401 ไม่ได้รับอนุญาต : ฉันไม่รู้ว่าคุณเป็นใคร นี่เป็นข้อผิดพลาดการรับรองความถูกต้อง
  • 403 ห้าม : ฉันรู้ว่าคุณเป็นใคร แต่คุณไม่ได้รับอนุญาตให้เข้าถึงทรัพยากรนี้ นี่เป็นข้อผิดพลาดการอนุญาต

ไม่แน่ใจว่าเป็น "เสมอ" โดยเฉพาะหมายความว่าผู้ส่งไม่รู้จัก สิ่งที่พวกเขาร้องขอนั้นไม่ได้รับอนุญาต
James

22

คำถามนี้ถูกถามเมื่อไม่นานมานี้ แต่ความคิดของผู้คนกำลังดำเนินต่อไป

มาตรา 6.5.3ในร่างนี้ (ประพันธ์โดยฟีลดิงและ Reschke) ให้รหัสสถานะ 403 มีความหมายแตกต่างกันเล็กน้อยกับที่บันทึกไว้ในRFC 2616

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

ฉันเน้นสิ่งที่ฉันคิดว่าสำคัญที่สุด

6.5.3 403 ต้องห้าม

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

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

เซิร์ฟเวอร์ต้นทางที่ต้องการ "ซ่อน" การมีอยู่ของทรัพยากรเป้าหมายต้องห้ามในปัจจุบันอาจตอบกลับด้วยรหัสสถานะ 404 (ไม่พบ)

สิ่งที่คุณใช้ในการประชุมสิ่งสำคัญคือการให้ความเท่าเทียมกันทั่วทั้งไซต์ / API ของคุณ


2
ร่างได้รับการอนุมัติแล้วและตอนนี้เป็น RFC 7231
Vebjorn Ljosa

13

TL; DR

  • 401: การปฏิเสธที่เกี่ยวข้องกับการรับรองความถูกต้อง
  • 403: การปฏิเสธที่ไม่มีส่วนเกี่ยวข้องกับการรับรองความถูกต้อง

ตัวอย่างการปฏิบัติ

หากapache ต้องการการรับรองความถูกต้อง (ผ่าน.htaccess) และคุณกดCancelมันจะตอบสนองด้วย401 Authorization Required

หากnginxค้นหาไฟล์ แต่ไม่มีสิทธิ์การเข้าถึง (ผู้ใช้ / กลุ่ม) เพื่ออ่าน / เข้าถึงไฟล์จะตอบกลับด้วย403 Forbidden

RFC (2616 มาตรา 10)

401 ไม่ได้รับอนุญาต (10.4.2)

ความหมายที่ 1: จำเป็นต้องตรวจสอบ

คำขอต้องมีการตรวจสอบผู้ใช้ ...

ความหมายที่ 2: การรับรองความถูกต้องไม่เพียงพอ

... หากคำร้องขอนั้นมีข้อมูลประจำตัวการอนุญาตแล้วการตอบกลับ 401 บ่งชี้ว่าการอนุญาตนั้นถูกปฏิเสธสำหรับข้อมูลรับรองเหล่านั้น ...

403 ต้องห้าม (10.4.4)

ความหมาย: ไม่เกี่ยวข้องกับการรับรองความถูกต้อง

... การอนุญาตจะไม่ช่วย ...

รายละเอียดเพิ่มเติม:

  • เซิร์ฟเวอร์เข้าใจคำขอ แต่ปฏิเสธที่จะปฏิบัติตาม

  • มันควรอธิบายถึงสาเหตุของการปฏิเสธในเอนทิตี

  • รหัสสถานะ 404 (ไม่พบ) สามารถใช้แทนได้

    (หากเซิร์ฟเวอร์ต้องการเก็บข้อมูลนี้จากลูกค้า)


11

พวกเขาไม่ได้เข้าสู่ระบบหรือไม่ได้อยู่ในกลุ่มผู้ใช้ที่เหมาะสม

คุณระบุสองกรณีที่แตกต่างกัน แต่ละกรณีควรมีการตอบสนองที่แตกต่างกัน:

  1. หากพวกเขาไม่ได้เข้าสู่ระบบเลยคุณควรกลับ401 ไม่ได้รับอนุญาต
  2. หากพวกเขาเข้าสู่ระบบ แต่ไม่ได้อยู่ในกลุ่มผู้ใช้ที่เหมาะสมคุณควรส่งคืน403 สิ่งต้องห้าม

หมายเหตุเกี่ยวกับ RFC ตามความคิดเห็นที่ได้รับจากคำตอบนี้:

หากผู้ใช้ไม่ได้เข้าสู่ระบบพวกเขาจะไม่ได้รับการรับรองความถูกต้อง HTTP เทียบเท่าซึ่งเป็น 401 และเรียกว่าไม่ได้รับอนุญาตใน RFC ตามมาตรา 10.4.2ระบุว่า401 ไม่ได้รับอนุญาต :

"คำขอต้องมีการตรวจสอบสิทธิ์ผู้ใช้"

หากคุณไม่ได้รับการรับรองความถูกต้อง 401 คือคำตอบที่ถูกต้อง อย่างไรก็ตามหากคุณไม่ได้รับอนุญาตในความหมายที่ถูกต้องความหมาย 403 เป็นการตอบสนองที่ถูกต้อง


5
สิ่งนี้ไม่ถูกต้อง อ้างถึงRFCและคำตอบของ @ Cumbayah
Davide R.

7
@DavideR RFC ใช้การพิสูจน์ตัวตนและการอนุญาตแทนกัน ฉันเชื่อว่ามันสมเหตุสมผลกว่าเมื่ออ่านด้วยความหมายการพิสูจน์ตัวตน
Zaid Masud

คำตอบนี้กลับรายการ ไม่ได้รับอนุญาตไม่เหมือนกับ Un-authenticated @DavideR ถูกต้อง การพิสูจน์ตัวตนและการอนุญาตไม่สามารถใช้แทนกันได้
BozoJoe

2
2,616 ควรเผา RFC ที่ใหม่กว่าหลายแห่งมีความชัดเจนมากขึ้นว่ามีความต้องการแยกความแตกต่างระหว่าง "ฉันไม่รู้จักคุณ" และ "ฉันรู้จักคุณ แต่คุณไม่สามารถเข้าถึงได้" นอกจากนี้ไม่มีเหตุผลที่ถูกต้องที่จะยอมรับการดำรงอยู่ของทรัพยากรที่จะไม่รับการเติมเต็ม (หรือไม่ได้ปฏิบัติตามผ่านทาง http) ซึ่งเป็นสิ่งที่ 403-truthers จะแนะนำ
Michael Blackburn

6

นี่คือความหมาย:

401 : รับรองความถูกต้องของผู้ใช้ไม่ถูกต้องทรัพยากร / หน้าต้องการการรับรองความถูกต้อง

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


นี่เป็นคำตอบที่ดีสำหรับ TLDR สำหรับคำถามนี้
Kousha

5

นี่ง่ายกว่าที่อื่นในหัวดังนั้น:

401: คุณต้องมีการตรวจสอบสิทธิ์พื้นฐาน HTTP เพื่อดูสิ่งนี้

403: คุณไม่เห็นสิ่งนี้และการตรวจสอบสิทธิ์พื้นฐาน HTTP จะไม่ช่วย

หากผู้ใช้เพียงแค่ต้องเข้าสู่ระบบโดยใช้แบบฟอร์มการเข้าสู่ระบบ HTML มาตรฐานของเว็บไซต์ของคุณ 401 จะไม่เหมาะสมเพราะมันเป็นเฉพาะกับ HTTP รับรองความถูกต้องขั้นพื้นฐาน

ฉันไม่แนะนำให้ใช้ 403 เพื่อปฏิเสธการเข้าถึงสิ่งต่าง ๆ เช่น /includesเดียวกับที่เกี่ยวข้องกับเว็บทรัพยากรเหล่านั้นไม่มีอยู่เลยและควรจะ 404

สิ่งนี้ทำให้ 403 เป็น "คุณต้องเข้าสู่ระบบ"

กล่าวอีกนัยหนึ่ง 403 หมายถึง "ทรัพยากรนี้ต้องการการรับรองความถูกต้องบางรูปแบบนอกเหนือจากการรับรองความถูกต้องพื้นฐาน HTTP"

https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2


5

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

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

  • ทรัพยากรที่ต้องตรวจสอบ แต่ไม่มีข้อมูลประจำตัวที่ถูกระบุ

401 : ไคลเอนต์ควรระบุข้อมูลประจำตัว

  • ข้อมูลประจำตัวที่ระบุอยู่ในรูปแบบที่ไม่ถูกต้อง

400 : ไม่ใช่ 401 หรือ 403 เนื่องจากข้อผิดพลาดทางไวยากรณ์ควรส่งคืน 400 เสมอ

  • ข้อมูลประจำตัวที่ระบุอ้างอิงผู้ใช้ที่ไม่ได้อยู่

401 : ไคลเอ็นต์ควรระบุข้อมูลรับรองที่ถูกต้อง

  • ที่ระบุข้อมูลประจำตัวที่มีความไม่ถูกต้องแต่ระบุเป็นผู้ใช้ที่ถูกต้อง (หรือไม่ได้ระบุผู้ใช้หากผู้ใช้ที่ระบุไม่จำเป็น)

401 : อีกครั้งไคลเอนต์ควรระบุข้อมูลประจำตัวที่ถูกต้อง

  • ที่ระบุข้อมูลประจำตัวได้หมดอายุแล้ว

401 : นี่เป็นจริงเหมือนกับการมีข้อมูลประจำตัวที่ไม่ถูกต้องโดยทั่วไปดังนั้นลูกค้าควรระบุข้อมูลประจำตัวที่ถูกต้อง

  • ข้อมูลประจำตัวที่ระบุนั้นถูกต้องสมบูรณ์ แต่ไม่พอเพียงกับทรัพยากรแม้ว่าจะเป็นไปได้ว่าข้อมูลรับรองที่มีสิทธิ์เพิ่มเติมสามารถทำได้

403 : การระบุข้อมูลรับรองที่ถูกต้องจะไม่ให้สิทธิ์การเข้าถึงทรัพยากรเนื่องจากข้อมูลรับรองปัจจุบันนั้นถูกต้องแล้ว แต่ไม่ได้รับอนุญาต

  • โดยเฉพาะอย่างยิ่งทรัพยากรคือไม่สามารถเข้าถึงได้โดยไม่คำนึงถึงข้อมูลประจำตัว

403 : นี่คือไม่คำนึงถึงข้อมูลประจำตัวดังนั้นการระบุข้อมูลประจำตัวที่ถูกต้องไม่สามารถช่วยได้

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

403 : หากลูกค้าถูกบล็อคการระบุข้อมูลประจำตัวใหม่จะไม่ทำอะไรเลย


4

เป็นภาษาอังกฤษ:

401

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

403

คุณไม่ได้รับอนุญาต ชื่อของคุณไม่ได้อยู่ในรายชื่อคุณจะไม่เคยเข้าไปข้างในออกไปอย่าส่งคำขอให้ลองใหม่มันจะถูกปฏิเสธเสมอ ไปให้พ้น.


1

เมื่อพิจารณาจาก RFC ล่าสุดเกี่ยวกับเรื่อง ( 7231และ7235 ) กรณีการใช้งานนั้นค่อนข้างชัดเจน (เพิ่มตัวเอียง):

  • 401 สำหรับการรับรองความถูกต้อง ("ขาดการตรวจสอบที่ถูกต้อง"); นั่นคือ 'ฉันไม่รู้ว่าคุณเป็นใครหรือไม่เชื่อใจคุณว่าคุณเป็นใคร'

401 ไม่ได้รับอนุญาต

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

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

  • 403 สำหรับการไม่ได้รับอนุญาต ("ปฏิเสธการอนุญาต"); คือ 'ฉันรู้ว่าคุณเป็นใคร แต่คุณไม่ได้รับอนุญาตให้เข้าถึงทรัพยากรนี้'

403 ต้องห้าม

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

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

เซิร์ฟเวอร์ต้นทางที่ต้องการ "ซ่อน" การมีอยู่ของทรัพยากรเป้าหมายต้องห้ามในปัจจุบันอาจตอบกลับด้วยรหัสสถานะ 404 (ไม่พบ)


2
-1; ข้อความเหล่านี้ได้รับการยกมาแล้วในคำตอบอื่น ๆ ที่นี่และคุณเพิ่มอะไรใหม่ ฉันยืนยันว่ามันไม่ชัดเจนว่าความแตกต่างคืออะไร คุณสรุปรหัสทั้งสองเป็น "ขาดการรับรองความถูกต้องที่ถูกต้อง" และ "ปฏิเสธที่จะอนุญาต" แต่ฉันไม่สามารถเข้าใจสถานการณ์ใด ๆ ที่คำอธิบายสั้น ๆ เหล่านี้จะนำไปใช้ในกรณีที่อีกฝ่ายไม่สามารถตีความได้เช่นกัน
ทำเครื่องหมาย Amery

มีคำตอบมากมายที่นี่ซึ่งครอบคลุม RFC จำนวนมากและได้รับการแก้ไขและปรับปรุง muddying น่านน้ำ ฉันได้รวมลิงก์เพื่ออธิบายว่าอะไรauthenticatedคืออะไรและauthorizedจะทิ้ง RFC ที่ล้าสมัยทั้งหมดเพื่อให้แอปพลิเคชันนั้นชัดเจน
cjbarth

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

-6

ในกรณีของ 401 vs 403 สิ่งนี้ได้รับการตอบหลายครั้ง นี่เป็นสิ่งสำคัญสำหรับการอภิปราย 'สภาพแวดล้อมคำขอ HTTP' ไม่ใช่การอภิปราย 'แอปพลิเคชัน'

ดูเหมือนจะมีคำถามเกี่ยวกับปัญหาการเข้าสู่ระบบของคุณ (แอปพลิเคชัน)

ในกรณีนี้การล็อกอินไม่เพียงพอที่จะส่ง 401 หรือ 403 เว้นแต่ว่าคุณใช้ HTTP Auth กับหน้าล็อกอิน (ไม่เชื่อมโยงกับการตั้งค่า HTTP Auth) ดูเหมือนว่าคุณอาจกำลังมองหา "201 สร้าง" โดยมีหน้าจอม้วนเข้าสู่ระบบของคุณปรากฏอยู่ (แทนที่จะเป็นทรัพยากรที่ร้องขอ) สำหรับการเข้าถึงไฟล์ในระดับแอปพลิเคชัน สิ่งนี้พูดว่า:

"ฉันได้ยินคุณมาที่นี่แล้วลองทำสิ่งนี้แทน (คุณไม่ได้รับอนุญาตให้ดู")


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