ขายสิทธิ์การเข้าถึง ไม่ใช่ขายไฟล์
- เผยแพร่
- ระบบ
- English with Gift
- เวลาอ่าน
- 5 นาที
วิดีโอคอร์สของติวเตอร์ คือ ธุรกิจ ถ้าหลุดก็ไม่มีสินค้าตัวที่สองให้ถอย
โจทย์เลยไม่ใช่ "เอาวิดีโอขึ้นเว็บ" แต่คือ นักเรียนคนนี้ วิดีโอตัวนี้ ช่วงเวลานี้ ห้ามคนอื่น
สิทธิ์คือแถวข้อมูล ไม่ใช่ path ของไฟล์
วิธีตรงไปตรงมาคือโยนวิดีโอใส่ bucket แล้วแจก URL ใครมี URL ก็มีวิดีโอตลอดไป แถมส่งต่อได้
แต่ที่นี่สิทธิ์คือแถวข้อมูล ผู้ใช้ วิดีโอ วันหมดอายุ และทุกครั้งที่เล่นจะตรวจใหม่ฝั่งเซิร์ฟเวอร์
- นักเรียนเปิด
/videos/[id] - เซิร์ฟเวอร์เช็คว่ามีแถวสิทธิ์ของคนนี้กับวิดีโอนี้ไหม
- มีเท่านั้นถึงจะ render หน้าพร้อมตัวเล่น
- ตัวเล่นขอ
/api/videos/[id]/signed-url - endpoint นั้นตรวจ session และ สิทธิ์ซ้ำ แล้วออก signed URL อายุ 15 นาที ไปยัง object storage
- ตัวเล่นสตรีมจาก URL นั้น
ขั้น 5 คือขั้นที่ควรถกกัน เพราะขั้น 2 ตรวจสิทธิ์ไปแล้ว ดูเหมือนทำซ้ำ
ไม่ซ้ำ ขั้น 2 อนุญาตให้ แสดงหน้าเว็บ ขั้น 5 อนุญาตให้ ส่งมอบกุญแจเข้าถึงไฟล์จริง คนละการกระทำ อายุไม่เท่ากัน และอันที่สองคืออันที่สำคัญ ถ้าสิทธิ์ถูกถอนระหว่างหน้าโหลดเสร็จกับตอนกดเล่น endpoint นั้นต้องไม่ยังออก URL ที่ใช้ได้ อะไรก็ตามที่ออกกุญแจเลยตรวจใหม่เสมอ ไม่เชื่อว่าต้นทางตรวจมาแล้ว
ทำไม 15 นาที
signed URL คือสิ่งเดียวที่กั้นระหว่างนักเรียนที่ล็อกอินอยู่กับสำเนาถาวร อายุของมัน คือ คุณสมบัติด้านความปลอดภัย ตัวเลขนี้เลยเป็นการแลกจริง ๆ
สั้นไป คนใช้ wifi โรงแรมหลุดกลางคาบ ยาวไป URL กลายเป็นของที่แชร์ได้ วางในกลุ่มแชททีเดียวทุกคนได้ไฟล์จนกว่ามันจะตาย
15 นาทีครอบคลุมช่วงหนึ่งของบทเรียนบวกการต่อเน็ตใหม่ และทำให้ลิงก์ที่แชร์ออกไปแทบไม่มีค่าตอนที่มันเดินทางถึงปลายทาง วิดีโอยาวกว่านั้นขอลายเซ็นใหม่ให้เองโดยไม่รู้สึก ตัวเล่นขอ URL ใหม่แทนการถือใบเดิมค้าง
storage ไม่เคยเปิดสาธารณะ ไม่มีเส้นทางไหนเสิร์ฟไฟล์โดยไม่มีลายเซ็น แปลว่า URL ที่หลุดจะหมดอายุ ต่างจาก path ของ bucket ที่หลุดแล้วอยู่ตลอดกาล
สิทธิ์ก็หมดอายุ และให้เป็นชุดได้
การจำกัดเวลาไม่ได้อยู่แค่ระดับ URL นักเรียนที่ซื้อคอร์ส 3 เดือนมีแถวสิทธิ์ที่หยุดทำงานเองหลัง 3 เดือน โดยไม่มีใครต้องรัน cleanup job การตรวจคือการเปรียบเทียบ ไม่ใช่สถานะที่ต้องคอยดูแล
การให้สิทธิ์ทีละวิดีโอใช้กับคอร์สจริงไม่ได้ invite link แก้ตรงนี้ ลิงก์เดียวให้สิทธิ์วิดีโอทั้งชุด พร้อมช่วงเวลาที่ใช้ได้ของตัวเอง ติวเตอร์ส่งลิงก์ให้นักเรียนรุ่นใหม่ แทนที่จะไล่เพิ่มนักเรียน 30 คนเข้าวิดีโอ 12 ตัวด้วยมือ
ดูเหมือนฟีเจอร์เพื่อความสะดวก แต่จริง ๆ คือฟีเจอร์เพื่อความถูกต้อง การให้สิทธิ์ด้วยมือในปริมาณนั้นทำให้มีนักเรียนตกหล่น และที่แย่กว่าคือมีนักเรียนที่ยังเข้าถึงได้หลังคอร์สจบเพราะไม่มีใครจำได้ว่าต้องเอาออก
ทุกการกระทำของแอดมินลง audit log ที่เขียนเพิ่มได้อย่างเดียว เวลานักเรียนบอกว่าตัวเองควรยังมีสิทธิ์ ก็มีหลักฐาน ไม่ต้องนั่งเดาย้อนหลัง
สิ่งที่ระบบนี้กันไม่ได้
พูดตรง ๆ ดีกว่า เพราะงานเขียนเรื่อง security มักไม่ค่อยพูด
ทั้งหมดนี้ไม่ได้กันนักเรียนที่ตั้งใจจริงจากการอัดหน้าจอ ตัวเล่นปิดคลิกขวาและไม่มีปุ่มดาวน์โหลด ทั้งสองอย่างเป็น ตัวหน่วง ไม่ใช่ตัวควบคุม มันเพิ่มความยุ่งยากให้คนที่จะเซฟเล่น ๆ และหยุดอะไรไม่ได้มากกว่านั้น ใครอยากได้สำเนามากพอก็แค่เปิดโปรแกรมอัดหน้าจอ
ซึ่งก็โอเค และเป็นจุดที่ควรหยุดพอดี ภัยที่เกิดจริงไม่ใช่นักละเมิดลิขสิทธิ์มืออาชีพ แต่คือ URL ที่ถูกส่งต่อในกลุ่มแชท หรือนักเรียนเทอมที่แล้วที่ยังดูเนื้อหาเทอมนี้ได้ สองอย่างนี้จัดการได้หมดด้วยกุญแจที่หมดอายุกับสิทธิ์ที่หมดอายุ
ไล่ตามส่วนที่เหลือแปลว่าต้องใช้ DRM ซึ่งแพงกว่าที่ธุรกิจเสียไป แถมทำให้ประสบการณ์ดูแย่ลงสำหรับนักเรียนที่สุจริตทุกคน การรู้ว่ากำลังกันภัยแบบไหนอยู่คือเนื้อหาส่วนใหญ่ของการออกแบบ
ส่วนที่เอาไปใช้ต่อได้
สามข้อ ใช้ได้กับทุกระบบที่ขายสิทธิ์การเข้าถึงแทนการขายไฟล์
- อนุญาตที่ตัวกุญแจ ไม่ใช่ที่หน้าเว็บ ตรวจซ้ำตอนส่งมอบสิ่งที่ให้สิทธิ์ ไม่ว่าต้นทางจะเพิ่งตรวจมาแค่ไหน
- ทำให้การหมดอายุเป็นการเปรียบเทียบ ไม่ใช่งานที่ต้องรัน สิทธิ์ที่พกวันหมดอายุของตัวเองไม่มีทางถูกลืมโดย cron ที่ตายตอนตีสาม
- บอกให้ชัดว่าไม่ได้กันอะไร ไม่งั้นจะเผางบไปกับละครปิดคลิกขวา แล้วข้ามเรื่อง URL ที่หมดอายุไป