증상 — 되물을 때마다 새로운 오류가 나왔다
산업용 밸브를 수출하는 제조사 한 곳이 해외 영업 메일을 대신 보내 달라고 문의했다. 보내려는 나라가 다섯 곳이었고, 나라마다 광고성 메일을 규제하는 법이 다르다. 그래서 회신 초안에 다섯 나라의 규제를 한 절씩 정리해 넣었다.
초안을 회사 대표가 읽고 되물었다. 한 번 되물을 때마다 초안에서 새 오류가 하나씩 나왔다. 한 곳을 고치면 다음 라운드에서 다른 나라가 걸렸고, 그 과정이 여러 번 이어졌다.
나온 오류는 성격이 셋으로 갈렸다. 첫째는 아예 존재하지 않는 법이었다. 태국 규제를 설명하며 「UEMA(스팸메일법)」라는 이름을 적었는데, 그런 이름의 법이 없다. 둘째는 번호는 맞고 내용이 다른 법이었다. 아랍에미리트의 「연방법 5/2012」는 실재하는 법이지만 사이버범죄를 다루는 법이고, 광고 메일 정책을 규율하는 법이 아니다.
셋째가 가장 나빴다. 사우디아라비아 항목에 「위반 결정 48건」이라는 숫자를 적었는데, 같은 나라를 다룬 대형 로펌 해설과 정면으로 어긋났다. 그 해설은 감독기관이 아직 제재를 공개한 적이 없다고 적고 있었다.
SDAIA has not yet issued any public notice of sanctions
다섯 나라 중 셋에서 오류가 나왔다. 셋 다 고객에게 나갈 메일 본문에 이미 들어가 있던 문장이다.

