- 질문지 HTML에 제출/임시저장 JavaScript 추가 (localStorage 임시저장, API 제출) - questionnaire_responses 테이블 마이그레이션 (005) - /api/questionnaire/submit POST 엔드포인트 - 관리자 질문지 응답 목록/상세/상태변경 페이지 및 API - 관리자 문서 미리보기를 fetch+srcdoc 방식으로 변경 (X-Frame-Options 우회) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
import type { NextConfig } from "next";
|
|
|
|
const nextConfig: NextConfig = {
|
|
async headers() {
|
|
return [
|
|
{
|
|
source: "/:path*",
|
|
headers: [
|
|
// 클릭재킹 방지
|
|
{ key: "X-Frame-Options", value: "DENY" },
|
|
// MIME 스니핑 방지
|
|
{ key: "X-Content-Type-Options", value: "nosniff" },
|
|
// Referrer 정책
|
|
{ key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
|
|
// XSS 필터 (레거시 브라우저)
|
|
{ key: "X-XSS-Protection", value: "1; mode=block" },
|
|
// HTTPS 강제 (Vercel은 자동 HTTPS이므로 안전)
|
|
{
|
|
key: "Strict-Transport-Security",
|
|
value: "max-age=63072000; includeSubDomains; preload",
|
|
},
|
|
// 권한 정책
|
|
{
|
|
key: "Permissions-Policy",
|
|
value: "camera=(), microphone=(), geolocation=()",
|
|
},
|
|
],
|
|
},
|
|
// API 엔드포인트: 캐시 금지 + CORS 차단
|
|
{
|
|
source: "/api/:path*",
|
|
headers: [
|
|
{ key: "Cache-Control", value: "no-store, max-age=0" },
|
|
// 동일 출처 요청만 허용 (외부 도메인 API 직접 호출 차단)
|
|
{ key: "X-Frame-Options", value: "DENY" },
|
|
],
|
|
},
|
|
];
|
|
},
|
|
};
|
|
|
|
export default nextConfig;
|