Oh MyUtils

HTTP 헤더 분석기 - 보안 헤더 파싱 & 감사 온라인

HTTP 헤더를 파싱하고 보안 취약점, 캐싱 동작, CORS 설정을 분석합니다. 실행 가능한 권장사항과 함께 보안 점수를 확인하세요 — 100% 클라이언트 사이드, 서버로 데이터 전송 없음.

100% 클라이언트 사이드 — 서버로 데이터가 전송되지 않습니다
헤더 유형
원본 헤더

자주 묻는 질문

HTTP 헤더 분석기란 무엇이며 어떤 기능을 하나요?

HTTP 헤더 분석기는 원시 HTTP 헤더(요청 및 응답 모두)를 파싱하고 각 헤더에 대한 사람이 읽을 수 있는 설명을 제공하는 도구입니다. 헤더를 기능별(보안, 캐싱, CORS, 콘텐츠 등)로 분류하고, Content-Security-Policy, Strict-Transport-Security, X-Frame-Options와 같은 중요 보안 헤더의 존재 여부와 정확성을 확인하는 보안 감사를 수행하며, 보안 점수를 생성합니다. 웹 개발자가 각 헤더의 역할을 이해하고, 누락된 보안 보호를 식별하며, 캐싱 및 CORS 구성을 최적화하는 데 도움을 줍니다.

이 HTTP 헤더 분석기 도구는 어떻게 사용하나요?

1. 브라우저의 개발자 도구(네트워크 탭에서 요청을 클릭하고 헤더 보기), curl -v 출력, 또는 서버 로그에서 HTTP 헤더를 복사합니다. 2. 원시 헤더를 텍스트 영역에 붙여넣습니다. 형식은 한 줄에 하나씩 Header-Name: value여야 합니다. HTTP/1.1 200 OK와 같은 상태 줄과 < 와 같은 curl 접두사는 자동으로 제거됩니다. 3. 붙여넣은 내용에 따라 요청 헤더 또는 응답 헤더를 선택합니다. 4. 파싱된 헤더 탭에서 각 헤더의 카테고리와 설명을 확인합니다. 5. 보안 감사로 전환하여 보안 점수와 누락되거나 잘못 구성된 보안 헤더를 확인합니다.

내 데이터는 안전한가요? 서버로 전송되나요?

완전히 안전합니다. 이 HTTP 헤더 분석기는 클라이언트 사이드 JavaScript를 사용하여 100% 브라우저에서 실행됩니다. 헤더, URL 또는 기타 데이터가 서버로 전송되지 않습니다. 모든 파싱과 분석은 브라우저에서 로컬로 수행됩니다. URL을 입력하고 서버 측 요청을 하는 securityheaders.com과 같은 도구와 달리, 이 도구는 페이지 로드 후 완전히 오프라인으로 작동합니다. 프로덕션 서버, 내부 API 또는 민감한 환경의 헤더를 개인정보 걱정 없이 안전하게 분석할 수 있습니다.

모든 웹사이트에 필요한 보안 헤더는 무엇인가요?

모든 웹사이트는 HTTP 응답에 다음과 같은 중요 보안 헤더를 구현해야 합니다: (1) HTTPS 연결을 강제하는 Strict-Transport-Security (HSTS)(max-age=31536000; includeSubDomains). (2) 리소스 로딩을 제어하여 XSS 및 코드 주입 공격을 방지하는 Content-Security-Policy (CSP). (3) 브라우저의 MIME 스니핑을 방지하는 X-Content-Type-Options: nosniff. (4) 클릭재킹 공격을 방지하는 X-Frame-Options: DENY. (5) 리퍼러 정보 유출을 제한하는 Referrer-Policy. (6) 카메라, 마이크, 위치 정보 등 미사용 브라우저 기능을 비활성화하는 Permissions-Policy.

Content-Security-Policy (CSP)란 무엇이며 왜 중요한가요?

Content-Security-Policy (CSP)는 페이지에서 로드할 수 있는 콘텐츠 소스를 브라우저에 알려주는 HTTP 응답 헤더입니다. 크로스 사이트 스크립팅(XSS) 공격에 대한 가장 강력한 방어 수단 중 하나입니다. CSP는 default-src, script-src, style-src, img-src 등의 지시문을 사용하여 특정 출처를 허용합니다. 예를 들어, Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com은 동일 출처와 특정 CDN에서만 스크립트를 허용합니다. 'unsafe-inline'과 'unsafe-eval' 같은 값은 CSP를 크게 약화시키므로 피해야 합니다.