처음 의심한 것 — 검색을 덜 했다고 봤다
첫 진단은 단순했다. 자료 조사가 얕았다고 봤다. 나라별로 검색을 더 돌리고 자료를 더 모으면 이런 오류는 줄어든다는 판단이다.
이 가설이 먼저 떠오른 이유가 있다. 오류 세 건 모두 「자료를 못 찾아서 생긴 공백」처럼 보였기 때문이다. 태국은 영어 자료가 적고, 사우디는 제도가 최근에 생겼고, 아랍에미리트는 법 체계가 연방과 토후국으로 갈린다. 자료가 귀한 나라에서 오류가 났으니 자료를 더 파면 된다는 결론이 자연스러웠다.
처방도 여기서 바로 나왔다. 회신을 다시 쓸 때마다 나라별로 검색을 한 번 더 돌리고, 찾은 문서를 요약해 초안에 반영한다. 실제로 그렇게 했다.
이 가설에는 검증 방법이 빠져 있었다. 「더 찾는다」는 처방은 찾은 자료가 맞는지 판정하는 단계를 포함하지 않는다. 자료의 양을 늘릴 뿐 자료의 층위를 구분하지 않는다.
무엇으로 확인했나? — 법 이름과 번호를 한 건씩 되짚었다
가설을 검증하려면 오류 세 건이 어디서 왔는지 역추적해야 한다. 초안에 적힌 주장 하나마다 근거로 삼은 문서를 열고, 그 문서가 어떤 종류인지 갈랐다.
- 법 이름 대조 — 초안이 적은 법 이름을 그 나라의 공개 법령 자료와 로펌 해설에서 그대로 찾을 수 있는지
- 법 번호 대조 — 번호가 실재하면 그 번호가 가리키는 법의 내용이 광고 메일 규제가 맞는지
- 숫자 대조 — 「위반 결정 48건」 같은 수치가 감독기관 공개 문서나 대형 로펌 해설에 실려 있는지
- 출처 종류 판정 — 근거로 쓴 문서가 감독기관 공식 문서인지, 대형 로펌 해설인지, 그 밖의 것인지
네 번째 항목이 결정적이었다. 앞의 셋은 오류를 확인해 주지만 왜 났는지는 말해 주지 않는다.
판정 결과, 오류 세 건의 근거는 전부 같은 종류였다. 규제 준수 도구를 파는 회사가 자사 블로그에 올린 설명 글, 그리고 검색 결과 요약이다. 감독기관 문서도 아니고 로펌 해설도 아니었다.
법 이름과 번호를 그대로 대조하는 이 작업은 사람이 손으로 하기에 지루하고, 지루한 검사는 바쁠 때 가장 먼저 생략된다. 이 점이 뒤에 고칠 지점을 정했다.
알리바이 — 검색은 이미 매번 하고 있었다
첫 가설은 여기서 죽었다. 검색을 덜 해서 난 오류가 아니었다.
회신을 고쳐 쓰는 라운드마다 나라별 검색은 실제로 돌고 있었다. 검색을 안 한 나라는 없었고, 오히려 오류가 난 세 나라는 검색을 더 많이 돌린 쪽이었다. 자료가 귀할수록 더 찾았기 때문이다.
그러니까 검색 횟수를 늘리는 처방은 이미 집행된 상태에서 다섯 나라 중 셋이 틀린 것이다. 같은 처방을 한 번 더 집행할 이유가 없다.
여기서 실패 지점의 위치가 바뀐다. 문제는 자료를 찾는 단계가 아니라 찾아온 자료를 받아들이는 단계에 있었다. 검색은 결과를 가져다줄 뿐, 그 결과가 1차 자료인지 남의 요약인지는 알려 주지 않는다.
비슷한 형태의 오판을 앞서 한 번 겪은 적이 있다. 어떤 플랫폼이 특정 사용을 허용하는지 조사하며 서비스 기능 화면만 보고 「공식 경로가 없다」고 단정했는데, 실제로는 계정 종류 층에 답이 있었다. 그 기록은 AI 에이전트 오판, 원인은 계정 레이어 확인 누락이었다에 정리해 뒀다. 두 사고 모두 「어디까지 봤는가」가 아니라 「어느 층을 봤는가」에서 갈렸다.
진짜 원인 — 남의 요약을 1차 자료로 읽었다
원인은 하나로 모인다. 요약본을 원본으로 오인하는 실패 모드다.
규제 준수 도구를 파는 회사의 블로그 글은 읽기 좋게 정리돼 있다. 나라별로 표가 있고, 법 이름이 굵게 적혀 있고, 위반 시 과태료까지 숫자로 나온다. 형태만 보면 감독기관 문서보다 잘 정리된 자료다. 그런데 그 글의 목적은 자사 제품 판매이고, 법 이름을 정확히 적을 책임을 지지 않는다.
검색 결과 요약도 같은 자리에 있다. 요약은 원문 여러 개를 압축하는 과정에서 「어느 문장이 어느 문서에서 왔는지」를 잃는다. 없는 법 이름 하나가 그 압축 과정에서 만들어지면, 읽는 쪽에는 확신에 찬 한 문장으로만 도착한다.
검색 횟수를 늘려도 이 실패 모드는 줄지 않는다. 요약을 더 많이 읽을 뿐이다. 필요한 것은 검색량이 아니라 자료의 층을 가르는 관문이었다. 그 관문이 없었다는 점이 이 사고의 진짜 원인이다.

초안은 결국 여섯 번째 판까지 갔고, 그 사이 사실 오류와 근거 없는 약속을 합쳐 열한 건 넘게 고쳤다. 나간 메일 한 통을 만드는 데 든 수정 횟수다.

