How to Configure Essential HTTPS Security Headers

HTTP response headers provide instructions directly to the client browser on how to restrict resource execution, enforce encryption, prevent framing, and limit data exposure. This guide details each essential security header and provides copy-paste production configs for Nginx, Apache, and edge CDNs.

1. The Strategic Role of Browser Security Headers

Modern web browsers are powerful execution runtimes capable of isolating origins, enforcing cryptographic transport, and restricting cross-site scripting (XSS). Without explicit security headers, browsers revert to permissive defaults, leaving users vulnerable to clickjacking, unauthorized script execution, and protocol downgrade attacks.

2. Core Security Headers Breakdown

Strict-Transport-Security (HSTS — RFC 6797)

HSTS instructs the browser that a domain must only be accessed over HTTPS. It prevents SSL-stripping attacks where an attacker intercepts initial plaintext HTTP requests before redirection occurs.

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
  • max-age=31536000: Enforces HTTPS for one full year (31,536,000 seconds).
  • includeSubDomains: Extends the policy to all subdomains (e.g. api.example.com).
  • preload: Qualifies the domain for inclusion in browser preloaded lists (Chrome, Safari, Firefox), ensuring initial connections are encrypted even before the first visit.

Content-Security-Policy (CSP — W3C Level 3)

Content Security Policy is the primary defense-in-depth mechanism against Cross-Site Scripting (XSS) and data injection attacks. It defines an explicit allowlist of authorized origins for scripts, styles, images, fonts, and network connections.

Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-random123'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'; object-src 'none'; frame-ancestors 'none'; base-uri 'self'; form-action 'self';

X-Frame-Options (RFC 7034 — Anti-Clickjacking)

Prevents attackers from embedding your website inside an invisible <iframe> on a malicious third-party site, tricking authenticated users into clicking buttons (clickjacking).

X-Frame-Options: DENY

Note: Modern browsers honor frame-ancestors 'none' in Content-Security-Policy, but X-Frame-Options: DENY remains essential for legacy browser compatibility.

X-Content-Type-Options (RFC 7231)

Prevents MIME-type sniffing, where a browser ignores the declared Content-Type header and attempts to guess the content type, potentially executing user-uploaded images or text files as executable JavaScript.

X-Content-Type-Options: nosniff

Referrer-Policy (W3C Standard)

Controls how much referrer information (URL paths, query parameters with sensitive tokens) is sent to external sites when users click outbound links.

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

Permissions-Policy (Feature Policy)

Explicitly restricts browser hardware and API capabilities, ensuring unauthorized third-party scripts cannot access microphones, cameras, geolocation, or payment APIs.

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

3. Hardened Production Server Configurations

Nginx Deployment

# Place inside your server  block:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()" always;
add_header Content-Security-Policy "default-src 'self'; frame-ancestors 'none';" always;
add_header Cross-Origin-Opener-Policy "same-origin" always;

Apache Deployment (.htaccess or httpd.conf)

<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "DENY"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=()"
    Header always set Content-Security-Policy "default-src 'self'; frame-ancestors 'none';"
</IfModule>

4. Auditing Your Headers with Skopeon Labs

Skopeon Labs inspects all HTTP perimeter responses, identifying missing headers, weak configurations (such as overly permissive CSP directives or low HSTS max-age values), and provides copy-paste remediation directives:

Inspect Your Website's Security Headers

Run an immediate non-invasive header audit to identify missing defenses and harden your perimeter.

Audit Security Headers Now →