security.txt 검사기는 PGP 클리어사인 파일까지 포함해 security.txt 파일의 텍스트를 읽고 RFC 9116 기준으로 점검합니다. Contact 필드가 하나 이상 있고 올바른 URI인지, Expires 필드가 올바른 날짜·시간 형식으로 정확히 하나이며 아직 미래인지, Canonical, Encryption, Policy, Acknowledgments, Hiring, Preferred-Languages가 올바른 값인지 확인합니다. 모든 항목은 오류, 경고, 참고로 표시되고 어느 줄에서 나왔는지 줄 번호가 붙습니다.
security.txt는 사이트에서 취약점을 발견한 연구자가 누구에게 연락해야 하는지 알려 주는 파일입니다. 올리기는 쉽지만 잊기도 쉽습니다. Expires 날짜가 조용히 지나가고, 메일함이 폐쇄되고, 링크가 404를 돌려주기 시작합니다. 이 페이지는 점검 결과 옆에 만료까지의 실시간 카운트다운과 필수·권장 필드 체크리스트를 보여 주므로 곧 만료될 파일을 놓치기 어렵습니다.
텍스트는 브라우저 안에서 분석합니다. 이 도구는 사이트를 가져오거나, 파일 속 링크를 따라가거나, 연락처 주소로 메일을 보내지 않으며 텍스트를 서버로 전송하지 않습니다.
사용 방법
파일 내용 복사
사이트의
/.well-known/security.txt를 열거나 편집기의 초안 전체를 복사합니다.#으로 시작하는 주석, 빈 줄, PGP 서명 래퍼가 있어도 괜찮습니다.붙여넣기
입력하는 동안 검사가 실행됩니다. 한도는 512KiB이고 입력이 비어 있으면 오류가 표시됩니다.
만료와 체크리스트 확인
맨 위 카드는
Expires날짜까지의 카운트다운을, 이미 지났다면 얼마나 지났는지를 보여 주고 30일도 남지 않으면 경고합니다. 체크리스트에는 필수 필드(Contact,Expires)와 권장 필드(Canonical,Encryption,Policy,Preferred-Languages,Acknowledgments,Hiring, PGP 서명)가 있는지 표시됩니다.점검 항목 처리
항목마다 심각도, 필드 이름, 줄 번호, 설명이 나옵니다. 줄 번호 0은 필드 누락처럼 파일 전체에 관한 문제라는 뜻입니다. 맨 아래 표에는 파싱된 필드가 나열됩니다.
고치고 게시한 뒤 다시 확인
파일을 고치고 HTTPS로
/.well-known/security.txt에 올리고, 가능하면 서명한 다음 다시 붙여넣어 확인하세요.
작동 원리
RFC 9116이 요구하는 것
RFC 9116은 Field: value 줄로 이루어진 일반 텍스트 파일을 정의하며, HTTPS의 /.well-known/security.txt에서 text/plain; charset=utf-8로 제공합니다. 필드 이름은 대소문자를 구분하지 않습니다. Contact는 필수이며 반복할 수 있고, Expires는 필수이며 한 번만 나와야 합니다. 나머지 필드는 선택입니다.
| 필드 | 필수 여부 | 이 도구가 확인하는 것 |
|---|---|---|
Contact | 필수, 반복 가능 | 하나 이상, 각각 URI이며 보통 mailto:, tel:, https:. http:는 오류 |
Expires | 필수, 한 번 | 시간대가 있는 RFC 3339 날짜·시간이 정확히 하나, 미래여야 하며 1년을 넘으면 경고 |
Canonical | 선택, 반복 가능 | 올바른 https: URI |
Encryption | 선택, 반복 가능 | 키로 연결되는 링크(https:, dns:, openpgp4fpr:), 키 자체는 안 됨 |
Policy, Acknowledgments, Hiring | 선택 | 올바른 URI, https:가 아니면 경고 |
Preferred-Languages | 선택, 한 번 | en, ko, zh-Hans처럼 쉼표로 구분한 언어 태그 |
Expires가 필수인 이유와 형식
RFC 9116 2.5.5절은 오래된 정보가 연구자를 오도하지 않도록 Expires 필드를 요구합니다. 값은 1년 미만 뒤로 정하길 권장하므로 날짜가 366일보다 멀면 경고합니다. 과거 날짜는 오류입니다. 만료된 파일은 없는 것으로 취급되기 때문입니다. 값은 2027-06-01T00:00:00Z처럼 시간대가 있는 RFC 3339 날짜·시간이어야 합니다. 2027-06-01 같은 날짜만 있는 값은 시각과 시간대가 없어 거부됩니다.
PGP 서명 파일
RFC 9116은 파일에 OpenPGP 클리어텍스트 서명을 하길 권장합니다. 그런 파일은 -----BEGIN PGP SIGNED MESSAGE-----, Hash: 헤더, 빈 줄로 시작해 필드가 이어지고 마지막에 서명 블록이 옵니다. 검사기는 이 래퍼를 제거하고, 대시로 시작하는 줄의 대시 이스케이프를 되돌린 뒤 안쪽 필드를 검사하며 원래의 줄 번호를 유지하므로 결과가 붙여넣은 파일의 올바른 줄을 가리킵니다. 서명 여부는 알려 주지만 서명 자체를 검증하지는 않습니다.
이 검사가 다루지 않는 것
텍스트에 대한 정적 점검입니다. 파일이 올바른 경로에 올바른 콘텐츠 형식으로 제공되는지, 서명이 유효한지, 메일함이 메일을 받는지, 링크된 페이지가 존재하는지는 확인하지 않습니다. 확장 필드는 허용되지만 대부분의 도구가 무시하므로, RFC 9116에 없는 필드는 CSAF를 제외하고 경고로 보고합니다.
실제 예시
Contact: mailto:security@example.com
Contact: tel:+1-201-555-0123
Expires: 2027-06-01T00:00:00Z
Encryption: https://example.com/pgp-key.txt
Canonical: https://example.com/.well-known/security.txt
Policy: https://example.com/security-policy
Preferred-Languages: en, ko필드 7개, Contact 2개, Canonical 1개, Expires 2027-06-01T00:00:00Z
오류·경고 없음, 참고: 파일이 서명되지 않음날짜가 지나면 같은 파일이 만료로 보고됩니다. tel:은 허용되는 Contact 스킴입니다.
Contact: security@example.com
Contact: http://example.com/report
Expires: 2027-06-01
Expires: 2028-01-01T00:00:00Z
Encryption: -----BEGIN PGP PUBLIC KEY BLOCK-----오류 Contact (1번째 줄): mailto:... 같은 URI여야 함, 현재 값 security@example.com
오류 Contact (2번째 줄): http:가 아니라 mailto:, tel:, https:를 써야 함
오류 Expires (3번째 줄): 시간대가 있는 RFC 3339 날짜·시간이어야 함, 현재 값 2027-06-01
오류 Expires (4번째 줄): 정확히 한 번만 나와야 함
오류 Encryption (5번째 줄): 키로 연결되는 링크여야 하며 키를 담으면 안 됨
참고: Canonical 필드 없음, 파일이 서명되지 않음주소만 쓰면 mailto:가 필요하고, 날짜에는 시각과 시간대가 필요하며, 키는 붙여넣지 않고 링크해야 합니다.
Contact: https://example.com/report
Expires: 2020-01-01T00:00:00Z오류 Expires (2번째 줄): 날짜가 과거임
참고: Canonical 필드 없음, 파일이 서명되지 않음
만료 카드: 약 7년 전에 만료됨연락처 URL은 괜찮지만 만료된 파일은 오래된 것이어서 무시될 수 있습니다.
Contact: https://example.com/report
Expires: 2031-01-01T00:00:00Z
Canonical: http://example.com/.well-known/security.txt
Policy: http://example.com/policy
Hiring: not a uri
Preferred-Languages: english오류 Canonical (3번째 줄): HTTPS URI여야 함
오류 Hiring (5번째 줄): URI여야 함, 현재 값 not a uri
오류 Preferred-Languages (6번째 줄): 언어 태그여야 함, 현재 값 english
경고 Expires (2번째 줄): 1년보다 먼 미래
경고 Policy (4번째 줄): HTTPS URI를 권장Canonical은 HTTPS가 아니면 오류이고 Policy는 경고일 뿐입니다.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
# security contact
Contact: mailto:a@example.com
Expires: 2027-06-01T00:00:00Z
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCgAd
=abcd
-----END PGP SIGNATURE-----필드 2개, Contact 1개, 서명됨
오류·경고 없음, 참고: Canonical 필드 없음, 파일이 PGP로 서명됨아머 줄을 항목으로 오인하지 않으며, 필드는 원래의 줄 번호를 유지합니다(Contact는 5번째 줄).
자주 하는 실수
잊어버린 Expires 날짜
게시할 때 올바르던 파일도 Expires 날짜가 되면 오류가 됩니다. 갱신 일정을 달력에 넣거나 배포 파이프라인에서 파일을 생성하세요.
Contact 값에는 스킴이 필요함
Contact: security@example.com은 URI가 아닙니다.mailto:security@example.com, 번호가 붙은tel:, 또는 신고 양식으로 가는https:링크를 쓰세요.시각과 시간대가 없는 날짜
Expires: 2027-06-01은 사람 눈에는 맞지만 RFC 3339 날짜·시간이 아닙니다.2027-06-01T00:00:00Z로 쓰세요.Encryption에 키를 붙여넣기
이 필드에는 공개 키로 가는 링크를 씁니다. HTTPS URL,
dns:레코드,openpgp4fpr:지문이 그 예입니다. 키 블록 자체는 파일에 넣지 않습니다.잘못된 위치나 콘텐츠 형식
파일은
/.well-known/security.txt에 있어야 하고/security.txt는 예전 방식의 대체이며, HTTPS의 일반 텍스트여야 합니다. 붙여넣은 텍스트를 검사하는 도구는 이를 볼 수 없습니다.Expires 줄이 둘
Expires필드는 정확히 하나만 허용됩니다. 손으로 고치다가 옛 날짜를 새 날짜 위에 남겨 두기 쉽습니다.
자주 묻는 질문
security.txt 파일은 어디에 두어야 하나요?
https://example.com/.well-known/security.txt입니다. RFC 9116은 같은 호스트의 /security.txt도 대체로 허용하지만 well-known 경로를 권장합니다.
필수 필드는 무엇인가요?
Contact(한 번 이상)와 Expires(정확히 한 번)입니다. 나머지는 선택이지만 Canonical, Encryption, 서명을 권장합니다.
검사기가 내 사이트를 가져오나요?
아니요. 붙여넣은 텍스트만 읽으며 URL을 방문하거나 주소로 메일을 보내지 않습니다.
Expires는 얼마나 먼 미래여야 하나요?
RFC 9116은 1년 미만을 권장합니다. 이 도구는 366일을 넘으면 경고, 이미 지난 날짜면 오류를 표시하고, 30일도 남지 않으면 카운트다운 카드에서 경고합니다.
Contact에 tel:을 써도 되나요?
됩니다. mailto:, tel:, https:를 받아들이고 http:는 오류입니다. 그래도 대부분의 신고자에게는 이메일이나 웹 양식이 더 쉬운 방법입니다.
서명된 파일도 검사할 수 있나요?
됩니다. 필드를 확인하기 전에 PGP 클리어텍스트 래퍼를 제거하고 파일이 서명되었다고 알려 줍니다. 서명 자체는 검증하지 않습니다.
결과가 깨끗하면 취약점 접수 절차가 잘 돌아가는 건가요?
아니요. 파일의 필드만 확인합니다. 누군가는 여전히 메일함을 읽고 신고에 답하고 링크된 정책 페이지를 최신으로 유지해야 합니다.
더 깊이 읽기
마지막 업데이트:
