Overview
Thesecure middleware enforces HTTPS connections and adds security headers. It’s a comprehensive security solution that combines SSL redirect with security header management.
Use it when you need:
- Automatic HTTP to HTTPS redirect
- Security headers in one middleware
- Flexible security configuration
- Development/production toggle
Installation
Quick Start
Configuration
Options
| Option | Type | Default | Description |
|---|---|---|---|
SSLRedirect | bool | true | Redirect HTTP to HTTPS |
SSLHost | string | "" | Host for SSL redirect |
SSLTemporaryRedirect | bool | false | Use 307 instead of 301 |
STSSeconds | int64 | 0 | HSTS max-age (0 = disabled) |
STSIncludeSubdomains | bool | false | HSTS includeSubDomains |
STSPreload | bool | false | HSTS preload |
ForceSTSHeader | bool | false | Send HSTS on HTTP |
ContentTypeNosniff | bool | true | X-Content-Type-Options |
FrameDeny | bool | true | X-Frame-Options: DENY |
CustomFrameOptions | string | "" | Custom X-Frame-Options |
XSSProtection | string | "1; mode=block" | X-XSS-Protection |
ContentSecurityPolicy | string | "" | CSP header |
ReferrerPolicy | string | "" | Referrer-Policy |
IsDevelopment | bool | false | Disable all features |
ProxyHeaders | []string | ["X-Forwarded-Proto"] | Headers for HTTPS detection |
Examples
Basic HTTPS Redirect
Production Configuration
Development Mode
Behind a Proxy
Custom SSL Host
Temporary Redirect
Frame Options
Environment-Based Configuration
Full Security Setup
API Reference
Functions
Headers Set
The middleware sets these headers based on configuration:| Header | Condition | Value |
|---|---|---|
Strict-Transport-Security | STSSeconds > 0 | max-age=X; includeSubDomains; preload |
X-Content-Type-Options | ContentTypeNosniff | nosniff |
X-Frame-Options | FrameDeny or Custom | DENY or custom |
X-XSS-Protection | XSSProtection set | Configured value |
Content-Security-Policy | CSP set | Configured policy |
Referrer-Policy | ReferrerPolicy set | Configured policy |
Technical Details
Implementation Overview
The secure middleware implements a comprehensive security layer that:-
HTTPS Detection: Checks for secure connections via:
- Direct TLS connection (r.TLS != nil)
- Proxy headers (X-Forwarded-Proto, X-Forwarded-SSL, etc.)
- Case-insensitive header matching using strings.EqualFold
-
SSL Redirection: When HTTP is detected and SSLRedirect is enabled:
- Constructs HTTPS URL:
https://+ host + requestURI - Uses SSLHost if specified, otherwise uses request host
- Returns 301 (permanent) or 307 (temporary) redirect based on SSLTemporaryRedirect
- Constructs HTTPS URL:
-
Security Header Application: Sets headers conditionally based on:
- Connection security (HTTPS vs HTTP)
- Configuration options
- Development mode (bypasses all security when IsDevelopment is true)
Header Construction
Strict-Transport-Security (HSTS):- Only set on HTTPS connections unless ForceSTSHeader is true
- Requires STSSeconds > 0 to be enabled
- Priority: CustomFrameOptions > FrameDeny > none
- FrameDeny sets “DENY”, CustomFrameOptions allows “SAMEORIGIN” or other values
- X-Content-Type-Options: nosniff
- X-Frame-Options: DENY
- X-XSS-Protection: 1; mode=block
- SSLRedirect: enabled
Proxy Support
The middleware checks proxy headers in order:- X-Forwarded-Proto (default)
- X-Forwarded-SSL
- Front-End-Https
Performance Optimization
The middleware uses a customitoa function instead of strconv.Itoa for integer-to-string conversion:
- Avoids heap allocations
- Uses fixed-size array [20]byte for conversion
- Handles negative numbers and zero efficiently
Security Considerations
- HSTS Commitment - Once set, browsers remember for max-age duration
- SSL Certificate - Ensure valid certificate before enabling HSTS
- Subdomains - Only enable STSIncludeSubdomains if all subdomains support HTTPS
- Preload - Apply at hstspreload.org for browser built-in list
HSTS Timeline
Best Practices
- Start with short HSTS duration, increase gradually
- Test thoroughly before enabling preload
- Use
IsDevelopmentflag for local development - Configure
ProxyHeaderswhen behind load balancers
Testing
The secure middleware includes comprehensive test coverage for all features:| Test Case | Description | Expected Behavior |
|---|---|---|
TestNew | Default middleware with SSL redirect | Redirects HTTP to HTTPS with 301 status, Location header set to https://example.com/ |
TestWithOptions_NoSSLRedirect | Middleware with SSL redirect disabled but security headers enabled | Returns 200 OK, sets X-Content-Type-Options: nosniff, X-Frame-Options: DENY, X-XSS-Protection: 1; mode=block |
TestWithOptions_HSTS | HSTS configuration with all options enabled | Sets Strict-Transport-Security header with max-age=31536000; includeSubDomains; preload |
TestWithOptions_CustomFrameOptions | Custom frame options instead of default DENY | Sets X-Frame-Options: SAMEORIGIN |
TestWithOptions_CSP | Content Security Policy configuration | Sets Content-Security-Policy: default-src ‘self’ |
TestWithOptions_ReferrerPolicy | Referrer policy configuration | Sets Referrer-Policy: strict-origin-when-cross-origin |
TestWithOptions_SSLHost | SSL redirect to custom host with temporary redirect | Redirects with 307 status to https://secure.example.com/path?q=1 |
TestWithOptions_ProxyHeader | Request behind proxy with X-Forwarded-Proto: https | Does not redirect (200 OK) since connection is detected as HTTPS via proxy header |
TestWithOptions_IsDevelopment | Development mode enabled | Bypasses all security features, returns 200 OK without redirect or headers |