אנחנו מתחילים ב-Chrome גרסת מקור לניסיון להוספת כותרות HTTP ל-Storage Access API (SAA) בגרסה 130: כותרות גישה לאחסון. הכותרת החדשה של הבקשה Sec-Fetch-Storage-Access
והכותרת החדשה של התגובה Activate-Storage-Access
נועדו לתמוך במשאבים שאינם iframe, ולשפר את הביצועים ואת חוויית המשתמש באתרים שמסתמכים על תוכן מוטמע, כמו ווידג'טים של רשתות חברתיות, יומנים וכלים אינטראקטיביים.
תהליך העבודה ב-JavaScript (והמגבלות שלו)
בעבר, כדי להשתמש ב-SAA נדרשה קריאה ל-JavaScript API אל document.requestStorageAccess()
בכל טעינת מחדש, גם אם המשתמש כבר העניק הרשאה. השיטה הזו יעילה, אבל יש לה מגבלות:
- מספר סבבים של הודעות חזרה ו forth ברשת: התהליך כלל בדרך כלל כמה בקשות לרשת וטעינות מחדש של דפים לפני שהתוכן המוטמע יכול היה לפעול באופן מלא.
- תלות ב-iframe: כדי להריץ JavaScript, צריך להשתמש ב-iframe או במשאבי משנה בתוך iframe, מה שמגביל את הגמישות של המפתחים.
לדוגמה, ווידג'ט של יומן מ-calendar.example
שמוטמע ב-website.example
באמצעות JavaScript בלבד ייראה כך:
- טעינת placeholder:
website.example
מבקש את הווידג'ט. מכיוון שלווידג'טcalendar.example
שמוטמע ב-website.example
אין גישה לקובצי ה-cookie שלו שלא חולקו למחיצות, במקום זאת נערך עיבוד של ווידג'ט placeholder. - בקשת הרשאה: ה-placeholder נטען, ולאחר מכן מתבצעת קריאה ל-
document.requestStorageAccess()
כדי לבקש הרשאה ל-storage-access
. - המשתמש בוחר להעניק הרשאה.
- טעינה מחדש של הווידג'ט: הווידג'ט יתעדכן, הפעם עם גישה לקובצי cookie, ובסופו של דבר התוכן המותאם אישית ייטען.
- בכל פעם שהמשתמש מבקר שוב באתר שמוטמע בו הווידג'ט
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
בבקשות מכמה אתרים שעשויות לדרוש פרטי כניסה (כמו קובצי cookie). הכותרת הזו מציינת את סטטוס הרשאת הגישה של קובץ ה-Cookie להטמעה. כך מפרשים את הערכים שלו:
none
: לקוד ההטמעה אין את ההרשאהstorage-access
, ולכן אין לו גישה לקובצי cookie שלא חולקו למחיצות.inactive
: להטמעה יש את ההרשאהstorage-access
, אבל לא הבעת הסכמה לשימוש בה. להטמעה אין גישה לקובצי cookie ללא חלוקה למחיצות.active
: להטמעה יש גישה לקובצי cookie ללא חלוקה למחיצות. הערך הזה ייכלל בכל בקשות מאתרים שונים שיש להן גישה לקובצי cookie שלא חולקו למחיצות.
כותרות תגובה
Activate-Storage-Access: <retry-or-reload>
הכותרת Activate-Storage-Access
מורה לדפדפן לנסות שוב את הבקשה עם קובצי cookie או לטעון את המשאב ישירות עם הפעלת SAA. הכותרת יכולה לקבל את הערכים הבאים:
load
: מורה לדפדפן להעניק למטמיע גישה לקובצי cookie ללא חלוקה למחיצות עבור המשאב המבוקש.retry
: השרת משיב שהדפדפן צריך להפעיל את הרשאת הגישה לאחסון, ואז לנסות שוב את הבקשה.
Activate-Storage-Access: retry; allowed-origin="https://site.example"
Activate-Storage-Access: retry; allowed-origin=*
Activate-Storage-Access: load
תמיכה במשאבים שאינם iframe
העדכון של כותרות הגישה לאחסון מאפשר להשתמש ב-SAA בתוכן מוטמע שאינו iframe, כמו תמונות שמתארחות בדומיין אחר. בעבר, אף ממשק API של פלטפורמת אינטרנט לא איפשר לטעון משאבים כאלה עם פרטי כניסה בדפדפנים אם קובצי cookie של צד שלישי לא זמינים.
לדוגמה, ה-embedding-site.example
יכול לבקש תמונה:
<img src="https://server.example/image"/>
והשרת יכול להגיב עם תוכן או שגיאה, בהתאם לכך אם קובץ cookie זמין:
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");
}
});
אם קובץ ה-cookie לא זמין, השרת בודק את הערך של כותרת הבקשה Sec-Fetch-Storage-Access
. אם הערך הזה מוגדר כ-inactive
, השרת משיב עם הכותרת Activate-Storage-Access: retry
, שמציינת שצריך לנסות שוב את הבקשה עם גישה לאחסון. אם אין קובץ cookie ובכותרת Sec-Fetch-Storage-Access
לא מופיע הערך inactive, התמונה לא תיטען.
תהליך העברת כותרות HTTP
בעזרת כותרות HTTP, הדפדפן יכול לזהות מתי המשתמש כבר העניק לווידג'ט הרשאת גישה לאחסון, ולטעון את ה-iframe עם גישה לקובצי cookie שלא חולקו למחיצות במהלך ביקורים הבאים.
כשמשתמשים בכותרות של גישה לאחסון, הביקורים בדפים הבאים יפעילו את התהליך הבא:
- המשתמש מבקר שוב ב-
website.example
שבו מוטמע ה-calendar.example
. לאחזור הזה עדיין אין גישה לקובץ ה-cookie, כמו קודם. עם זאת, המשתמש העניק בעבר הרשאהstorage-access
, והאחזור כולל כותרתSec-Fetch-Storage-Access: inactive
כדי לציין שגישה לקובצי cookie ללא חלוקה למחיצות זמינה אבל לא בשימוש. - שרת
calendar.example
משיב עם כותרתActivate-Storage-Access: retry; allowed-origin="<origin>"
(במקרה הזה,<origin>
יהיהhttps://website.example
), כדי לציין שהאחזור של המשאב מחייב שימוש בקובצי cookie ללא חלוקה למחיצות עם הרשאת גישה לאחסון. - הדפדפן מנסה שוב את הבקשה, הפעם כולל קובצי cookie שלא חולקו למחיצות (הפעלת ההרשאה
storage-access
לאחזור הזה). - השרת
calendar.example
מגיב עם תוכן ה-iframe המותאם אישית. התשובה כוללת כותרתActivate-Storage-Access: load
כדי לציין שהדפדפן צריך לטעון את התוכן עם ההרשאהstorage-access
מופעלת (כלומר, טעינה עם גישה לקובצי cookie ללא חלוקה למחיצות, כאילו הופעלהdocument.requestStorageAccess()
). - סוכן המשתמש טוען את תוכן ה-iframe עם גישה לקובצי cookie ללא חלוקה למחיצות באמצעות הרשאת הגישה לאחסון. אחרי השלב הזה, הווידג'ט אמור לפעול כצפוי.
עדכון הפתרון
כשמשתמשים בתכונה 'כותרות גישה לאחסון', כדאי לעדכן את הקוד בשני מקרים:
- אתם משתמשים ב-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 במגוון רחב יותר של משאבים.
- צמצום השימוש ברשת: פחות בקשות ופחות עומסי נתונים.
- שימוש נמוך יותר במעבד: פחות עיבוד של JavaScript.
- חוויית משתמש משופרת: אין יותר עומסי ביניים שמפריעים.
השתתפות בתוכנית הניסוי למקורות
גרסאות מקור לניסיון מאפשרות לכם לנסות תכונות חדשות ולתת משוב על נוחות השימוש, הפרקטיות והיעילות שלהן. מידע נוסף זמין במאמר תחילת העבודה עם ניסויים במקור.
אתם יכולים לנסות את התכונה 'כותרות גישה לאחסון' על ידי הרשמה לגרסת הבטא של המקור, החל מגרסת Chrome 130. כדי להשתתף בתוכנית הניסיון למקורות:
- עוברים לדף הרישום לגרסת הטרום של Storage Access Headers.
- פועלים לפי ההוראות להשתתפות בתוכנית הניסוי למקורות.
בדיקה מקומית
אתם יכולים לבדוק את התכונה 'כותרות גישה לאחסון' באופן מקומי כדי לוודא שהאתר שלכם מוכן לשינוי הזה.
כדי להגדיר את מכונה של Chrome:
- מפעילים את הדגל של Chrome ב-
chrome://flags/#storage-access-headers
. - כדי שהשינויים ייכנסו לתוקף, צריך להפעיל מחדש את Chrome.
יצירת מעורבות ושיתוף משוב
אם יש לכם משוב או נתקלתם בבעיות, אתם יכולים לדווח על בעיה. מידע נוסף על כותרות הגישה לאחסון זמין במאמר ההסבר ב-GitHub.