보안 점수는 어떻게 계산되나요?

보안 점수는 중요 보안 헤더의 존재 여부와 구성 품질을 기반으로 한 0-100 수치 등급입니다. 점수 배분: 충분한 max-age를 가진 HSTS (15점), Content-Security-Policy (20점), X-Frame-Options (10점), X-Content-Type-Options: nosniff (10점), Referrer-Policy (10점), Permissions-Policy (10점), Cross-Origin-Opener-Policy (5점), Cross-Origin-Resource-Policy (5점), Cross-Origin-Embedder-Policy (5점), Server 또는 X-Powered-By 같은 버전 노출 헤더 부재 (10점). 점수는 문자 등급으로 변환됩니다: A+ (95-100), A (85-94), B (75-84), C (60-74), D (40-59), F (0-39).

요청 헤더와 응답 헤더의 차이점은 무엇인가요?

요청 헤더는 클라이언트(브라우저)가 서버로 보내는 것으로 User-Agent(브라우저 식별), Accept(선호 콘텐츠 유형), Authorization(인증 자격 증명), Cookie(저장된 쿠키), Referer(참조 페이지) 등의 정보를 포함합니다. 응답 헤더는 서버가 클라이언트로 보내는 것으로 Content-Type(응답 본문의 MIME 유형), Cache-Control(캐싱 지시문), 보안 헤더(CSP, HSTS, X-Frame-Options), Set-Cookie(저장할 쿠키), Access-Control-*(CORS 정책) 등을 포함합니다. 보안 감사는 주로 응답 헤더에 적용됩니다.

코드 예제

// HTTP Header Parser and Security Analyzer

function parseHttpHeaders(rawHeaders) {
  const headers = [];
  for (const line of rawHeaders.split('\n')) {
    let cleaned = line.trim();
    if (!cleaned) continue;
    if (/^HTTP\/[\d.]+\s+\d+/.test(cleaned)) continue;
    if (/^(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\s+/.test(cleaned)) continue;
    cleaned = cleaned.replace(/^[<>]\s*/, '');
    if (!cleaned) continue;
    const i = cleaned.indexOf(':');
    if (i === -1) continue;
    const name = cleaned.substring(0, i).trim();
    const value = cleaned.substring(i + 1).trim();
    if (name) headers.push({ name, value });
  }
  return headers;
}

const SECURITY_CHECKS = [
  { header: 'strict-transport-security', label: 'HSTS', weight: 15 },
  { header: 'content-security-policy', label: 'CSP', weight: 20 },
  { header: 'x-frame-options', label: 'X-Frame-Options', weight: 10 },
  { header: 'x-content-type-options', label: 'X-Content-Type-Options', weight: 10 },
  { header: 'referrer-policy', label: 'Referrer-Policy', weight: 10 },
  { header: 'permissions-policy', label: 'Permissions-Policy', weight: 10 },
];

function auditSecurity(headers) {
  const map = new Map(headers.map(h => [h.name.toLowerCase(), h.value]));
  let score = 0;
  const results = [];
  for (const check of SECURITY_CHECKS) {
    const value = map.get(check.header);
    if (value) {
      score += check.weight;
      results.push({ header: check.label, status: 'pass', value });
    } else {
      results.push({ header: check.label, status: 'fail', value: null });
    }
  }
  // Check info leakage
  if (!['server', 'x-powered-by'].some(h => map.has(h))) score += 10;
  const grade = score >= 95 ? 'A+' : score >= 85 ? 'A' :
    score >= 75 ? 'B' : score >= 60 ? 'C' : score >= 40 ? 'D' : 'F';
  return { score, grade, results };
}

// Example usage
const raw = `Content-Type: text/html\nStrict-Transport-Security: max-age=31536000\nX-Frame-Options: DENY\nX-Content-Type-Options: nosniff`;
const parsed = parseHttpHeaders(raw);
const audit = auditSecurity(parsed);
console.log(`Score: ${audit.score}/100 (${audit.grade})`);

관련 도구