בקשה לבידוד ביצועים באמצעות הכותרת 'אשכול סוכנים לפי מקור'

כותרת תגובת HTTP חדשה להגבלת כתיבת סקריפטים ברמת הדומיין ולבקשת משאבים ייעודיים מהדפדפן.

Domenic Denicola
Domenic Denicola

Origin-Agent-Cluster היא כותרת תגובה חדשה של HTTP, שמנחה את הדפדפן למנוע גישה סינכרונית ליצירת סקריפטים בין דפים ממקורות שונים באותו אתר. דפדפנים יכולים גם להשתמש ב-Origin-Agent-Cluster כרמז לכך שהמקור צריך לקבל משאבים נפרדים משלו, כמו תהליך ייעודי.

תאימות דפדפן

בשלב הזה, הכותרת Origin-Agent-Cluster מוטמעת רק ב-Chrome 88 ואילך. הוא תוכנן בשיתוף פעולה הדוק עם נציגים של Mozilla Firefox שסימנו אותו כיצירת אב טיפוס, וקיבל קבלה חיובית ראשונית מהנציגים של WebKit, מנוע הדפדפן שבו משתמש Safari.

אבל בינתיים, אין בעיה בפריסת הכותרת Origin-Agent-Cluster לכל המשתמשים שלכם היום. דפדפנים שלא מבינים את ההודעה, פשוט יתעלמו ממנה. בנוסף, מכיוון שדפים באשכולות סוכנים המשויכים למקור יכולים למעשה לעשות פחות דברים מאשר אלה עם קידוד לפי אתר (ברירת המחדל), אין בעיה ביכולת הפעולה ההדדית שצריך לחשוש.

למה דפדפנים לא יכולים להפריד באופן אוטומטי מקורות של אותו אתר

האינטרנט מבוסס על מדיניות המקור הזהה, שהיא תכונת אבטחה שמגבילה את האופן שבו מסמכים וסקריפטים יכולים לקיים אינטראקציה עם משאבים ממקור אחר. לדוגמה, דף שמתארח ב-https://a.example מגיע ממקור שונה מזה שב-https://b.example או מדף בדומיין https://sub.a.example.

מאחורי הקלעים, דפדפנים מפרידים בין המקורות בדרכים שונות. בעבר, למרות שמקורות נפרדים לא היו יכולים לגשת לנתונים אחד של השני, הם עדיין שיתפו משאבים כמו שרשורים של מערכת ההפעלה, תהליכים והקצאת זיכרון. כלומר, אם כרטיסייה אחת תהיה איטית, היא תאט את כל שאר הכרטיסיות. לחלופין, אם כרטיסייה אחת משתמשת ביותר מדי זיכרון, היא תגרום לקריסת הדפדפן כולו.

הדפדפנים כיום הם מתוחכמים יותר, ומנסים להפריד בין מקורות שונים לתהליכים שונים. האופן שבו זה עובד בדיוק משתנה בהתאם לדפדפן: ברוב הדפדפנים יש הפרדה מסוימת בין כרטיסיות, אבל מסגרות iframe שונות בכרטיסייה אחת עשויות לחלוק תהליך. מכיוון שתהליכים נובעים מתקורה מסוימת של הזיכרון, הם משתמשים בהיוריסטיקה כדי למנוע יותר מדי תקריות. למשל, ב-Firefox יש הגבלת תהליכים שהמשתמש יכול להגדיר, והתנהגות Chrome משתנה בין מחשבים (שבהם יש הרבה יותר זיכרון) לבין מכשירים ניידים (שבהם אין מספיק).

ההיוריסטיקה האלה לא מושלמת. ויש להם מגבלה חשובה: בגלל שיש חריגים לאותה מדיניות מקור זהה שמאפשרת לתת-דומיינים כמו https://sub.a.example ו-https://a.example לדבר זה עם זה, הדפדפנים לא יכולים להפריד באופן אוטומטי תת-דומיינים זה מזה.

