---
title: "Nagłówki bezpieczeństwa HTTP: Kompletny przewodnik"
description: "Jak zabezpieczyć stronę za pomocą nagłówków HTTP: HSTS, CSP, X-Frame-Options, Permissions-Policy. Konfiguracja dla Apache, Nginx, Node.js i platform hostingowych."
date: 2016-11-15
updated: 2026-04-19
category: Bezpieczeństwo
tags: ["Security", "HTTP Headers", "HSTS", "CSP", "htaccess", "nginx"]
url: https://uper.pl/blog/naglowki-bezpieczenstwa-http/
---

# Nagłówki bezpieczeństwa HTTP: Kompletny przewodnik

Odpowiednia konfiguracja nagłówków HTTP to pierwsza linia obrony przed wieloma atakami na strony internetowe. Chronią użytkowników przed XSS, clickjackingiem, man-in-the-middle i innymi zagrożeniami. Ten przewodnik przedstawia wszystkie kluczowe nagłówki bezpieczeństwa wraz z konfiguracją dla różnych serwerów.

## Dlaczego nagłówki bezpieczeństwa są ważne?

- Chronią przed atakami XSS, clickjacking, MIME sniffing
- Wymuszają połączenie HTTPS
- Kontrolują dostęp do funkcji przeglądarki
- Są sprawdzane przez audyty bezpieczeństwa
- Wpływają na ocenę w narzędziach jak [SecurityHeaders.com](https://securityheaders.com/)

## 1. Strict-Transport-Security (HSTS)

**HSTS** wymusza połączenie HTTPS dla wszystkich żądań, eliminując możliwość ataku man-in-the-middle.

```http
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
```

### Parametry

| Parametr | Znaczenie |
|----------|-----------|
| `max-age` | Czas ważności w sekundach (31536000 = 1 rok) |
| `includeSubDomains` | Stosuj dla wszystkich subdomen |
| `preload` | Pozwól na dodanie do preload list przeglądarek |

### HSTS Preload List

Dodanie do [HSTS Preload List](https://hstspreload.org/) oznacza, że przeglądarki będą wymuszać HTTPS nawet przy pierwszej wizycie. Wymagania:
- Ważny certyfikat SSL
- Przekierowanie HTTP → HTTPS
- HSTS z `max-age` minimum 1 rok
- Dyrektywy `includeSubDomains` i `preload`

**Uwaga:** HSTS jest nieodwracalny przez czas `max-age`. Zacznij od krótkiego okresu (np. 300 sekund) i stopniowo zwiększaj.

## 2. Content-Security-Policy (CSP)

**CSP** definiuje dozwolone źródła dla skryptów, stylów, obrazów i innych zasobów. To najważniejszy nagłówek ochrony przed XSS.

```http
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; frame-ancestors 'self'
```

### Główne dyrektywy

| Dyrektywa | Kontroluje |
|-----------|------------|
| `default-src` | Domyślne źródło dla wszystkich typów |
| `script-src` | Skrypty JavaScript |
| `style-src` | Style CSS |
| `img-src` | Obrazy |
| `font-src` | Fonty |
| `connect-src` | XHR, fetch, WebSocket |
| `frame-src` | Źródła dla iframe |
| `frame-ancestors` | Kto może osadzić stronę w iframe |

### Tryb Report-Only

Testuj CSP bez blokowania:

```http
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
```

Szczegółowy przewodnik: [CSP dla Google Services](/blog/csp-google-services/)

## 3. X-Frame-Options

**X-Frame-Options** chroni przed atakami clickjacking, kontrolując czy strona może być osadzona w iframe.

```http
X-Frame-Options: SAMEORIGIN
```

### Wartości

| Wartość | Znaczenie |
|---------|-----------|
| `DENY` | Nigdy nie pozwól na iframe |
| `SAMEORIGIN` | Tylko z tej samej domeny |
| `ALLOW-FROM uri` | Tylko z określonego źródła (przestarzałe) |

**Uwaga:** CSP `frame-ancestors` jest nowszą alternatywą. Użyj obu dla kompatybilności wstecznej.

## 4. X-Content-Type-Options

**X-Content-Type-Options** zapobiega "MIME sniffing" - próbom przeglądarki odgadnięcia typu pliku.

```http
X-Content-Type-Options: nosniff
```

Bez tego nagłówka przeglądarka może zinterpretować plik tekstowy jako JavaScript, co umożliwia atak XSS.

## 5. Referrer-Policy

**Referrer-Policy** kontroluje jakie informacje o źródle są wysyłane przy nawigacji.

```http
Referrer-Policy: strict-origin-when-cross-origin
```

### Wartości

| Wartość | Znaczenie |
|---------|-----------|
| `no-referrer` | Nigdy nie wysyłaj referrera |
| `same-origin` | Tylko dla tej samej domeny |
| `strict-origin` | Tylko domena, nie przy downgrade HTTPS→HTTP |
| `strict-origin-when-cross-origin` | Pełny URL dla same-origin, domena dla cross-origin (rekomendowane) |

## 6. Permissions-Policy

**Permissions-Policy** (dawniej Feature-Policy) kontroluje dostęp do funkcji przeglądarki jak geolokalizacja, kamera czy mikrofon.

```http
Permissions-Policy: geolocation=(), microphone=(), camera=(), payment=()
```

### Składnia

- `()` - zablokowane dla wszystkich
- `(self)` - tylko ta domena
- `*` - dozwolone dla wszystkich

### Popularne funkcje

| Funkcja | Kontroluje |
|---------|-----------|
| `geolocation` | API geolokalizacji |
| `microphone` | Dostęp do mikrofonu |
| `camera` | Dostęp do kamery |
| `payment` | Payment Request API |
| `fullscreen` | Fullscreen API |

## 7. Cross-Origin Isolation (COOP, COEP, CORP)

Trzy powiązane nagłówki kontrolujące, jak Twoja strona wchodzi w interakcje z innymi originami — wspólnie tworzą **cross-origin isolation**, która chroni przed atakami typu Spectre i odblokowuje funkcje jak `SharedArrayBuffer`.

- **Cross-Origin-Opener-Policy (COOP)** — kto ma dostęp do Twojego `window`. Bezpieczny domyślny wybór to `same-origin-allow-popups` — chroni przed tabnappingiem, nie łamiąc popupów OAuth, Stripe ani YouTube.
- **Cross-Origin-Embedder-Policy (COEP)** — wymusza, aby zasoby cross-origin wyraziły zgodę na osadzenie. Potrzebny tylko, gdy chcesz `crossOriginIsolated === true`.
- **Cross-Origin-Resource-Policy (CORP)** — ustawiany na zasobach, które *Ty hostujesz*, aby kontrolować, kto może je ładować.

```http
Cross-Origin-Opener-Policy: same-origin-allow-popups
Cross-Origin-Resource-Policy: same-site
```

Ustawienie `COOP: same-origin` (pełna izolacja) po cichu łamie wiele integracji third-party (YouTube Share, Stripe Checkout, popupy Google Sign-In). Jeśli potrzebujesz SharedArrayBuffer, zaakceptuj ten tradeoff; w przeciwnym razie zostań przy `same-origin-allow-popups`.

Pełne omówienie — `crossOriginIsolated`, narzędzia debugowania, gotowe konfiguracje dla stron marketingowych vs. aplikacji WASM — znajdziesz w dedykowanym przewodniku: [COOP, COEP, CORP — cross-origin isolation po polsku](/blog/coop-coep-corp-cross-origin-isolation/).

## 8. X-XSS-Protection (przestarzały)

**X-XSS-Protection** aktywował wbudowany filtr XSS w starszych przeglądarkach. Jest **przestarzały** - współczesne przeglądarki (Chrome 78+) usunęły ten filtr.

```http
X-XSS-Protection: 0
```

**Dlaczego 0?** Wartość `1; mode=block` może powodować side-channel attacks. Użyj CSP zamiast tego nagłówka.

## Kompletna konfiguracja

### Apache (.htaccess)

```apache

```

### Nginx

```nginx
server {
    # HSTS
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    # CSP
    add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; frame-ancestors 'self'" always;

    # Clickjacking
    add_header X-Frame-Options "SAMEORIGIN" always;

    # MIME sniffing
    add_header X-Content-Type-Options "nosniff" always;

    # Referrer
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;

    # Permissions
    add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;

    # XSS filter disabled
    add_header X-XSS-Protection "0" always;
}
```

### Node.js (Express + Helmet)

```javascript
const helmet = require('helmet');

app.use(helmet({
  contentSecurityPolicy: {
    directives: {
      defaultSrc: ["'self'"],
      scriptSrc: ["'self'"],
      styleSrc: ["'self'", "'unsafe-inline'"],
      imgSrc: ["'self'", "data:", "https:"],
      frameAncestors: ["'self'"]
    }
  },
  hsts: {
    maxAge: 31536000,
    includeSubDomains: true,
    preload: true
  },
  frameguard: { action: 'sameorigin' },
  noSniff: true,
  referrerPolicy: { policy: 'strict-origin-when-cross-origin' },
  xssFilter: false
}));
```

### Netlify (netlify.toml)

```toml
[[headers]]
  for = "/*"
  [headers.values]
    Strict-Transport-Security = "max-age=31536000; includeSubDomains; preload"
    X-Frame-Options = "SAMEORIGIN"
    X-Content-Type-Options = "nosniff"
    Referrer-Policy = "strict-origin-when-cross-origin"
    Permissions-Policy = "geolocation=(), microphone=(), camera=()"
```

### Vercel (vercel.json)

```json
{
  "headers": [
    {
      "source": "/(.*)",
      "headers": [
        { "key": "Strict-Transport-Security", "value": "max-age=31536000; includeSubDomains; preload" },
        { "key": "X-Frame-Options", "value": "SAMEORIGIN" },
        { "key": "X-Content-Type-Options", "value": "nosniff" },
        { "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" }
      ]
    }
  ]
}
```

## Testowanie nagłówków

### SecurityHeaders.com

[https://securityheaders.com/](https://securityheaders.com/) - szybki skan z oceną A-F.

### Observatory by Mozilla

[https://observatory.mozilla.org/](https://observatory.mozilla.org/) - kompleksowy audyt bezpieczeństwa.

### Chrome DevTools

1. Otwórz DevTools (F12)
2. Zakładka **Network**
3. Wybierz dokument HTML
4. Sprawdź **Response Headers**

### curl

```bash
curl -I https://example.com
```

## Checklist bezpieczeństwa

### Krytyczne
- [ ] **HSTS** - wymuszenie HTTPS
- [ ] **X-Frame-Options** - ochrona przed clickjacking
- [ ] **X-Content-Type-Options: nosniff**

### Rekomendowane
- [ ] **CSP** - ochrona przed XSS
- [ ] **Referrer-Policy** - kontrola informacji o źródle
- [ ] **Permissions-Policy** - ograniczenie API przeglądarki

### Przestarzałe (wyłącz)
- [ ] **X-XSS-Protection: 0** - wyłączenie legacy filtra

## Audyt nagłówków bezpieczeństwa z UPER SEO Auditor

Do szybkiej, wizualnej weryfikacji każdego nagłówka omawianego w tym przewodniku zainstaluj naszą wtyczkę Chrome **[UPER SEO Auditor](https://chromewebstore.google.com/detail/uper-seo-auditor/khhpbeckpphaoiemjdijhbfpjnendage)**. Zakładka Security pokazuje:

- **Status połączenia HTTPS** z natychmiastowym wskaźnikiem czerwone/zielone.
- **10 sprawdzanych nagłówków bezpieczeństwa** z ważonym scorem: HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, COOP, COEP, CORP, X-XSS-Protection.
- **Łączny score 0-10** ważony istotnością nagłówków — HSTS i CSP liczą się podwójnie.
- **Parser dyrektyw CSP** — każda dyrektywa i źródło wypisane osobno, od razu widać brakujące domeny.
- **Wyłapywanie naruszeń CSP na żywo** z flagą `[Google]` przy blokadach dotyczących usług Google (GTM, GA4, Maps, Fonts).
- **Wykrywanie security.txt** z sparsowanymi polami Contact i Expires.

Działa lokalnie w przeglądarce, żadne dane nie opuszczają strony, i sprawdza dowolną stronę — Twoją, klienta lub konkurencji.

## Podsumowanie

Konfiguracja nagłówków bezpieczeństwa to prosty krok, który znacząco podnosi poziom ochrony strony:

1. **HSTS** wymusza HTTPS i chroni przed downgrade attacks
2. **CSP** to najpotężniejsza ochrona przed XSS
3. **X-Frame-Options** blokuje clickjacking
4. **Testuj regularnie** na SecurityHeaders.com i Observatory

Dobrze skonfigurowane nagłówki mogą zapobiec wielu atakom przy minimalnym nakładzie pracy.

## Źródła

1. **MDN - HTTP Security Headers**
[https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#security](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#security)

2. **OWASP - Security Headers**
[https://owasp.org/www-project-secure-headers/](https://owasp.org/www-project-secure-headers/)

3. **SecurityHeaders.com**
[https://securityheaders.com/](https://securityheaders.com/)

4. **Mozilla Observatory**
[https://observatory.mozilla.org/](https://observatory.mozilla.org/)

5. **HSTS Preload List**
[https://hstspreload.org/](https://hstspreload.org/)
