Skip to main content
비하인드
비하인드DecisionsPremium

우리 코드 속에 들어 있는 법

로그인 없이 작동해야 하는 해지 버튼. 절대 거절하면 안 되는 양식. 우리에게 법적 의무가 상투적인 문구가 아니라 설계인 이유를 이야기해요.

게시일 작성자 AlphaCloud4 분 분량

Premium을 구매할 수 있게 만들 때, 우리는 법적인 부분이 푸터에 들어가는 몇 페이지짜리 글이라고 생각했어요. 틀렸어요. 어떤 의무는 글로 적어 넣을 수가 없어요. 기능을 어떻게 만들어야 하는지를 정해 버리니까요.

그게 특히 분명해진 예 네 가지를 소개할게요. 먼저 분명히 해 둘게요: 이건 우리 구현에 대한 설명이지 법률 자문이 아니에요. 아래 규칙은 AlphaCloud가 운영되는 곳인 독일의 법이에요.

로그인이 있으면 안 되는 해지 버튼

독일 민법 제312k조는 온라인으로 맺은 계약에 대해 바로 접근할 수 있는 해지 방법을 제공하라고 요구해요. 여기서 나중에 문구로는 덧붙일 수 없는 요구 사항이 생겨요:

  • 페이지는 로그인 없이 작동해야 해요
  • 모든 페이지의 푸터에 있어야 해요
  • 두 단계가 필요해요: 입력하고, 명확하게 이름 붙인 버튼으로 확인하기
  • 텍스트 형식의 접수 확인이 발송되어야 해요

마지막 항목이 설계를 좌우해요. 해지는 일방적인 의사 표시이고, 상대방에게 도달하는 순간 효력이 생겨요. 그래서 누가 보냈든 항상 기록하고 확인해야 해요.

양식은 절대 거절하면 안 돼요

여기서 가장 그럴듯한 방법이 실수로 이어질 뻔했어요.

가장 그럴듯한 방법은 이거예요: 서버 ID와 이메일이 활성 구독과 일치할 때만 해지를 받기. 합리적으로 들리지만, 두 가지 면에서 틀렸어요.

첫째, 이메일을 잘못 입력했거나 다른 주소를 적은 진짜 고객을 막아 버려요. 그 사람의 해지는 도달하지 않은 게 되고, 구독은 갱신되며, 그 사람은 시도했다는 증거를 갖고 있어요.

둘째, 이게 더 불편한 부분인데: 오류 메시지 자체가 답이 돼요. "구독을 찾을 수 없어요"라는 답을 받은 사람은 이 서버가 결제하지 않는다는 걸 알게 돼요. Discord 서버 ID는 비밀이 아니에요, 어떤 멤버든 읽을 수 있어요. 양식이 남의 서버를 떠보는 도구가 되는 거예요.

해결책은 하나처럼 느껴지는 두 가지를 분리하는 거예요:

조건
의사 표시의 접수 무조건, 항상 기록하고 확인해요
해지의 실행 제출한 이메일이 등록된 구매자와 일치할 때만

나머지는 모두 대기열에 들어가고 사람이 검토해요. 이게 허용되는 이유는 제312k조 제2항이 신원 확인 정보를 요청하는 걸 명시적으로 허용하기 때문이에요. 금지된 건 그 앞에 로그인을 두는 것뿐이에요.

같은 이유로, 공개 응답에는 신원이 확인된 경우에만 종료일을 적을 수 있어요. 그렇지 않으면 확인 메시지가 다시 정보를 흘리는 창구가 돼요.

일부러 로그인을 둔 철회

바로 옆에 정반대로 만든 기능이 있어요: 일할 환불이 따르는 철회는 로그인 뒤에 있어요.

모순이 아니에요. 제312k조는 철회가 아니라 해지에 관한 규정이고, 비공식적인 방법이 열려 있는 한 온라인 철회 양식을 제공할 의무는 아예 없어요. 차이는 결과에 있어요: 해지는 미래에 영향을 주지만, 환불은 지금 돈을 움직이고, 되돌릴 수 없어요.