התנהגות ברירת המחדל הזו נקראת 'אשכולות סוכנים המשויכים לאתר': כלומר, הדפדפן מקבץ דפים על סמך האתר שלהם. הכותרת החדשה Origin-Agent-Cluster מבקשת מהדפדפן לשנות את התנהגות ברירת המחדל הזו לדף נתון, ומוסיפה אותו לאשכול סוכנים המשויכים למקור, כך שהוא יקובץ רק עם דפים אחרים מאותו מקור בדיוק. באופן ספציפי, דפים ממקורות שונים מאותו אתר יוחרגו מאשכול הסוכנים.

הפרדת ההסכמה הזו מאפשרת לדפדפנים לתת לאשכולות הסוכנים החדשים האלה המשויכים למקור מידע משלהם למשאבים ייעודיים משלהם, שאינם משולבים עם מקורות אחרים. לדוגמה, דפים כאלה יכולים לקבל תהליך משלהם או לתזמן שרשורים נפרדים. הוספה של הכותרת Origin-Agent-Cluster לדף היא סימן לכך לדפדפן שהדף יפיק תועלת ממשאבים ייעודיים כאלה.

עם זאת, כדי לבצע את ההפרדה וליהנות מהיתרונות האלה, הדפדפן צריך להשבית כמה תכונות מדור קודם.

מה לא ניתן לעשות בדפים עם קידוד לפי מקור

כשהדף נמצא באשכול סוכנים המשויכים למקור, יש לכם אפשרות לדבר עם דפים ממקורות שונים שהיו זמינים בעבר מאותו אתר. הקפידו במיוחד על הדברים הבאים:

  • אי אפשר יותר להגדיר את document.domain. זאת תכונה מדור קודם שבדרך כלל מאפשרת לדפים ממקורות שונים מאותו אתר לגשת באופן סינכרוני ל-DOM של כל אחד אחר, אבל באשכולות סוכנים המשויכים למקור היא מושבתת.

  • אי אפשר יותר לשלוח אובייקטים WebAssembly.Module לדפים אחרים ממקורות שונים באותו אתר דרך postMessage().

  • (ל-Chrome בלבד) אי אפשר יותר לשלוח אובייקטים SharedArrayBuffer או WebAssembly.Memory לדפים אחרים ממקורות שונים באותו אתר.

מתי כדאי להשתמש באשכולות סוכנים המשויכים למקור

המקורות שמהם מפיקים הכי הרבה תועלת מהכותרת Origin-Agent-Cluster הם:

  • להשיג את הביצועים הטובים ביותר בעזרת המשאבים הייעודיים שלהם, כשהדבר אפשרי. לדוגמה, משחקים עתירי ביצועים, אתרים לשיחות ועידה בווידאו או אפליקציות ליצירת מולטימדיה.

  • מכיל מסגרות iframe שצורכות משאבים רבים ממקורות שונים, אבל באותו אתר. לדוגמה, אם ב-https://mail.example.com מוטמע iframes של https://chat.example.com, קידוד המקור https://mail.example.com/ מבטיח שהקוד שנכתב על ידי צוות הצ'אט לא יוכל להפריע בטעות לקוד שנכתב על ידי צוות הדואר, ויכול לרמוז לדפדפן כדי לספק תהליכים נפרדים לתזמון שלהם באופן עצמאי ולצמצם את ההשפעה שלהם על הביצועים זה על זה.

  • הם צריכים להיות מוטמעים בדפים ממקור אחר באותו אתר, אבל חשוב לדעת שהם צורכים משאבים רבים. לדוגמה, אם https://customerservicewidget.example.com רוצה להשתמש בהרבה משאבים לווידאו צ'אט והוא יוטמע במקורות שונים ב-https://*.example.com, הצוות שמנהל את הווידג'ט הזה יוכל להשתמש בכותרת Origin-Agent-Cluster כדי לנסות לצמצם את ההשפעה על הביצועים של הטמעות.

בנוסף, צריך גם לוודא שאפשר להשבית את תכונות התקשורת ממקורות שונים שצוינו למעלה, ושהאתר משתמש ב-HTTPS.

אבל בסופו של דבר, אלה רק הנחיות. האם אשכולות סוכנים המשויכים למקור יעזרו לאתר שלכם או לא, נקבע בסופו של דבר בצורה הטובה ביותר באמצעות מדידות. באופן ספציפי, כדאי למדוד את מדדי ה-Web Vitals, ואולי גם את השימוש בזיכרון, כדי לראות את ההשפעה של קידוד המקור. (במיוחד השימוש בזיכרון הוא חשש פוטנציאלי, כי הגדלת מספר התהליכים בהפעלה עלולה לגרום לתקורת זיכרון גדולה יותר לכל תהליך). לא צריך פשוט לפרוס את קוד המקור ולקוות לטוב.

