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

כותרת תגובה חדשה של 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, כך שהוא יקובץ רק עם דפים אחרים שיש להם את אותו מקור בדיוק. באופן ספציפי, דפים ממקורות שונים באותו אתר יוחרגו מאשכול הסוכנים.

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

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

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

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

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

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

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

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

המקורות שהכי נהנים מהכותרת Origin-Agent-Cluster הם אלה:

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

  • מכיל iframes עם שימוש רב במשאבים שמקורם שונה אבל באותו אתר. לדוגמה, אם 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. כלומר, לאחר שהוסדרת הגדרת קידוד לפי אתר או מקור של מקור (על ידי הדפדפן רואה או לא רואה את הכותרת), כדי לשנות אותו, צריך לפתוח כרטיסייה חדשה לגמרי, שלא תהיה מחוברת בכל צורה שהיא לכרטיסייה הישנה.

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

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

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

מפתחות מקור הם לא תכונת אבטחה

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

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

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

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

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

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

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

משוב

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

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

מידע נוסף

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