

ลิงก์ดาวน์โหลดที่หมดอายุได้ช่วยให้บริการส่งไฟล์โดยไม่ต้องเปิด object เป็นสาธารณะถาวร ผู้ใช้กดจากแอปแล้วรับข้อมูลจากที่เก็บโดยตรง ส่วนแอปเป็นผู้ตัดสินใจก่อนว่าจะออกลิงก์ให้ใครและใช้ได้นานเท่าไร
แต่การมีวันหมดอายุไม่ได้ตอบทุกเรื่องของสิทธิ์ ลิงก์อาจถูกส่งต่อ เริ่มดาวน์โหลดก่อนหมดเวลา หรือมีสำเนาถูกเก็บไปแล้ว หากตีความว่าครบเวลาแล้วข้อมูลหายจากทุกที่ อาจให้คำสัญญาที่กลไกนี้ทำไม่ได้
ควรแยกการอนุญาตคำขอใหม่ออกจากข้อมูลที่ถูกส่งถึงผู้รับไปแล้วครับ โดยดูขอบเขตของผู้ให้บริการที่เลือก ไม่เหมารวมว่าลิงก์มีลายเซ็นทุกระบบทำงานแบบเดียวกันทั้งหมด
ใน Amazon S3 presigned URL ใช้ข้อมูลรับรองของ principal ที่สร้าง ร่วมกับ object method และอายุที่กำหนดเพื่อให้ผู้ถือใช้คำขอตามเงื่อนไข โดยไม่ได้ทำให้ผู้รับต้องมีบัญชี AWS กับสิทธิ์ชุดเดียวกันเอง
เอกสารอธิบายลิงก์นี้เป็น bearer token ในแง่ว่าผู้ที่ถือมันมีความสามารถใช้ตามขอบเขต จึงไม่ควรอ้างว่ารู้ชื่อผู้ใช้ที่ออกลิงก์ให้แล้ว S3 จะยืนยันว่าคนกดต่อมาต้องเป็นคนเดิมเสมอ
การตรวจสิทธิ์ในแอปก่อนออกลิงก์จึงสำคัญ ต้องตรวจ resource ที่ผู้ใช้ขอจริง ไม่รับ object key จาก client แล้วสร้างลิงก์ให้ทุกค่าที่กุญแจของบริการมีสิทธิ์เข้าถึง มิฉะนั้นตัวลิงก์จะนำสิทธิ์ของบริการไปเปิดข้อมูลที่ผู้ขอไม่ได้รับอนุญาต
ควรจำกัด principal ที่ใช้สร้างให้ตรงหน้าที่ด้วย ลิงก์ไม่ใช่ทางเพิ่มสิทธิ์เหนือสิ่งที่ผู้ออกได้รับ และหากระบบออกลิงก์ใช้บัญชีที่กว้างเกินงาน ความผิดพลาดที่ขั้นเลือก object ก็มีขอบเขตเสียหายกว้างตามไปด้วย

ลิงก์สำหรับ GET เพื่ออ่านไฟล์มีหน้าที่ต่างจาก PUT เพื่ออัปโหลด การสร้างและใช้ต้องตรง method กับเงื่อนไขที่ลงนามไว้ ไม่ถือว่าการได้ URL ของ object หนึ่งหมายถึงมีสิทธิ์ทำทุกอย่างกับมัน
ฝั่ง upload ต้องกำหนด key ที่เหมาะสมด้วย เพราะ S3 อาจแทน object เดิมเมื่ออัปโหลดไป key เดียวกันตามเงื่อนไข การออกลิงก์เขียนจึงไม่ควรเป็นแค่เลือกชื่อไฟล์จากผู้ใช้โดยไม่ดูชนกับข้อมูลใดอยู่
ถ้าต้องการรับไฟล์ชั่วคราวก่อนตรวจเนื้อหา ควรแยกสถานะรับ upload ออกจากอนุมัติให้เผยแพร่ตาม workflow การที่ storage รับข้อมูลผ่านลิงก์ได้ไม่ได้ยืนยันว่าไฟล์ถูกประเภท ปลอดภัย หรือควรให้คนอื่นอ่านแล้ว
ค่า header หรือพารามิเตอร์ที่มีผลต่อลายเซ็นต้องใช้ตามสัญญาของ SDK และคำขอจริง หากไปเปลี่ยน URL หรือ method หลังออกลิงก์ ปัญหาที่ตามมาอาจเป็นการตรวจลายเซ็น ไม่ใช่ network เสีย ควรดูเหตุปฏิเสธโดยไม่ส่งลิงก์เต็มออกสู่ log สาธารณะ
กำหนดเวลาของ URL เป็นส่วนหนึ่งของเงื่อนไข แต่ถ้าใช้ temporary credential ที่หมดอายุก่อน ลิงก์ก็หมดผลตามอายุ credential นั้นได้ การตั้งเวลาลิงก์ยาวจึงไม่ได้ขยายสิทธิ์ของข้อมูลรับรองที่ใช้สร้างให้ยาวตาม
การเพิกถอน ลบหรือปิดข้อมูลรับรองที่เกี่ยวข้องก็อาจทำให้ลิงก์ใช้ไม่ได้ตามกติกาของ S3 รวมถึงนโยบายที่จำกัดคำขอเพิ่มเติม ต้องพิจารณาอายุที่มีผลจากทุกชั้น ไม่บันทึกเฉพาะเวลาที่หน้าแอปคำนวณไว้แล้วรับรองว่าจะใช้ได้ถึงเวลานั้นแน่นอน
หากให้บริการผ่านระบบอื่นต่อหน้าที่เก็บ เช่น CDN ก็ต้องอ่านโมเดล signed URL และนโยบายของชั้นนั้นแยก การตรวจอายุที่ origin ไม่ได้บอกทุกพฤติกรรมของ edge ที่ตั้งให้จัดการสิทธิ์หรือ cache อยู่ต่างหาก
การเลือกอายุควรมาจากงานที่ผู้ใช้ต้องทำกับทางขอใหม่เมื่อหมดเวลา ไม่เลือกระยะยาวมากเพียงเพื่อไม่ต้องจัดการ error และไม่สั้นจนผู้ใช้ที่ได้รับอนุญาตต้องกดซ้ำโดยไม่มีคำอธิบายว่าควรทำต่ออย่างไร

