MyAI(마이아이)개발 · 제품 · 운영 학습 노트

리버스 엔지니어링: 법과 합법적 활용

학습 목표: 리버스 엔지니어링이 무엇이고 왜 하는지 설명하고, 한국·미국·EU 법과 계약이 정한 경계를 구분하며, 경쟁 제품 분석과 자기 레거시 해독을 합법적인 범위에서 검증하며 진행할 수 있다.

1인 스튜디오도 리버스 엔지니어링과 마주친다. 경쟁 서비스의 가격 구조를 살펴볼 때, 문서 없이 남은 자기 코드와 데이터 파일을 다시 읽을 때다. 이 문서는 분석 기법이 아니라 법의 경계와 합법적 활용을 다룬다. Agent에게 줄 권한은 「권한 · Sandbox · Hook」, 모델에게 무엇을 보여 줄지는 「AI 엔지니어링의 층: 프롬프트 · 컨텍스트 · 하네스」, 검증을 되먹이는 반복 구조는 「루프 엔지니어링」, 외주 코드의 권리 귀속은 「계약 · 지식재산 · 오픈소스」에서 다룬다. 법 조문과 판례는 2026-09 기준이며, 원문을 직접 열지 못하고 검색 결과로만 확인한 것은 참고 자료에 표시했다.

이 문서는 일반 정보이며 법률 자문이 아니다. 법 해석은 사실관계와 시점에 따라 달라진다. 타인의 소프트웨어나 서비스를 분석하기 전에는 변호사와 상담한다.

핵심 개념

정의

Forward engineering은 요구사항에서 설계와 구현을 거쳐 완성품으로 간다. Reverse engineering은 방향이 반대다. 이미 완성된 제품에서 출발해 그 설계, 구조, 동작을 되찾는다. 좋은 산출물은 원본의 사본이 아니라 근거가 붙은 설명이다. "무료 체험 7일 뒤 결제 화면이 뜬다", "이 저장 파일의 첫 필드는 버전 번호다" 같은 문장과, 그것을 다시 확인하는 방법이 결과물이다.

왜 하는가

목적이 같아도 대상과 방법에 따라 합법 여부가 갈린다. 아래 원리는 그 경계를 다룬다.

원리

한국: 저작권법의 프로그램코드역분석

한국: 영업비밀과 정보통신망

미국과 EU

계약: EULA와 ToS

소프트웨어 EULA와 서비스 이용약관(ToS)에는 역분석, 자동 수집, 비공식 client 사용, 경쟁 제품 개발·비교 분석(benchmark) 목적 이용, benchmark 결과 공개를 금지하는 조항이 흔하다. 한국에서 이런 조항이 제101조의4의 허용 범위를 얼마나 좁힐 수 있는지는 이 문서에서 확인하지 못했다. 법적 결론과 별개로 실무 위험은 분명하다. 계정 정지, 앱 스토어·API 접근 차단, 계약 위반 청구, 협력 관계 단절이다. 1인 스튜디오에는 하나의 계정 정지도 사업 중단이 될 수 있다.

"해도 되나?" 판단

flowchart TD
    A[분석하고 싶은 대상] --> B{내 코드나 내 데이터인가}
    B -->|예| C[진행: 설명은 테스트로 검증]
    B -->|아니오| D{보호조치 우회나 비공개 서버 접근이 필요한가}
    D -->|예| W{서면 허가나 bug bounty 범위가 있나}
    W -->|예| S[허가 범위 안에서만 진행]
    W -->|아니오| X[하지 않는다]
    D -->|아니오| E{정상 고객으로 사용하며 관찰만 하나}
    E -->|예| F{약관이 이 이용을 금지하는가: benchmark와 경쟁 개발 포함}
    F -->|아니오| G[대체로 가능: 내부 참고로만]
    F -->|예| L[멈추고 변호사 상담]
    E -->|아니오| H{호환 목적이고 정보를 달리 얻을 수 없나}
    H -->|예| L
    H -->|아니오| X
상황 허용되는 조건 위험(일반적 판단)
경쟁 서비스에 정상 가입해 화면·가격·온보딩 기록 정상 가입·결제, 수작업 관찰, 내부 참고용, 약관에 benchmark·경쟁 개발 금지 조항이 없을 것 조항이 없으면 낮음, 있으면 높음
공개 문서·공개 API·SDK로 연동 문서의 이용 조건과 호출 한도 준수 낮음
내 코드, 권리를 넘겨받은 외주 코드, 내 데이터 파일 해독 권리 귀속을 계약으로 확인 낮음
구매한 소프트웨어와 호환되는 도구를 만들기 위한 분석 제101조의4 요건 충족, EULA 확인, 사전 자문 중간~높음
권한을 받은 보안 점검 서면 허가나 bug bounty 범위 안에서만 허가 없으면 높음
경쟁 앱을 분석해 기능·코드를 옮겨 오기 호환 목적이 아니고 유사 프로그램 금지에 걸릴 수 있음 높음
비공개 API로 경쟁사 데이터 자동 수집 약관 위반, 정보통신망법·부정경쟁 쟁점 높음
DRM·라이선스 확인 무력화 제104조의2의 좁은 예외 밖이면 금지 높음
추출한 이미지·음원·폰트 재사용·재배포 권리자 허락 없이는 불가 높음