איך זה קשור לבידוד בין מקורות?

קידוד המקור של אשכולות סוכנים דרך הכותרת Origin-Agent-Cluster קשור לבידוד בין מקורות באמצעות הכותרות Cross-Origin-Opener-Policy ו-Cross-Origin-Embedder-Policy, אבל בנפרד.

כל אתר שיבודד ממקורות שונים תשבית גם את אותן תכונות תקשורת ממקורות שונים באותו אתר כמו בשימוש בכותרת Origin-Agent-Cluster. עם זאת, הכותרת Origin-Agent-Cluster עדיין יכולה להיות שימושית בבידוד בין מקורות, כרמז נוסף לדפדפן לשנות את היוריסטיקה שלו להקצאת המשאבים. לכן כדאי להחיל את הכותרת Origin-Agent-Cluster ולמדוד את התוצאות, גם בדפים שכבר מבודדים בין מקורות.

איך להשתמש בכותרת Origin-Agent-Cluster

כדי להשתמש בכותרת Origin-Agent-Cluster, מגדירים ששרת האינטרנט ישלח את הכותרת הבאה של תשובת HTTP:

Origin-Agent-Cluster: ?1

הערך של ?1 הוא תחביר הכותרת המובנית של ערך בוליאני של true.

חשוב לשלוח את הכותרת הזו בכל התגובות מהמקור, לא רק בדפים מסוימים. אחרת, עשויות להתקבל תוצאות לא עקביות, שבהן הדפדפן "זוכר" לראות בקשה לקידוד מקור, ולכן הוא כולל מפתחות מקור גם בדפים שלא מבקשים אותה. או להיפך: אם בדף הראשון שאליו המשתמש נכנס אין כותרת, הדפדפן יזכור שלא רוצים שהמקור יופיע בקידוד לפי מקור, ויתעלם מהכותרת בדפים הבאים.

למה הדפדפן לא תמיד יכול לפעול בהתאם לכותרת?

הסיבה ל'זיכרון' הזה היא כדי לשמור על עקביות של הזנה של מקור מסוים. אם דפים מסוימים במקור נוצרו עם קידוד לפי מקור ואחרים לא, יכול להיות שיש שני דפים מאותו מקור שהוכנסו לאשכולות סוכנים שונים, ולכן לא היה אפשר לתקשר זה עם זה. זה יהיה מוזר מאוד, גם למפתחי אתרים וגם לחלק הפנימי של הדפדפן. לכן, המפרט של Origin-Agent-Cluster מתעלם מהכותרת אם היא לא תואמת למה שראינו בעבר לגבי מקור נתון. ב-Chrome, פעולה כזו תגרום להצגת אזהרה במסוף.

העקביות הזו בהיקף של קבוצת הקשר לגלישה, שהיא קבוצה של כרטיסיות, חלונות או מסגרות iframe שיכולים להגיע זה לזה באמצעות מנגנונים כמו window.opener, frames[0] או window.parent. המשמעות היא שברגע שהוסדרת הגדרת ה-ACL של המקור או של האתר (על ידי הדפדפן רואה או לא רואה את הכותרת), כדי לשנות אותו, צריך לפתוח כרטיסייה חדשה לגמרי, ולא להיות מחוברת בכל צורה שהיא לכרטיסייה הישנה.

הפרטים האלה יכולים להיות חשובים לבדיקת הכותרת של Origin-Agent-Cluster. כשמוסיפים אותו לאתר בפעם הראשונה, אין טעם לטעון מחדש את הדף. יהיה עליך לסגור את הכרטיסייה ולפתוח כרטיסייה חדשה.

כדי לבדוק אם הכותרת Origin-Agent-Cluster מוחלת, צריך להשתמש במאפיין window.originAgentCluster של JavaScript. הערך יהיה true במקרים שבהם הכותרת (או מנגנונים אחרים, כמו בידוד חוצה-מקורות) גרמו ליצירת קידוד לפי מקור; false במקרה שבו היא לא גרמה; ו-undefined בדפדפנים שלא הטמיעו את הכותרת Origin-Agent-Cluster. רישום הנתונים האלה בפלטפורמה לניתוח הנתונים יכול לספק בדיקה חשובה שהגדרתם את השרת בצורה נכונה.