여기서 나오는 세 가지 규칙은 느슨하게 만들지 않아요:

필수 사유 없음. 제355조 제1항은 철회를 명시적으로 이유 없이 할 수 있게 해요. 통계를 위해 필수 항목으로 만들고 싶은 유혹이 아무리 커도, 이 칸은 선택 사항이고 선택 사항으로 남아야 해요.

14일이 지나면 자동 처리만 거절하고, 의사 표시는 절대 거절하지 않아요. 고객이 제대로 안내받지 못했다면 기간은 최대 12개월 14일까지 늘어나요. 그래서 일괄적으로 "너무 늦었어요"라고 하는 건 틀릴 수 있어요.

이중 지급을 막는 장치는 비관적으로 작동해요. 표시는 환불이 실행되기 전에 설정돼요. 그다음 환불이 실패하면 표시는 그대로 남고 사람이 이어받아요. 두 번 지급하는 것만이 되돌릴 수 없는 유일한 결과니까요.

Discord DM은 영구적인 저장 매체가 아니에요

제312f조 제3항은 영구적인 저장 매체로 계약 확인을 하라고 요구하고, 그 확인에는 받은 동의 내용이 다시 담겨야 해요.

처음에 우리는 Discord DM을 보냈어요. 어차피 고객들이 있는 채널이니까요. 그걸로는 충족되지 않아요. DM은 우리가 통제하지 못하는 플랫폼에 있고, 이 조항이 말하는 의미로 저장할 수도, 변경 불가능하지도 않아요.

그래서 이메일을 추가했고, 그와 함께 불편한 의존성이 생겼어요: 메일 인증 정보가 설정되어 있지 않으면, 발송은 로그에 경고만 남기고 의무는 충족되지 않아요. 법적 의무가 환경 변수 하나에 달려 있다는 건 알고 있어야 할 상태예요.

부가가치세 없음, 그리고 어디서나 똑같이 읽혀야 해요

AlphaCloud는 독일 부가가치세법 제19조에 따른 소규모 사업자예요. 가격은 최종 가격이고, 부가가치세는 절대 표시되지 않아요.

각주처럼 들리지만, 실제로는 여러 곳에 걸친 일관성 작업이에요: 요금 페이지, 결제 창, 이용약관, 개인정보 처리방침, 청구서 하단 문구, 결제 대행사 설정까지 모두 같은 내용을 말해야 해요. 우리는 꽤 오랫동안 그냥 틀린 "부가가치세 별도" 문구를 그대로 두고 있었어요.

그리고 AI

2026년 8월부터 유럽 AI법의 투명성 의무가 전면 적용돼요. AI 시스템과 대화하는 사람은 늦어도 첫 상호작용 때 그 사실을 알아볼 수 있어야 해요.

그 검토에서 우리에게 가장 중요한 문장은 이거예요: 푸터에 있는 법적 고지 페이지로는 아마 충족되지 않아요. 안내는 상호작용이 일어나는 곳, 즉 Discord 메시지 자체에서 이루어져야 해요. 그래서 우리 AI 티켓 지원은 묻지 않아도 먼저 자신을 소개하고, 끌 수 있는 버튼이 눈에 보이게 있어요. 자세한 평가는 AI 투명성에 있어요.

공통점

네 가지 예는 모두 같은 모양이에요: 의무는 글처럼 보였지만, 실제로는 구조에 대한 요구 사항이었어요. 잘못된 곳에 있는 로그인, 너무 많은 걸 드러내는 오류 메시지, 잘못된 채널로 간 확인, 이중 지급을 허용하는 순서까지요.

그래서 우리는 이제 법률 문서를 명세서처럼 읽고, 반대 방향으로도 확인해요: 코드가 정말 우리 약관에 적힌 대로 하고 있나요? 바로 그 질문에서 실제로 어긋난 부분 두 개를 찾았고, 그 이야기는 따로 글을 썼어요.

더 많은 글