Amazon S3 ตรวจวันหมดอายุของลิงก์ในจังหวะคำขอ HTTP เริ่มตามพฤติกรรมที่เอกสารอธิบาย หากเริ่มดาวน์โหลดก่อนหมดเวลา การส่งนั้นอาจดำเนินต่อแม้เวลาหมดระหว่างทาง แต่ถ้าสายหลุดแล้วเริ่มคำขอใหม่หลังหมดเวลา ก็ไม่ควรคาดว่าจะใช้ลิงก์เก่าต่อได้
จึงต้องแยกเวลาที่เริ่มใช้สิทธิ์กับเวลาที่ส่งข้อมูลจบ โดยเฉพาะไฟล์ใหญ่หรือการดาวน์โหลดที่แบ่งหลายคำขอ แอปต้องมีทางออกลิงก์ใหม่ตามการตรวจสิทธิ์รอบนั้น หากคำขอใหม่ต้องทำต่อหลังลิงก์เดิมหมดผล
Presigned URL ของ S3 ยังใช้ซ้ำได้ภายในอายุและเงื่อนไขที่มีผล ไม่ใช่ลิงก์ใช้ครั้งเดียวอัตโนมัติ หากผลิตภัณฑ์ต้องการจำกัดจำนวนใช้ ต้องออกแบบชั้นควบคุมที่มีสถานะและบังคับเส้นทางให้ผ่านมันจริง ไม่เพิ่มตัวเลขหนึ่งใน URL แล้วคิดว่า storage จะนับให้
การออกลิงก์ใหม่ก็ไม่ได้ยกเลิกลิงก์เก่าเองตามทุกกรณี หากต้องเพิกถอนต้องใช้วิธีที่ขอบเขตระบบรองรับและประเมินผลต่อผู้รับอื่น ไม่สัญญาว่าลิงก์ก่อนหน้าถูกแทนโดยอัตโนมัติเพียงเพราะกดสร้างอีกครั้ง
เมื่อ client ได้ข้อมูลแล้ว อาจมีไฟล์ดาวน์โหลด สำเนาในแอปหรือ cache ตามการใช้งาน การหมดอายุ URL จำกัดทางขอข้อมูลตามเงื่อนไขนั้น แต่ไม่ได้เรียก byte ที่ส่งถึงผู้รับแล้วให้หายจากอุปกรณ์ของเขา
หากไม่ต้องการเก็บ cache บางชั้น ต้องตั้งนโยบาย response กับระบบที่เกี่ยวข้องตามขอบเขตที่ควบคุมได้ และทดสอบเส้นทางจริง แต่ก็ยังไม่ควรใช้คำว่า no-store เป็นคำรับรองว่าคนที่อ่านข้อมูลได้จะไม่มีทางสร้างสำเนาเอง
การใช้ลิงก์ในหน้าเว็บหรือข้อความส่งต่อยังต้องดูว่าค่าถูกเก็บใน analytics ประวัติหรือเครื่องมือช่วยเหลือส่วนใด ควรบันทึก operation กับตัวระบุที่พอไล่เหตุแทน signed URL เต็ม เมื่อคนช่วยตรวจไม่จำเป็นต้องถือความสามารถดาวน์โหลดนั้น
ชุดตรวจควรมีผู้ใช้ที่ไม่มีสิทธิ์ขอลิงก์ object ที่ไม่ตรง method ที่ไม่ตรง credential หมดอายุก่อน และการใช้ซ้ำตามนโยบาย พร้อมแยกการดาวน์โหลดที่เริ่มก่อนหมดเวลาจากคำขอที่เริ่มหลังหมดแล้ว
ควรทำกับข้อมูลทดลองและ credential ที่จำกัด ไม่ส่งลิงก์ของเอกสารจริงไปทดสอบในเครื่องมือภายนอก การรายงานผลให้ระบุวิธีและขอบเขตที่ตรวจ โดยเก็บค่าลายเซ็นกับ token ออกจากภาพหรือบันทึกที่ผู้ไม่เกี่ยวข้องอ่านได้
Presigned URL ช่วยส่งต่อสิทธิ์เฉพาะคำขอภายใต้อายุและข้อมูลรับรองที่มีผล แต่ไม่ได้ยืนยันตัวผู้ถือทุกครั้งหรือเรียกสำเนาที่ดาวน์โหลดแล้วกลับคืน เมื่อแยกการออกลิงก์ การตรวจคำขอและการเก็บข้อมูลฝั่งผู้รับ เราจะกำหนดอายุกับทางขอใหม่ได้ตรงงาน และอธิบายได้ชัดว่าสิทธิ์จบที่ขั้นใดตามกลไกที่ใช้อยู่