적용: 1인 스튜디오의 합법적 리버스 엔지니어링

경쟁 제품 teardown: 고객으로 사용하고 기록한다

정상 고객으로 가입하고, 필요하면 실제로 결제한다. 자동화 도구나 비공개 경로 없이 사람이 사용하며 본 것만 기록한다.

기록 항목 무엇을 적나 쓰는 곳
온보딩 가입 단계 수, 첫 가치까지 걸린 시간, 요구하는 정보 Activation 설계
가격 요금제 이름, 가격, 무료 한도, 체험 기간, 연간 할인, 해지 절차 가격 설계
Funnel 결제 유도 시점, paywall 위치, 이메일·푸시 순서와 간격 Lifecycle 설계
기능 구조 메뉴 구조, 요금제별 기능 차이, 빠진 기능 Positioning, roadmap
고객 목소리 공개 리뷰의 반복 불만과 칭찬 차별점 가설
  1. 가입 전에 약관에서 경쟁 제품 개발·benchmark 목적 이용 금지, benchmark 결과 공개 금지 조항을 찾아 날짜와 함께 기록한다. 있으면 위 판단 흐름의 변호사 상담 경로를 따른다.
  2. 기록은 날짜와 화면 캡처를 붙여 한 표에 모은다. 가격과 약관은 자주 바뀐다.
  3. 여러 경쟁 제품을 같은 열로 비교하고, 모두가 하는 것과 아무도 안 하는 것을 표시한다.
  4. 빈칸을 고객 문제로 바꿔 「시장·고객 리서치 · Segmentation」의 인터뷰로 검증하고, 「문제 발견 · 전략 · Roadmap」에 올린다.
  5. 검증된 차이를 「Positioning · Messaging · Brand」의 positioning 문장으로 만든다. 가격은 「유료 판매·구독과 가격 설계」의 틀로 정한다.
  6. 경쟁사 이름을 광고에 쓰려면 먼저 「법 · 윤리 · 광고 표시」를 본다. 캡처와 문구는 내부 자료로만 쓰고 공개하지 않는다.

내 레거시 코드와 데이터 파일을 AI agent와 읽기

문서 없이 남은 내 코드나 내 앱이 만든 저장 파일을 이해할 때 AI agent는 빠른 조수다. 다만 agent의 설명은 가설이지 사실이 아니다. 그럴듯하지만 틀린 설명이 가장 위험하다.

  1. 권리 확인: 내 코드이거나 권리를 넘겨받은 코드인지 계약으로 확인한다.
  2. 작업 공간 분리: 원본이 아니라 사본에서 작업하고, agent의 쓰기와 네트워크 권한을 좁힌다(「권한 · Sandbox · Hook」). 샘플은 내 앱이 만든 파일만 쓰고, 고객 데이터가 섞였다면 먼저 익명화한다.
  3. 질문 하나씩: "이 모듈은 무엇을 하나"보다 "이 함수가 저장 파일의 버전 필드를 어떻게 쓰나"처럼 좁게 묻는다.
  4. 설명을 가설로 기록: agent 설명마다 확인 방법을 한 줄 붙인다.
  5. 실행으로 검증: 기존 테스트를 돌리고, 현재 동작을 고정하는 characterization test를 추가하고, 옛 프로그램과 새 코드의 출력을 같은 입력으로 비교한다. 비교 기준 파일(golden file)은 옛 프로그램을 실제로 실행해 만들고, agent의 설명을 보고 손으로 쓰지 않는다. 실패하면 가설을 고쳐 다시 묻는다(「루프 엔지니어링」).
  6. 확인된 것만 문서화: 검증을 통과한 설명만 README나 형식 문서에 옮긴다.
# Characterization test: pin today's behaviour before trusting any explanation
# The golden file comes from running the legacy program, never from the agent's explanation
import json
import subprocess

def test_new_reader_matches_legacy_output(tmp_path):
    out = tmp_path / "new.json"
    subprocess.run(["python", "new_reader.py", "samples/save_001.dat", str(out)], check=True)
    legacy = json.loads(open("samples/save_001.legacy.json", encoding="utf-8").read())
    assert json.loads(out.read_text(encoding="utf-8")) == legacy

심화

경계가 흐려지는 곳

변호사에게 가야 할 때

흔한 오해

자기 점검 질문

  1. 제101조의4 제1항의 세 요건과 제2항의 이용 제한을 각각 설명할 수 있는가?
  2. 경쟁 서비스 teardown에서 허용되는 관찰과 피해야 할 행위를 하나씩 들면?
  3. 2021도1533 형사 판결과 보도된 민사 1심 판결은 무엇이 달랐고, 스튜디오에 주는 교훈은?
  4. EU 제8조·SAS 판결과 Bowers v. Baystate·Vault v. Quaid는 계약 조항의 효력을 어떻게 다르게 봤는가?
  5. AI agent가 레거시 파일 형식을 설명했을 때, 그 설명을 문서에 옮기기 전에 무엇으로 검증하겠는가?

참고 자료