본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 19. 17:41

변조 방지 로그도 소급 적용될 수 있습니다. 이를 해결하는 방법은 다음과 같습니다.

요약

AI 시스템의 감사 로그(audit trail)가 사후에 조작되는 문제를 방지하기 위해 RFC 3161 표준을 활용한 신뢰할 수 있는 타임스탬프(TSA) 도입 방법을 설명합니다. 운영자가 타임스탬프를 제어할 수 없도록 해시 체인과 TSA 토큰을 결합하는 2단계 쓰기 구현 방식을 제안합니다.

핵심 포인트

  • 운영자가 타임스탬프를 직접 제어하면 로그의 독립적 검증이 불가능함
  • EU AI Act 등 규제 준수를 위해 조작 불가능한 로그 유지가 필수적임
  • RFC 3161 표준의 TSA를 사용하면 해시값에 대한 신뢰할 수 있는 시점 증명이 가능함
  • 해시 체인에 TSA 토큰을 포함하는 2단계 쓰기 방식으로 로그 무결성을 보장함

대부분의 감사 추적 (audit trail) 구현체는 로그의 필드로서 타임스탬프 (timestamps)를 기록합니다. 에이전트 (agent)가 이를 설정하거나 프레임워크 (framework)가 설정합니다. 어느 쪽이든, 로그를 제어하는 당사자가 시계 (clock) 또한 제어하게 됩니다.

이는 EU AI Act 제12조 하에서 중요합니다. 제12조는 고위험 AI 시스템 (high-risk AI systems)이 시스템 작동의 검증을 가능하게 하는 로그를 유지할 것을 요구합니다. 운영자가 타임스탬프를 제어하는 로그는 그 어떤 것도 독립적인 검증을 가능하게 하지 않습니다. 이는 운영자가 사후에 그럴듯해 보이는 이력을 구성할 수 있게 합니다.

다음은 그 시연입니다.

2020년 세션이 2026년 감사에서 통과되는 사례

우리는 모든 타임스탬프가 2020년 1월 1일로 설정된 세션에 대해 Sasana 자체 검증기 (verifier)를 실행했습니다:

Status: INTACT
Evidence class: NON_AUTHORITATIVE_EVIDENCE
Hash chain: PASS
...

INTACT (온전함). 오류가 없습니다. 세션은 내부적으로 일관적입니다. 해시 체인 (hash chain)은 모든 이벤트를 다음 이벤트로 연결합니다. 문제는 해당 타임스탬프를 포함한 체인 전체가 2020년이 아니라 오늘 작성되었다는 점입니다.

검증기는 NON_AUTHORITATIVE_EVIDENCE (비권위적 증거)를 정확하게 반환합니다. 이 분류가 핵심적인 역할을 합니다.

RFC 3161은 신뢰할 수 있는 타임스탬프 (trusted timestamps)를 위한 IETF 표준입니다. 타임스탬프 기관 (Timestamp Authority, TSA)은 데이터 자체가 아닌 해시(hash), 즉 SHA-256 다이제스트 (digest)만을 수신하며, 해당 해시와 현재 시간을 포함하는 서명된 토큰 (signed token)을 반환합니다. 이 토큰은 TSA의 공개 인증서 (public certificate)를 통해 검증할 수 있습니다.

운영자는 사후에 이를 위조할 수 없습니다. 다른 시간에 대한 유효한 토큰을 생성하려면 SHA-256 충돌 (collision)을 찾아내거나 TSA의 개인 키 (private key)를 획득해야 합니다.

Freetsa (freetsa.org)는 독일 뷔르츠부르크에 본사를 둔 공공 TSA입니다. 계정이 필요하지 않습니다. 엔드포인트(endpoint)는 https://freetsa.org/tsr입니다. DER 인코딩된 타임스탬프 요청을 POST하면 DER 인코딩된 응답을 받게 됩니다. 이 기사를 위해 실행한 라이브 테스트의 응답은 다음과 같습니다:

Status: Granted.
Hash Algorithm: sha256
TSA: /O=Free TSA/OU=TSA/CN=www.freetsa.org
...

TSA는 운영자와 독립적입니다. 타임스탬프가 찍히는 세션과 아무런 관계가 없습니다. TSA는 32바이트 해시를 수신하고, 해당 해시가 언제 도착했는지에 대한 서명된 성명 (signed statement)을 반환했습니다. 운영자는 Freetsa의 서명 키 (signing key)를 제어할 수 없기 때문에, 다른 시간에 대해 동일한 성명을 생성할 수 없습니다.

구현 방식

설계상의 제약 사항이 있습니다. TSA는 해시를 수신해야 하지만, 토큰 또한 해시 체인 (hash chain)에 커밋 (commit)되어야 합니다. 그렇지 않으면 나중에 다른 토큰으로 교체하는 것이 매우 쉽기 때문입니다.

해결책은 2단계 쓰기 (two-pass write) 방식입니다. open_session() 호출 시, 토큰 없이 SESSION_START가 기록됩니다. 해당 이벤트의 해시가 TSA로 제출됩니다. 토큰이 반환되면, 이는 SESSION_START의 페이로드 (payload)에 삽입되며, 이제 토큰을 포함하게 된 전체 페이로드에 대해 event_hash를 다시 계산합니다.

최신 실행 결과:

SESSION_START event_hash WITHOUT rfc3161_token:
  ff4be53f333aa85e7491961e0d944093e7a3ef896a399d11f98967d05bb5c34e

...

해시 ff4be53f...는 TSA가 수신한 값과 정확히 일치합니다. 이는 openssl ts -reply -text를 사용하여 반환된 토큰에서 MessageImprint 필드를 파싱하여 확인되었습니다.

메시지 데이터 (Message data):
    0000 - ff 4b e5 3f 33 3a a8 5e-74 91 96 1e 0d 94 40 93
    0010 - e7 a3 ef 89 6a 39 9d 11-f9 89 67 d0 5b b5 c3 4e

이는 ff4be53f333aa85e7491961e0d944093e7a3ef896a399d11f98967d05bb5c34e로 재구성됩니다. 바이트 단위로 완전히 일치 (Byte-for-byte identical)합니다.

나머지 세션은 db37c1d4...로부터 체인을 형성합니다. 토큰을 교체하면 해당 해시 (hash)가 변경되며, 이는 이후의 모든 prev_hash 링크를 깨뜨립니다. 체인을 깨뜨리지 않고서는 토큰을 대체할 수 없습니다. TSA (Time Stamping Authority, 타임스탬프 기관)의 성명서는 외부 당사자에 의해 생성되었으며 기록에 결합되어 있습니다. 운영자는 이를 생성하지 않았으며, 다른 시간 값을 가진 다른 성명서를 소급하여 생성할 수 없습니다.

네트워크 장애는 페일 오픈 (fail-open) 방식으로 처리됩니다. TSA에 접속할 수 없는 경우, 세션은 토큰 없이 기록되며, 검증기 (verifier)는 세션을 실패 처리하는 대신 타임스탬프 확인을 '건너뜀 (SKIPPED)'으로 표시합니다.

프로세스 내 검증 (in-process verification)이 확인하는 것과 확인하지 않는 것

sasana_cli verify 명령은 토큰의 MessageImprint가 토큰 생성 전의 해시 (pre-token hash)와 일치하는지 확인합니다. 이 명령은 TSA의 서명 체인 (signature chain)을 검증하지는 않습니다. 유효한 해시를 가지고 있지만 위조된 TSA 서명을 가진 토큰은 이 검증을 통과할 것입니다.

전체 검증 경로를 위해서는 openssl ts -verify가 필요합니다:

$ DIGEST=$(xxd -p sasana_pre_token_hash.bin | tr -d '\n')
$ openssl ts -verify \
    -in sasana_fresh_token.tsr \
...

Verification: OK는 TSA의 인증서 체인 (certificate chain)이 유효하고, MessageImprint가 예상된 해시와 일치하며, 토큰이 진본임을 의미합니다. SESSION_START에 포함된 .tsr 파일만으로 충분한 입력값이 됩니다. 이 단계에서는 Sasana 도구가 관여하지 않으며, Freetsa의 공개된 루트 인증서 (root certificate)를 대상으로 표준 OpenSSL만을 사용합니다.

제12조

제12조는 로그가 시스템 작동의 검증을 가능하게 할 것을 요구합니다. 규제 기관이 던질 질문은 로그가 생성된 후에 수정되었는지 여부가 아닙니다. 해시 체인 (Hash chains)이 그 문제를 처리합니다. 질문의 핵심은 로그가 사건이 발생했을 당시 실제로 일어난 일을 반영하고 있는가 하는 점입니다.

RFC 3161에 고정된 (anchored) 세션은 운영자를 신뢰할 필요 없이 두 번째 질문에 대해 검증 가능한 답변을 제공합니다. 다른 시간대를 위해 로그를 재구성하려는 모든 시도는 TSA(Time Stamping Authority, 타임스탬프 기관)의 서명을 위조해야 합니다. NON_AUTHORITATIVE_EVIDENCE (비권위적 증거)와 AUTHORITATIVE_EVIDENCE (권위적 증거) 사이의 차이는 구조적(architectural)입니다. 규정을 준수하는 증거는 외부 앵커(external anchor)를 필요로 합니다.

Sasana는 오픈 소스 AI 세션 감사 (auditing) 라이브러리입니다. 출처: github.com/sahiee-dev/Sasana

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0