왜 이게 형사 리스크인가? — 변호사법 제109조
고객에게 보내는 유료 제안 문서 안에 법 이야기를 적는 일은 예의 문제가 아니라 처벌 조항이 걸린 문제다.
변호사법 제109조 제1호는 변호사가 아니면서 금품이나 그 밖의 이익을 받거나 받을 것을 약속하고 법률상담을 포함한 법률사무를 취급한 경우를 처벌한다. 법정형은 7년 이하의 징역 또는 5천만 원 이하의 벌금이다. 우리는 이 조문을 기억이 아니라 정부 법령 자료에서 직접 열어 확인했다.
성립 요건의 핵심은 대가성이다. 유료 용역 제안서 안에 법률 정보를 넣으면 「이익을 받을 것을 약속하고 법률상담을 했다」로 읽힐 여지가 생긴다. 정보가 정확한지와는 별개 축이다.
그래서 면책 문구의 설계 기준이 정해졌다. 국내에서 흔히 쓰는 네 요소는 목적 한정, 자문이 아님, 정확성 부인, 책임 제한이다. 그 넷만으로는 대가성을 끊지 못한다. 우리에게 반드시 필요한 두 요소는 자격 부인과 대가 부인이다.
고친 방법 ① — 면책 문구의 핵심은 두 문장이다
법령이나 규제 내용을 담는 모든 회신, 제안서, 보고서에 표준 면책 문구를 붙이도록 회신 작성 규칙 문서에 조항을 신설했다. 예외를 두지 않았다.
- 자격 부인 — 저희는 법률사무소가 아니고 법률 자문을 제공할 자격이 없습니다
- 대가 부인 — 이 안내는 용역 범위에 포함하지 않으며, 이에 대해 별도의 대가를 받지 않습니다
- 출처 한정 — 각국 공개 법령과 규제기관 자료, 로펌의 공개 해설을 정리한 것이라 사실과 다를 수 있습니다
- 판단 이관 — 실제 판단은 담당 기관과 법률자문의 확인에 따르셔야 합니다
두 번째 줄을 빼면 이 문구는 목적을 잃는다. 정확성만 부인하고 대가성을 그대로 두면 조문이 겨냥하는 지점이 남기 때문이다.
같은 이유로 금액을 안내하는 절에도 한 줄을 더 넣었다. 법률 정보 안내가 용역 범위에 들어가지 않는다는 문장이다. 대가 부인을 문서 안 두 곳에서 건다.

고친 방법 ② — 법 이름을 기계가 먼저 대조한다
문구만으로는 없는 법이 계속 실린다. 면책은 책임을 다루지 사실을 다루지 않는다. 그래서 두 번째 장치를 붙였다.
해외 법령을 문서에 인용하기 전에 확인 스크립트를 통과시키도록 의무화했다. 국내 법령을 정부 법령 서비스 자료로 정확히 일치시켜 확인하던 도구가 이미 있었고, 그 해외판이다. 조회 계층으로는 전 세계를 무료로 커버하는 대형 로펌 공개 해설을 쓴다.
근거로 인정하는 자료를 두 종류로 못 박았다. 감독기관 공식 문서와 대형 로펌 해설이다. 규제 준수 도구 판매사의 블로그와 검색 최적화용 콘텐츠는 금지했다. 이번 오류 세 건의 출처가 전부 그쪽이었기 때문이다.
검사를 사람 판단이 아니라 명령 한 줄로 만든 이유는 단순하다. 규칙은 잊히고 코드는 안 잊힌다. 지루한 대조 작업일수록 바쁠 때 먼저 생략된다.
일반어 네 개가 전부 통과했다 — 게이트를 다시 좁힌 이유
만든 검사기를 그대로 믿지 않고 깨뜨리는 시험부터 돌렸다. 통과하면 안 되는 입력을 넣어 통과하는지 보는 방식이다.
여기서 거짓 통과 네 건이 나왔다. 법 이름 자리에 the, Act, Law, Regulations 같은 일반어를 넣으면 전부 통과했다. 로펌 해설 본문에는 그런 단어가 당연히 들어 있으니, 문자열이 발견되기는 한다.
이 상태로 두면 검사기가 가장 위험한 방향으로 작동한다. 법 이름을 흐릿하게 적을수록 통과하기 쉬워지기 때문이다. 그래서 법 이름이 충분히 구체적인지 먼저 보고, 아니면 검사 자체를 거부하도록 관문을 하나 더 앞에 세웠다.

고친 뒤 세 종류로 다시 시험했다. 실재하는 법을 정확히 적었을 때 통과하는지 네 건 중 네 건, 이번 사고의 세 오류를 다시 넣었을 때 막는지 세 건 중 세 건, 일반어를 거부하는지 네 건 중 네 건이다.