לסיום, חשוב לשים לב שהכותרת Origin-Agent-Cluster תפעל רק בהקשרים מאובטחים, כלומר בדפי HTTPS או ב-http://localhost. דפי HTTP שאינם מקומיים מארח לא תומכים באשכולות סוכנים המשויכים למקור.

קידוד מקור הוא לא אמצעי אבטחה

השימוש באשכול סוכנים המשויכים למקור מבודד את המקור מגישה מסונכרנת מדפים ממקורות שונים באותו אתר, אבל הוא לא מספק הגנה על כותרות שקשורות לאבטחה כמו Cross-Origin-Resource-Policy ו-Cross-Origin-Opener-Policy. באופן ספציפי, היא לא מספקת הגנה אמינה מפני מתקפות בערוץ צדדי כמו Spectre.

זה אולי קצת מפתיע, כי קידוד לפי מקור יכול לפעמים לגרום למקור לקבל תהליך משלו, ותהליכים נפרדים הם הגנה חשובה מפני התקפות ערוץ צדדי. אבל חשוב לזכור שהכותרת Origin-Agent-Cluster היא רק רמז בנושא הזה. הדפדפן לא מחויב לתת למקור תהליך נפרד, ויכול להיות שהוא לא עושה זאת מסיבות שונות:

  • יכול להיות שהטכנולוגיה הזו לא מיושמת בדפדפן. לדוגמה, נכון לעכשיו, Safari ו-Firefox יכולים להוסיף כרטיסיות נפרדות לתהליכים משלהם, אבל עדיין לא לעשות זאת בשביל iframes.

  • הדפדפן עשוי להחליט שלא כדאי להשקיע את התקורה של תהליך נפרד. לדוגמה, במכשירי Android עם נפח זיכרון נמוך או ב-Android WebView, Chrome משתמש בכמה שפחות תהליכים.

  • יכול להיות שהדפדפן ירצה לכבד את הבקשה שצוינה בכותרת Origin-Agent-Cluster, אבל הוא יכול לעשות זאת באמצעות טכנולוגיית בידוד שונה מזו של תהליכים. לדוגמה, Chrome בודק באמצעות שרשורים במקום תהליכים לבידוד ביצועים כזה.

  • יכול להיות שהמשתמש, או הקוד שפועל באתר אחר, כבר ניווט לדף עם קידוד לפי אתר במקור שלכם, וגרם להתחייבות לעקביות להתחיל להיכנס ולהתעלמות מהכותרת Origin-Agent-Cluster.

לכן, חשוב לא להתייחס לאשכולות סוכנים המשויכים למקור כתכונת אבטחה. במקום זאת, זוהי דרך לעזור לדפדפן לתעדף את הקצאת המשאבים, כי היא רומזת על כך שהמקור יפיק תועלת ממשאבים ייעודיים (ואתם מוכנים לוותר על תכונות מסוימות בתמורה לכך).

משוב

הצוות של Chrome ישמח לשמוע מה דעתך אם אתם משתמשים בכותרת Origin-Agent-Cluster או שוקלים להשתמש בה. העניין הציבורי והתמיכה שלכם עוזרים לנו לתת עדיפות לתכונות ולהראות לספקי דפדפנים אחרים עד כמה הן חשובות. שולחים ציוץ אל @ChromiumDev ומעדכנים את Chrome DevRel במחשבות ובחוויות שלכם.

אם יש לכם שאלות נוספות לגבי המפרט או פרטים על אופן הפעולה של התכונה, תוכלו לדווח על בעיה במאגר HTML Standard GitHub. אם תיתקלו בבעיות בהטמעה של Chrome, תוכלו לדווח על באג בכתובת new.crbug.com כששדה הרכיבים מוגדר ל-Internals>Sandbox>SiteIsolation.

מידע נוסף

כדי לקבל מידע נוסף על אשכולות סוכנים המשויכים למקור, אפשר להתעמק בפרטים בקישורים הבאים: