Chrome กำลังเริ่มช่วงทดลองใช้จากต้นทางเพื่อเพิ่มส่วนหัว HTTP ลงใน Storage Access API (SAA) เวอร์ชัน 130: ส่วนหัวการเข้าถึงพื้นที่เก็บข้อมูล Sec-Fetch-Storage-Access
ส่วนหัวคำขอและActivate-Storage-Access
ส่วนหัวการตอบกลับใหม่มีจุดประสงค์เพื่อรองรับทรัพยากรที่ไม่ใช่ iframe และปรับปรุงประสิทธิภาพและประสบการณ์ของผู้ใช้สำหรับเว็บไซต์ที่อาศัยเนื้อหาที่ฝัง เช่น วิดเจ็ตโซเชียลมีเดีย ปฏิทิน และเครื่องมือแบบอินเทอร์แอกทีฟ
ขั้นตอนการทำงานของ JavaScript (และข้อจำกัด)
ก่อนหน้านี้ SAA กำหนดให้ต้องเรียกใช้ JavaScript API ไปยัง document.requestStorageAccess()
ทุกครั้งที่โหลดซ้ำ แม้ว่าผู้ใช้จะให้สิทธิ์แล้วก็ตาม แม้ว่าจะมีประสิทธิภาพ แต่วิธีนี้มีข้อจำกัดดังนี้
- การติดต่อเครือข่ายหลายรอบ: กระบวนการนี้มักจะเกี่ยวข้องกับคำขอเครือข่ายและการโหลดหน้าเว็บหลายครั้งก่อนที่เนื้อหาที่ฝังจะทำงานได้อย่างสมบูรณ์
- การพึ่งพา iframe: การดำเนินการ JavaScript กําหนดให้ต้องใช้ iframe หรือทรัพยากรย่อยภายใน iframe ซึ่งจํากัดความยืดหยุ่นสําหรับนักพัฒนาซอฟต์แวร์
เช่น วิดเจ็ตปฏิทินจาก calendar.example
ที่ฝังใน website.example
โดยใช้เฉพาะ JavaScript จะมีลักษณะดังนี้
- โหลดตัวยึดตําแหน่ง:
website.example
ขอวิดเจ็ต เนื่องจากวิดเจ็ตcalendar.example
ที่ฝังในwebsite.example
ไม่มีสิทธิ์เข้าถึงคุกกี้ที่ไม่ได้แบ่งพาร์ติชัน ระบบจึงแสดงผลวิดเจ็ตตัวยึดตําแหน่งแทน - ขอสิทธิ์: ตัวยึดตําแหน่งจะโหลด จากนั้นเรียก
document.requestStorageAccess()
เพื่อขอสิทธิ์storage-access
- ผู้ใช้เลือกให้สิทธิ์
- โหลดวิดเจ็ตซ้ำ: วิดเจ็ตจะรีเฟรชโดยที่ครั้งนี้มีสิทธิ์เข้าถึงคุกกี้ และโหลดเนื้อหาที่ปรับตามโปรไฟล์ของผู้ใช้ในที่สุด
- ทุกครั้งที่ผู้ใช้เข้าชมเว็บไซต์ที่ฝังวิดเจ็ต
calendar.example
อีกครั้ง ขั้นตอนจะเหมือนกับในขั้นตอนที่ 1, 2 และ 4 ทุกประการ ความแตกต่างเพียงอย่างเดียวคือผู้ใช้ไม่จําเป็นต้องให้สิทธิ์เข้าถึงอีกครั้ง
ขั้นตอนนี้ไม่มีประสิทธิภาพ หากผู้ใช้ให้สิทธิ์เข้าถึงพื้นที่เก็บข้อมูลแล้ว การโหลด iframe ครั้งแรก การเรียกใช้ document.requestStorageAccess()
และการโหลดซ้ำในภายหลังจะกลายเป็นสิ่งไม่จำเป็นและทำให้เกิดเวลาในการตอบสนอง
ขั้นตอนใหม่ที่มีส่วนหัว HTTP
ส่วนหัวการเข้าถึงพื้นที่เก็บข้อมูลใหม่ช่วยให้โหลดเนื้อหาที่ฝังอยู่ได้มีประสิทธิภาพมากขึ้น รวมถึงทรัพยากรที่ไม่ใช่ iframe
เมื่อใช้ส่วนหัวการเข้าถึงพื้นที่เก็บข้อมูล เบราว์เซอร์จะดึงข้อมูลทรัพยากรโดยอัตโนมัติด้วยการตั้งค่าส่วนหัวคำขอ Sec-Fetch-Storage-Access: inactive
หากผู้ใช้ให้สิทธิ์แล้ว นักพัฒนาแอปไม่จำเป็นต้องดำเนินการใดๆ เพื่อตั้งค่าส่วนหัวคำขอ เซิร์ฟเวอร์สามารถตอบกลับด้วยส่วนหัว Activate-Storage-Access: retry; allowed-origin="<origin>"
และเบราว์เซอร์จะลองส่งคำขออีกครั้งโดยใช้ข้อมูลเข้าสู่ระบบที่จำเป็น
ส่วนหัวของคำขอ
Sec-Fetch-Storage-Access: <access-status>
เมื่อผู้ใช้เข้าชมหน้าที่ฝังเนื้อหาข้ามเว็บไซต์เบราว์เซอร์จะใส่ส่วนหัว Sec-Fetch-Storage-Access
ไว้ในคําขอข้ามเว็บไซต์โดยอัตโนมัติ ซึ่งอาจต้องใช้ข้อมูลเข้าสู่ระบบ (เช่น คุกกี้) ส่วนหัวนี้ระบุสถานะสิทธิ์การเข้าถึงคุกกี้ของชิ้นงาน วิธีตีความค่ามีดังนี้
none
: แทรกไม่มีสิทธิ์storage-access
จึงไม่มีสิทธิ์เข้าถึงคุกกี้ที่ไม่ได้แบ่งพาร์ติชันinactive
: รายการที่ฝังมีสิทธิ์storage-access
แต่ไม่ได้เลือกใช้สิทธิ์ดังกล่าว การฝังไม่มีสิทธิ์เข้าถึงคุกกี้ที่ไม่ได้แบ่งพาร์ติชันactive
: ชิ้นงานมีสิทธิ์เข้าถึงคุกกี้ที่ไม่ได้แบ่งพาร์ติชัน ค่านี้จะรวมอยู่ในคําขอข้ามแหล่งที่มาซึ่งมีสิทธิ์เข้าถึงคุกกี้ที่ไม่ได้แบ่งพาร์ติชัน
ส่วนหัวการตอบกลับ
Activate-Storage-Access: <retry-or-reload>
ส่วนหัว Activate-Storage-Access
จะสั่งให้เบราว์เซอร์ลองส่งคำขออีกครั้งด้วยคุกกี้ หรือโหลดทรัพยากรโดยตรงโดยเปิดใช้งาน SAA ส่วนหัวอาจมีค่าดังต่อไปนี้
load
: สั่งให้เบราว์เซอร์ให้สิทธิ์ผู้ฝังเข้าถึงคุกกี้ที่ไม่ได้แบ่งพาร์ติชันสําหรับทรัพยากรที่ขอretry
: เซิร์ฟเวอร์ตอบกลับว่าเบราว์เซอร์ควรเปิดใช้งานสิทธิ์การเข้าถึงพื้นที่เก็บข้อมูล จากนั้นลองส่งคำขออีกครั้ง
Activate-Storage-Access: retry; allowed-origin="https://site.example"
Activate-Storage-Access: retry; allowed-origin=*
Activate-Storage-Access: load
การรองรับทรัพยากรที่ไม่ใช่ iframe
การอัปเดตส่วนหัวการเข้าถึงพื้นที่เก็บข้อมูลจะเปิดใช้ SAA สำหรับเนื้อหาที่ฝังซึ่งไม่ใช่ iframe เช่น รูปภาพที่โฮสต์ในโดเมนอื่น ก่อนหน้านี้ ไม่มี API แพลตฟอร์มเว็บใดที่อนุญาตให้โหลดทรัพยากรดังกล่าวด้วยข้อมูลเข้าสู่ระบบในเบราว์เซอร์หากไม่มีคุกกี้ของบุคคลที่สาม
ตัวอย่างเช่น embedding-site.example
สามารถขอรูปภาพได้ดังนี้
<img src="https://server.example/image"/>
และเซิร์ฟเวอร์จะตอบกลับด้วยเนื้อหาหรือข้อผิดพลาดได้ ทั้งนี้ขึ้นอยู่กับว่าคุกกี้พร้อมใช้งานหรือไม่
app.get('/image', (req, res) => {
const headers = req.headers;
const cookieHeader = headers.cookie;
// Check if the embed has the necessary cookie access
if (!cookieHeader || !cookieHeader.includes('foo')) {
// If the cookie is not present, check if the browser supports Storage Access headers
if (
'sec-fetch-storage-access' in headers &&
headers['sec-fetch-storage-access'] == 'inactive'
) {
// If the browser supports Storage Access API, retry the request with storage access enabled
res.setHeader('Activate-Storage-Access', 'retry; allowed-origin="https://embedding-site.example"');
}
res.status(401).send('No cookie!');
} else {
// If the cookie is available, check if the user is authorized to access the image
if (!check_authorization(cookieHeader)) {
return res.status(401).send('Unauthorized!');
}
// If the user is authorized, respond with the image file
res.sendFile("path/to/image.jpeg");
}
});
หากไม่มีคุกกี้ เซิร์ฟเวอร์จะตรวจสอบค่าของส่วนหัวคำขอ Sec-Fetch-Storage-Access
หากตั้งค่านี้เป็น inactive
เซิร์ฟเวอร์จะตอบกลับด้วยส่วนหัว Activate-Storage-Access: retry
ซึ่งบ่งบอกว่าควรลองส่งคำขออีกครั้งโดยให้สิทธิ์เข้าถึงพื้นที่เก็บข้อมูล หากไม่มีคุกกี้และส่วนหัว Sec-Fetch-Storage-Access
ไม่มีค่า "ไม่ใช้งาน" รูปภาพจะไม่โหลด
ขั้นตอนการส่งผ่านข้อมูลส่วนหัว HTTP
เมื่อใช้ส่วนหัว HTTP เบราว์เซอร์จะจดจำได้เมื่อผู้ใช้ให้สิทธิ์เข้าถึงพื้นที่เก็บข้อมูลแก่วิดเจ็ตแล้ว และโหลด iframe ที่มีสิทธิ์เข้าถึงคุกกี้ที่ไม่ได้แบ่งพาร์ติชันในระหว่างการเข้าชมครั้งต่อๆ ไป
เมื่อใช้ส่วนหัวการเข้าถึงพื้นที่เก็บข้อมูล การเข้าชมหน้าเว็บต่อๆ ไปจะทริกเกอร์ขั้นตอนต่อไปนี้
- ผู้ใช้เข้าชม
website.example
ที่มีcalendar.example
ฝังอยู่อีกครั้ง การดึงข้อมูลนี้ยังไม่มีสิทธิ์เข้าถึงคุกกี้ เช่นเดียวกับก่อนหน้านี้ อย่างไรก็ตาม ผู้ใช้เคยให้สิทธิ์storage-access
ไว้ก่อนหน้านี้ และการดึงข้อมูลมีส่วนหัวSec-Fetch-Storage-Access: inactive
เพื่อระบุว่ามีสิทธิ์เข้าถึงคุกกี้ที่ไม่ได้แบ่งพาร์ติชัน แต่ไม่ได้ใช้งาน - เซิร์ฟเวอร์
calendar.example
จะตอบกลับด้วยส่วนหัวActivate-Storage-Access: retry; allowed-origin="<origin>"
(ในกรณีนี้<origin>
จะเป็นhttps://website.example
) เพื่อระบุว่าการดึงข้อมูลทรัพยากรต้องใช้คุกกี้ที่ไม่ได้แบ่งพาร์ติชันซึ่งมีสิทธิ์เข้าถึงพื้นที่เก็บข้อมูล - เบราว์เซอร์จะลองส่งคำขออีกครั้ง โดยครั้งนี้จะรวมคุกกี้ที่ไม่ได้แบ่งพาร์ติชัน (เปิดใช้งานสิทธิ์
storage-access
สำหรับการดึงข้อมูลนี้) - เซิร์ฟเวอร์
calendar.example
จะตอบกลับด้วยเนื้อหา iframe ที่ปรับเปลี่ยนในแบบของคุณ การตอบกลับจะมีส่วนหัวActivate-Storage-Access: load
เพื่อระบุว่าเบราว์เซอร์ควรโหลดเนื้อหาโดยเปิดใช้งานสิทธิ์storage-access
(กล่าวคือ โหลดด้วยการเข้าถึงคุกกี้ที่ไม่ได้แบ่งพาร์ติชัน เหมือนกับว่ามีการเรียกใช้document.requestStorageAccess()
) - User Agent จะโหลดเนื้อหา iframe ที่มีสิทธิ์เข้าถึงคุกกี้ที่ไม่ได้แบ่งพาร์ติชันโดยใช้สิทธิ์การเข้าถึงพื้นที่เก็บข้อมูล หลังจากขั้นตอนนี้ วิดเจ็ตจะทํางานได้ตามที่คาดไว้
อัปเดตโซลูชัน
เมื่อใช้ฟีเจอร์ส่วนหัวการเข้าถึงพื้นที่เก็บข้อมูล คุณอาจต้องอัปเดตโค้ดใน 2 กรณีต่อไปนี้
- คุณใช้ SAA และต้องการเพิ่มประสิทธิภาพด้วยตรรกะส่วนหัว
- คุณมีการตรวจสอบหรือตรรกะที่ขึ้นอยู่กับว่าคำขอในเซิร์ฟเวอร์ของคุณมีส่วนหัว
Origin
หรือไม่
ใช้ตรรกะส่วนหัว SAA
หากต้องการใช้ส่วนหัวการเข้าถึงพื้นที่เก็บข้อมูลในโซลูชัน คุณต้องอัปเดตโซลูชัน สมมติว่าคุณเป็นเจ้าของ calendar.example
โค้ดวิดเจ็ตต้องมีสิทธิ์เข้าถึงพื้นที่เก็บข้อมูลเพื่อให้ website.example
โหลดวิดเจ็ต calendar.example
ที่ปรับเปลี่ยนในแบบของคุณได้
ฝั่งไคลเอ็นต์
ฟีเจอร์ส่วนหัวการเข้าถึงพื้นที่เก็บข้อมูลไม่จําเป็นต้องอัปเดตโค้ดฝั่งไคลเอ็นต์สําหรับโซลูชันที่มีอยู่ อ่านเอกสารประกอบเพื่อดูวิธีติดตั้งใช้งาน SAA
ฝั่งเซิร์ฟเวอร์
คุณสามารถใช้ส่วนหัวใหม่ฝั่งเซิร์ฟเวอร์ได้ ดังนี้
app.get('/cookie-access-endpoint', (req, res) => {
const storageAccessHeader = req.headers['sec-fetch-storage-access'];
if (storageAccessHeader === 'inactive') {
// User needs to grant permission, trigger a prompt
if (!validate_origin(req.headers.origin)) {
res.status(401).send(`${req.headers.origin} is not allowed to send` +
' credentialed requests to this server.');
return;
}
res.set('Activate-Storage-Access', `retry; allowed-origin="${req.headers.origin}"`);
res.status(401).send('This resource requires storage access. Please grant permission.');
} else if (storageAccessHeader === 'active') {
// User has granted permission, proceed with access
res.set('Activate-Storage-Access', 'load');
// Include the actual iframe content here
res.send('This is the content that requires cookie access.');
} else {
// Handle other cases (e.g., 'Sec-Fetch-Storage-Access': 'none')
}
});
ดูเดโมเพื่อดูว่าโซลูชันนี้ทํางานอย่างไร
อัปเดตตรรกะส่วนหัวของต้นทาง
เมื่อใช้ส่วนหัวการเข้าถึงพื้นที่เก็บข้อมูล Chrome จะส่งส่วนหัว Origin
ในคำขอมากกว่าที่เคย ซึ่งอาจส่งผลต่อตรรกะฝั่งเซิร์ฟเวอร์หากอาศัยส่วนหัว Origin ที่มีอยู่ในคำขอบางประเภทเท่านั้น (เช่น คำขอที่ CORS กำหนด)
คุณต้องตรวจสอบโค้ดฝั่งเซิร์ฟเวอร์เพื่อหลีกเลี่ยงปัญหาที่อาจเกิดขึ้น
- ตรวจสอบการตรวจสอบหรือตรรกะใดๆ ที่ขึ้นอยู่กับการมีส่วนหัว
Origin
- อัปเดตโค้ดให้จัดการกับส่วนหัว
Origin
ในกรณีที่พบบ่อยขึ้น
ข้อดีหลักๆ
เราขอแนะนำให้ใช้ส่วนหัวการเข้าถึงพื้นที่เก็บข้อมูลซึ่งเป็นวิธีที่มีประสิทธิภาพมากกว่าในการใช้ SAA โดยรวมแล้ว การเปลี่ยนแปลงนี้มีการปรับปรุงหลายประการ ดังนี้
- การรองรับการฝังที่ไม่ใช่ iframe: เปิดใช้ SAA สําหรับทรัพยากรที่หลากหลายมากขึ้น
- การใช้เครือข่ายลดลง: คำขอน้อยลงและเพย์โหลดมีขนาดเล็กลง
- การใช้งาน CPU ลดลง: การประมวลผล JavaScript น้อยลง
- UX ที่ดีขึ้น: กำจัดการโหลดขั้นกลางที่รบกวน
เข้าร่วมช่วงทดลองใช้จากต้นทาง
ช่วงทดลองใช้จากต้นทางช่วยให้คุณลองใช้ฟีเจอร์ใหม่ๆ และแสดงความคิดเห็นเกี่ยวกับความสามารถในการใช้งาน ประโยชน์ และประสิทธิภาพของฟีเจอร์เหล่านั้น ดูข้อมูลเพิ่มเติมได้ที่เริ่มต้นใช้งานการทดลองใช้ต้นทาง
คุณลองใช้ฟีเจอร์ส่วนหัวการเข้าถึงพื้นที่เก็บข้อมูลได้โดยลงทะเบียนเข้าร่วมการทดลองใช้แหล่งที่มาตั้งแต่ Chrome 130 เป็นต้นไป วิธีเข้าร่วมการทดลองใช้จากต้นทาง
- ไปที่หน้าการลงทะเบียนช่วงทดลองใช้ส่วนหัวการเข้าถึงพื้นที่เก็บข้อมูลจากต้นทาง
- ทำตามวิธีการเกี่ยวกับการเข้าร่วมการทดลองใช้เวอร์ชันต้นฉบับ
ทดสอบในเครื่อง
คุณสามารถทดสอบฟีเจอร์ส่วนหัวการเข้าถึงพื้นที่เก็บข้อมูลในเครื่องเพื่อให้แน่ใจว่าเว็บไซต์ของคุณพร้อมสำหรับการเปลี่ยนแปลงนี้
ทำตามขั้นตอนต่อไปนี้เพื่อกำหนดค่าอินสแตนซ์ Chrome
- เปิดใช้ Flag ของ Chrome ใน
chrome://flags/#storage-access-headers
- รีสตาร์ท Chrome เพื่อให้การเปลี่ยนแปลงมีผล
มีส่วนร่วมและแชร์ความคิดเห็น
หากมีความคิดเห็นหรือพบปัญหา คุณสามารถยื่นปัญหาได้ นอกจากนี้ คุณยังดูข้อมูลเพิ่มเติมเกี่ยวกับส่วนหัวการเข้าถึงพื้นที่เก็บข้อมูลได้ในคำอธิบายของ GitHub