Prachayawut Sirisuth
EN — Read in English
บทความทั้งหมด

ขายสิทธิ์การเข้าถึง ไม่ใช่ขายไฟล์

เผยแพร่
ระบบ
English with Gift
เวลาอ่าน
5 นาที

วิดีโอคอร์สของติวเตอร์ คือ ธุรกิจ ถ้าหลุดก็ไม่มีสินค้าตัวที่สองให้ถอย

โจทย์เลยไม่ใช่ "เอาวิดีโอขึ้นเว็บ" แต่คือ นักเรียนคนนี้ วิดีโอตัวนี้ ช่วงเวลานี้ ห้ามคนอื่น

สิทธิ์คือแถวข้อมูล ไม่ใช่ path ของไฟล์

วิธีตรงไปตรงมาคือโยนวิดีโอใส่ bucket แล้วแจก URL ใครมี URL ก็มีวิดีโอตลอดไป แถมส่งต่อได้

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

  1. นักเรียนเปิด /videos/[id]
  2. เซิร์ฟเวอร์เช็คว่ามีแถวสิทธิ์ของคนนี้กับวิดีโอนี้ไหม
  3. มีเท่านั้นถึงจะ render หน้าพร้อมตัวเล่น
  4. ตัวเล่นขอ /api/videos/[id]/signed-url
  5. endpoint นั้นตรวจ session และ สิทธิ์ซ้ำ แล้วออก signed URL อายุ 15 นาที ไปยัง object storage
  6. ตัวเล่นสตรีมจาก 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 ที่หมดอายุไป