๐ก๏ธ แแฟแแแแถแแขแแแธแแถแแแถแแแถแ Website Next.js แแแ Security Headers

แแ แแแแแแฝแ แแแแปแแแถแขแแแแขแแทแแแแแแ Web แแถแแแแแแพแ Website แแฝแแแแแแแแพ Next.jsแ Website แแแแพแแแถแแแแข แแ แแ แแทแแแแขแถแ แแแปแแแแแแถแแแแแฝแแแฝแแแพแแกแพแแแแแปแแ แทแแแแแแแปแแ
โแแพ Website แแแแแแแแปแแแถแแแปแแแแแทแแถแแแแแแแแแแถแแแ แพแแฌแแ ?โ
แแ แแพแขแแธแแแบแแทแ แแทแแแแแแถแแแแขแแแแแแแพแแแแถแแแแแขแแแแ แแถแแขแแแแแถแแแแแ แถแ (Attackers) แแแแแแแถแแถแแแฝแ แแทแแแแแแ, Inject Script, แฌ Track แขแแแแแแแพแแแแถแแแ แแผแ แแแแ แแแแปแแแถแแแแแแแ แ แทแแแแแแแพ HTTP Security Headers แแแแปแ Next.jsแ
๐ Security Headers แแบแแถแขแแแธ?
Security Headers แแบแแถ HTTP Headers แแแ Browser แขแถแ แแพแแแแธแแนแแแถ Website แแแแแแแผแแขแแปแแแแถแ แฌแ แถแแแถแแแขแแแธแแแแแ แแถแแถ แแแแแถแแแแถแแแถแ (Security Layer) แแฝแแแแแถแแแแถแแ แแแแแถแแ Web Application แแแแแแแแพแแ
โ๏ธ แแถแแแแแแ Security Headers แแแแปแ Next.js
แแแแปแ Next.js แแพแแขแถแ แแแแแ headers แแ แแแแปแ next.config.js แแผแ แแแแ (แขแแแแขแถแ แแถแแ code block แแแแแ Medium)
โ 1. X-DNS-Prefetch-Control
X-DNS-Prefetch-Control: on
๐น แขแแปแแแแถแแฑแแ browser prefetch DNS แแพแแแแธแแแแแพแ performance แแทแแแถแแแแแแแ latencyแ
โ 2. X-Content-Type-Options
X-Content-Type-Options: nosniff
๐น แแถแแแถแ browser แแทแแฑแแแแแถแแแแแแถแ content-type แแปแแ แแแแขแถแ แแแแแถแแฑแแแแถแ XSS attackแ
โ 3. Strict-Transport-Security (HSTS)
max-age=63072000; includeSubDomains; preload
๐น แแแแแแฑแแ website แแแแพ HTTPS แแถแแทแ แแ ๐น แแถแแแถแ Man-in-the-Middle attack
โ 4. Referrer-Policy
strict-origin-when-cross-origin
๐น แแถแแแถแแแทแแแแแแ URL แแทแแฑแแแแแแพแแแแแแแแ website แแถแแแแแ แ
โ 5. Permissions-Policy
camera=(), microphone=(), geolocation=()
๐น แแทแ access แแ Hardware แแทแ API แแแแแทแแ แถแแแถแ แ ๐น แแถแแแแแแแ privacy risk
โ 6. Cross-Origin-Opener-Policy
same-origin
๐น แแถแแแถแ Cross-Origin attacks ๐น แแแแถแแแแแแแถแแ isolation แแทแ performance
โ 7. X-Robots-Tag
index, follow
๐น แขแแปแแแแถแ Search Engine index website ๐น แแแขแแแแแถแแ SEO ๐งฑ Content Security Policy (CSP) โ แแแแแถแแแแปแแแแแทแแถแแแแแแแปแ
CSP แแถ header แแแแถแแแแแแปแแแแแปแแแถแแแถแแแถแ XSS (Cross-Site Scripting)แ
๐ แขแแแธแแแ CSP แแแแแแพแแแแแพแแถแ
แขแแปแแแแถแ script แแแแธ self, Umami, Facebook
แขแแปแแแแถแ iframe แแแแธ YouTube, Facebook, Google Maps
แแทแ object-src
แแทแ form submit แแ domain แแถแแแแแ
แแแแแ upgrade HTTP โ HTTPS
๐ แแแแแแแพแฑแแ Website แแถแแแปแแแแแทแแถแแแแแแ แแแปแแแแ แแ แแ compatible แแถแแฝแ YouTube แแทแ Facebook Embed
๐ฏ แแแแแแแแแแแแปแแแถแแแแ
โ Website แแแข แแทแแแแแแแแนแแแแแแขแถแ แแทแแแ แแแแ แแแปแแแแแแแแผแแแถแ โแแปแแแแแทแแถแโ แแแแแถแแแขแแแแแแแพแแแแถแแ โ
Next.js แแทแแแแแนแแแแแถ Framework แแแแแถแแ UI แแแปแแแแแแแ แแถแแถแงแแแแแแแแแแแถแแ แแแแแถแแแแแถแ Secure Production Website แแแแแทแแแพแแพแแแแแพแแถแฑแแแแแแนแแแแแผแแ
โ๏ธ แแแ แแแแธแแแแแทแแแแถแ
แแพแขแแแแแแแปแแแแแพ Next.js แแแแแถแแ:
Company Website
Portfolio
SaaS
Blog (Medium-style)
๐ แแปแแแพแแแแแ Security Headers แแถแแถแแแ แถแแแผแ แแแปแแแแแแถแแขแแแแแแแแแแแแแ ๐
แแแแ แถแ source code
import type { NextConfig } from 'next';
const nextConfig: NextConfig = {
// แแพแ React Strict Mode แแพแแแแธ catch bug แแแ dev
reactStrictMode: true,
// แแทแ dev indicator (build status icon)
devIndicators: false,
// แแปแ "X-Powered-By: Next.js" แแพแแแแธแแถแแแแแแแ fingerprinting
poweredByHeader: false,
// แแแแแ image domain แแแแขแถแ
load แแถแ (YouTube thumbnail)
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'i.ytimg.com',
},
],
},
// HTTP Security Headers
async headers() {
return [
{
// แขแแปแแแแ headers แแ
แแแแแ route
source: '/(.*)',
headers: [
// แขแแปแแแแถแ DNS Prefetch (performance)
{ key: 'X-DNS-Prefetch-Control', value: 'on' },
// แแถแแแถแ MIME sniffing (XSS protection)
{ key: 'X-Content-Type-Options', value: 'nosniff' },
// แแแแแ HTTPS แแถแแทแ
แแ
(HSTS)
{
key: 'Strict-Transport-Security',
value: 'max-age=63072000; includeSubDomains; preload',
},
// แแถแแแแแแแ referrer data แแแ link แแ
site แแถแแแแแ
{
key: 'Referrer-Policy',
value: 'strict-origin-when-cross-origin',
},
// แแทแ access แแ
hardware / browser features
{
key: 'Permissions-Policy',
value:
'camera=(), microphone=(), geolocation=(), payment=(), usb=(), bluetooth=()',
},
// แแถแแแถแ cross-origin window attack
{ key: 'Cross-Origin-Opener-Policy', value: 'same-origin' },
// แขแแปแแแแถแ search engine index (SEO)
{ key: 'X-Robots-Tag', value: 'index, follow' },
// ๐ก๏ธ Content Security Policy (CSP)
{
key: 'Content-Security-Policy',
value: `
default-src 'self';
script-src
'self'
'unsafe-inline'
https://cloud.umami.is
https://connect.facebook.net;
style-src
'self'
'unsafe-inline';
img-src
'self'
data:
https:
https://*.fbcdn.net
https://i.ytimg.com;
font-src 'self';
connect-src
'self'
https://api-gateway.umami.dev
https://cloud.umami.is
https://graph.facebook.com;
frame-src
https://www.facebook.com
https://www.youtube.com
https://www.youtube-nocookie.com
https://www.google.com
https://maps.google.com;
object-src 'none';
frame-ancestors 'self';
base-uri 'self';
form-action 'self';
upgrade-insecure-requests;
`.replace(/\s{2,}/g, ' ').trim(),
},
],
},
];
},
};
export default nextConfig;