나라별 수집기를 왜 만들지 않았나?
더 튼튼한 대안이 하나 있었다. 나라별 법령 사이트에서 원문을 직접 받아오는 수집기를 짜는 방법이다. 로펌 해설을 거치지 않으니 자료의 층이 한 칸 올라간다.
먼저 실제로 붙어 봤다. 첫 시도에서 네 나라가 각기 다른 이유로 막혔다.

재조사에서 결과가 뒤집혔다. 다섯 나라 중 네 나라는 실제로 열렸고, 처음 막힌 원인은 사이트 차단이 아니라 우리 쪽 주소 오류와 인증서 처리 누락이었다. 즉 「기술적으로 불가능하다」는 기각 사유는 성립하지 않았다.
그래도 만들지 않았다. 기각 사유를 바꿔서 기각했다. 나라별 해석기 다섯 개에 현지어 번역이 붙고, 법령 사이트가 개편될 때마다 손이 간다. 해외 건은 이번이 첫 문의라 유지비를 상시로 지출할 근거가 없다. 같은 유형의 거래가 세 건을 넘으면 다시 검토하기로 하고, 그때 먼저 붙일 나라 순서까지 적어 뒀다.
이 장치가 못 잡는 것은 남겨 둔다
확인 스크립트는 검증기가 아니라 날조 탐지기다. 이 구분을 문서에 그대로 적었다.
- 잡는 것 — 존재하지 않는 법 이름, 실재하지만 다른 법의 번호, 공개 자료에 근거가 없는 주장
- 못 잡는 것 — 조문 해석 오류, 적용 범위 오판, 최근 개정 미반영
- 못 잡는 것 — 로펌 해설이 다루지 않는 인접 법. 태국의 컴퓨터범죄법이 그 예다
2차 자료의 문자열을 대조하는 방식이라 원리상 여기까지다. 이 한계를 지우려면 앞 절에서 기각한 나라별 수집기가 필요하고, 그 판단은 거래가 쌓인 뒤로 미뤘다.
한계를 적어 두는 이유는 다음 사고를 대비하기 위해서다. 검사기를 통과했다는 사실이 「법적으로 확인됐다」로 읽히면 이 장치가 오히려 위험을 키운다.
같은 실수를 막는 장치 — 발송 전 검사 목록의 한 줄
개별 문장을 고치는 대신 문장이 나갈 수 없는 경로로 바꿨다. 남은 장치는 셋이다.
- 회신 작성 규칙 문서에 표준 면책 문구 조항을 신설하고, 법령을 담는 모든 문서에 예외 없이 적용
- 해외 법령을 인용하기 전 확인 스크립트 통과를 의무화하고, 근거로 인정하는 자료를 감독기관 문서와 대형 로펌 해설 둘로 한정
- 발송 전 자기검증 목록에 외부 사실 인용 항목을 두어, 출처와 최종 판단 주체 문구가 본문에 있는지 확인
이번 회신은 마지막 판까지 이 세 관문을 거쳐 나갔다. 대표 승인이 필요한 발송 단계는 그대로 남겼다. 기계 검사는 없는 법을 막지만 「이 문장을 이 고객에게 지금 보낼 것인가」를 판정하지 않는다.
정리하면 이 사고에서 바뀐 것은 조사량이 아니다. 조사는 처음부터 하고 있었고, 그런데도 다섯 나라 중 셋이 틀렸다. 바꾼 것은 무엇을 근거로 인정할지의 경계와, 그 경계를 사람이 아니라 명령이 검사한다는 점이다.
해외 영업 메일 대행이나 문서 자동화를 검토 중이라면 이 글에 적힌 실패 모드부터 확인해 보길 권한다. 구체적인 상황이 궁금하면 상담으로 물어보면 된다.
이 글은 SGK 스튜디오에서 회신 문서 파이프라인을 만들고 굴리는 사람이 썼다.