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

כותרת תגובה חדשה של 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.

מידע נוסף

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