Коли користувач переходить за посиланням чи сторінка завантажує сторонній ресурс (зображення, скрипт), браузер надсилає заголовок Referer - адресу сторінки, звідки прийшов запит.
Чим це небезпечно: URL часто містить те, що не повинно потрапляти на інші сайти:
- токени - посилання для скидання пароля (
/reset-password?token=...), підтвердження email, запрошення; - ідентифікатори й персональні дані -
/orders/9921,/patients/42, пошукові запити з іменами; - внутрішні адреси адмінок і службових сторінок.
Якщо на сторінці скидання пароля є посилання на зовнішній сайт чи підключено сторонній скрипт аналітики, токен опиниться в їхніх логах.
Referrer-Policy керує, скільки інформації передавати:
| Значення | Що отримує інший сайт |
|---|---|
no-referrer |
нічого |
same-origin |
повний URL лише для свого походження, іншим - нічого |
strict-origin |
лише походження (https://example.com/), і нічого при переході з HTTPS на HTTP |
strict-origin-when-cross-origin |
повний URL для своїх, лише походження для чужих, нічого при пониженні до HTTP |
unsafe-url |
завжди повний URL - небезпечно |
Referrer-Policy: strict-origin-when-cross-origin
strict-origin-when-cross-origin - типове значення сучасних браузерів, якщо політику не задано. Але покладатися на значення за замовчуванням не варто - краще задати явно.
Для чутливих сторінок (скидання пароля, сторінки з токенами в URL) - no-referrer на рівні сторінки чи окремого посилання:
<meta name="referrer" content="no-referrer">
<a href="https://external.example" rel="noreferrer">...</a>
Кращий підхід - не тримати секрети в URL узагалі: токен з посилання одразу обміняти на сесію чи прибрати з адресного рядка після першого використання (history.replaceState чи редирект на чисту адресу).
Аналітика: деякі маркетингові інструменти покладаються на повний Referer. Компроміс - strict-origin-when-cross-origin, а не unsafe-url: для аналізу джерел трафіку зазвичай досить домену.