Skip to content

보안

이 기록을 지키는 것은 무엇인가

작업 내역, 고객 주소, 그리고 받을 돈까지 모두 여기에 들어 있습니다. 이 페이지에는 저희가 그것을 지키려고 무엇을 만들었는지, 지금 무엇이 돌아가고 있는지, 그리고 그 보호가 어디에서 끝나는지를 적었습니다.

격리

한 회사는 다른 회사를 절대 볼 수 없습니다

나머지 모든 것이 이것에 달려 있기에, 저희는 이를 이중으로 보호하고 컴퓨터가 대신 검증하도록 했습니다.

  • 회사 사이에는 하나가 아니라 두 개의 벽이 있습니다

    모든 기록에는 어느 회사 것인지 표시가 붙어 있고, 저희 서버가 데이터베이스에 보내는 요청은 요청한 그 회사 범위로 제한됩니다. 그 아래에서는 데이터베이스 자체가 같은 벽을 한 번 더 세웁니다. 회사 기록을 담은 테이블마다 자체 규칙이 걸려 있어서, 앱 쪽 오류 하나만으로는 이 벽을 넘을 수 없습니다.

  • 이 벽은 사람의 기억이 아니라 컴퓨터가 검증합니다

    자동 테스트가 운영 데이터베이스를 읽어 회사 표시가 붙은 테이블을 모두 찾아냅니다. 그중 규칙이 빠진 테이블이 하나라도 있으면 테스트가 실패하면서 그 이름을 그대로 알려 줍니다. 저희는 짐작하지 않고 하나하나 세어서 확인하며, 예외 목록은 비어 있습니다.

  • 출시 전에 한 회사로 다른 회사를 시험합니다

    앱이 호출할 수 있는 주소를 새로 열 때마다 테스트를 하나 함께 만듭니다. 한 회사로 로그인한 다음 다른 회사의 데이터를 읽어 보는 테스트입니다. 동기화, 가격 책정, 저장된 파일 이름에는 각각 별도의 테스트가 있습니다.

무결성

기록은 몰래 바뀔 수 없습니다

작업을 두고 다툼이 생겼을 때는 이력이 곧 증거입니다. 그래서 저희를 포함해 누구도 모르게 이 기록을 바꿀 수 없도록 만들었습니다.

  • 이력은 추가만 가능하며, 각 행이 바로 앞 행을 잠급니다

    이력의 모든 행에는 이전 행의 지문이 담겨 있어, 어떤 행도 이 연결 고리를 깨뜨리지 않고는 몰래 수정되거나 삭제될 수 없습니다. 데이터베이스 자체가 어떤 수정이나 삭제도 차단하며, 이 보호 장치가 없다면 저희 서버는 시작을 거부합니다.

  • 결제 기록은 절대 수정되지 않습니다

    실수를 바로잡을 때는 예전 행을 상쇄하는 새 행을 추가합니다. 예전 행은 절대 손대지 않습니다. 무엇이 언제 기록되었는지가 그대로 남습니다. 결제 이력은 바로 그러라고 있는 것입니다.

  • 서명 링크는 저희 서버가 만듭니다

    문서 서명에 쓰는 링크는 한 번만 쓸 수 있고, 추측할 수 없으며, 정해진 시간이 지나면 만료됩니다. 이 링크는 저희 서버가 만듭니다. 휴대폰 앱이 직접 만드는 일은 없습니다.

전송 중, 그리고 저장 후

데이터는 어디로 가는가

Cloudflare는 인터넷과 앱이 연결되는 서버 사이에 있습니다. 저희가 직접 정한 차단 규칙을 돌리고, 짧은 시간에 너무 많은 요청을 보내는 쪽의 속도를 늦춥니다. 저희 서버는 그 뒤에서 같은 제한을 한 번 더 겁니다.

  • 전송 중에는 전 구간이 암호화됩니다

    휴대폰과 저희 사이를 오가는 데이터는 모두 HTTPS로 암호화되어, 중간에서 아무도 읽을 수 없습니다. 운영 사이트는 브라우저에 지시를 하나 더 보냅니다. 한 번이라도 방문한 적이 있는 브라우저라면 다시는 암호화되지 않은 연결로 돌아가지 말라는 지시입니다. 그리고 요청은 저희 서버로 바로 오지 않고 Cloudflare를 거쳐서 들어옵니다.

  • 파일은 한 지역에만 저장됩니다

    사진, 문서, 서명은 모두 한 지역(북미 동부)으로 고정한 파일 저장소에 보관합니다. 어느 회사가 어디서 일하든 마찬가지입니다. 운영 서버는 시작할 때 이 설정을 확인하고, 지역이 비어 있거나 "자동"으로 되어 있으면 실행을 거부합니다.

  • 저희는 비밀번호를 절대 보관하지 않습니다

    저희는 비밀번호를 저장하지 않으며, 이를 다시 찾아드릴 수도 없습니다. 저희가 저장하는 것은 암호화 처리된 버전(Argon2)으로, 원래 비밀번호로 되돌릴 수 없습니다. 로그인 시 대조하기에는 충분하지만, 원문을 읽어내기에는 절대 충분하지 않습니다. 또한 짧은 시간 내에 로그인, 가입, 비밀번호 재설정을 시도할 수 있는 횟수에도 상한이 있습니다.

휴대폰에서

휴대폰 자체도 저희가 보호하는 대상의 일부입니다

휴대폰은 트럭 짐칸에 두고 잊어버리기도 하고, 견습공에게 잠깐 빌려주기도 하고, 카운터 너머로 건네지기도 합니다. 저희가 여기서 만든 것은 그런 상황을 위한 것이지, 사무실 책상을 위한 것이 아닙니다.

  • 앱 자체에 내장된 선택적 잠금 기능

    로그인 상태라는 사실만으로 휴대폰을 주운 사람이 회사 전체 데이터에 접근할 수 있어서는 안 됩니다. 앱 잠금 기능은 앱을 열기 전에 휴대폰 자체의 화면 잠금이나 지문 인증을 요구합니다. 직접 켜지 않는 한 기본적으로 꺼져 있으며, 휴대폰 자체에 화면 잠금이 설정되어 있는 경우에만 이 옵션을 제공합니다.

  • 접근 키는 휴대폰 자체의 암호화 저장소에 보관됩니다

    앱은 로그인 상태를 유지해 주는 인증 정보처럼 민감한 항목 몇 가지를 휴대폰에 저장해야 합니다. 이런 항목은 앱의 일반 파일이 아니라 Android 키스토어에 넣습니다. 휴대폰 하드웨어가 직접 보호하는 암호화 저장소입니다.

지속성

백업, 사고 대응, 그리고 데이터를 가져가는 방법

  • 서버 밖에 보관하는, 잠긴 데이터베이스 사본

    한 시간마다 실제 데이터베이스의 전체 사본을 만듭니다. 사본은 보관되기 전에 암호화로 잠기며, 이 작업은 잠기지 않은 사본을 남겨 두지 않습니다. 잠긴 파일이 정말로 잠겼는지 확인한 뒤에야 잠기지 않은 파일을 지웁니다. 그다음 사본 자체의 내용 목록을 확인하고, 앱 자신은 로그인 정보를 갖고 있지 않은 별도의 저장소로 사본을 보낸 뒤, 다시 읽어 들여 도착했는지 확인합니다. 데이터베이스는 모든 변경을 일어나는 순간마다 이어서 기록하기도 하며, 그 기록도 서버 밖으로 복사되므로 되돌리는 일이 마지막 전체 사본에만 묶이지 않습니다. 사진과 PDF, 서명 이미지도 같은 별도 저장소로 복사됩니다. 오래된 사본은 정해진 일정에 따라 두 곳 모두에서 삭제됩니다. 솔직히 말씀드리면, 그 별도 저장소는 같은 저장 업체 안의 두 번째 공간이지 두 번째 회사가 아닙니다.

  • 백업을 되돌려 보며 정말 작동하는지 확인합니다

    아무도 되돌려 본 적 없는 백업은 계획이 아니라 희망입니다. 그래서 저희는 실제 데이터베이스의 진짜 사본을 가져와 예비 데이터베이스에 불러들이고, 기록이 정말 들어 있는지 확인한 뒤에 그 예비본을 버립니다. 갓 만든 사본이 아니라 보관되어 있던 잠긴 사본을 여는 것도 여기에 포함됩니다. 파일 저장소에도 같은 일을 했습니다. 복원된 모든 파일을 복사할 때 기록해 둔 지문과 대조해 확인했습니다. 각 시험은 글로 적고 날짜를 남깁니다. 그 시험들이 무엇을 증명하지 못하는지도 말씀드립니다. 증명하는 것보다 이쪽이 더 중요하기 때문입니다. 저희는 새 장비 위에 서비스를 다시 세워 본 적이 없고, 이어지는 변경 기록을 선택한 시점까지 앞으로 재생해 본 적이 없으며, 백업을 실제 데이터베이스에 되돌려 넣어 본 적이 없고, 전체 복구에 걸리는 시간을 처음부터 끝까지 재 본 적도 없습니다. 그래서 저희는 어떤 복구 목표도 공개하지 않습니다.

  • 문제가 생겼을 때를 위한 문서화된 대응 계획이 있습니다

    문제가 생기면 그때그때 임기응변하지 않고 미리 적어 둔 계획을 따릅니다. 순서는 이렇습니다. 먼저 얼마나 심각한지 파악하고, 더 번지지 않게 막고, 모든 사용자를 로그아웃시키면서 결제 링크와 팀 접근 권한을 끊습니다. 그다음 저희 쪽 키를 바꾸고, 이력을 보존한 뒤 손댄 흔적이 없는지 확인합니다. 마지막으로 피해 범위를 따져 보고 영향을 받은 분들께 알립니다. 저희는 필요 이상으로 미루지 않고 최대한 빨리 알려드리겠습니다. 다만 반드시 지킬 수 있다고 증명하지 못하는 기한은 공개하지 않습니다.

  • 데이터는 원하실 때 언제든 가져가실 수 있습니다

    앱에서 직접 계정 사본을 내려받으실 수 있습니다. 고객, 작업, 청구서, 결제, 영수증, 사진, 그리고 청구서와 견적서 PDF까지 들어 있습니다. 계정 삭제도 앱에서 바로 하실 수 있습니다. 접근 권한은 즉시 끊기고, 정해진 일수가 지나면 데이터는 완전히 지워집니다. 누가 무엇을 했는지에 대한 이력만 저희가 일부러 남겨 둡니다. 이 기록은 추가만 될 뿐 지울 수 없기 때문입니다.

저희가 주장하지 않는 것

아래는 저희가 갖추지 않은 것과 약속하지 않는 것을 적은 목록입니다. 이 가운데 중요한 항목이 있다면 그것이 바로 답입니다. 저희에게 일을 맡기시기 전에 먼저 따져 보세요.

  • 인증도 없고 외부 감사도 받지 않았습니다. 저희에게는 SOC 2 보고서도, ISO 27001 인증도, PCI나 HIPAA 승인도 없습니다. 규모가 큰 거래처가 흔히 요구하는 보안 인증입니다. 회사 밖의 누군가에게 돈을 주고 침입을 시도하게 한 적도 없습니다. Zeus에 대해 그 반대로 말하는 사람이 있다면 사실이 아닙니다.

  • 가동 시간이나 복구 속도는 약속하지 않습니다. 앱이 정상적으로 돌아가는 시간 비율도, 얼마나 빨리 복구하겠다는 목표도, 최근 작업이 얼마나 사라질 수 있는지에 대한 목표도 공개하지 않습니다. 어느 것도 저희가 책임지고 보장할 수 없기 때문입니다.

  • 완전히 안전하다는 약속은 없습니다. 완벽하게 안전한 시스템은 존재하지 않으며, 그 반대로 주장하는 페이지가 있다면 그것은 사실이 아니라 광고 문구입니다.

  • 신호가 없을 때 한 작업은 저희에게 도착하기 전까지 백업되지 않습니다. 신호가 없는 동안 바뀐 내용은 앱이 서버에 연결될 때까지 그 휴대폰에만 남아 있습니다. 신호가 다시 잡히면 앱을 열어 전송되도록 해 주세요.

보안 취약점 신고하기

문제를 발견하셨다면, 이 앱으로 일하는 다른 사업자를 통해 전해 듣기보다 직접 알려주시는 편이 낫습니다. 포상금 제도도 없고 보상도 없지만, 실제 담당자가 직접 답변드립니다.

다음 규칙을 따라주세요

  • 다른 사람에게 알리기 전에 저희가 먼저 문제를 해결할 시간을 주세요.
  • 살펴보시는 동안 본인 것이 아닌 데이터는 열어 보거나 고치거나 따로 보관하지 말아 주세요.
  • 저희가 미리 서면으로 동의하지 않는 한, 대량의 트래픽으로 운영 사이트가 얼마나 버티는지 시험하거나, 자동 스캔 도구를 돌리거나, 침입을 시도하지 말아 주세요.
  • 무엇을 하셨는지, 무엇을 확인하셨는지, 그리고 저희가 재현할 수 있을 만큼 충분한 세부 정보를 알려주세요. 간단한 설명이라도 아예 없는 것보다 낫습니다.

이 규칙은 저희 허용 가능한 사용 정책과 동일합니다.

이 페이지의 상태 안내

이 페이지는 읽기 쉽도록 작성되었습니다. 계약서가 아니며, 법적으로 저희에게 주장할 수 있는 어떠한 내용도 약속하지 않습니다. 그러한 효력을 갖는 실제 문서는 저희 법률 문서 모음 안의 서비스 약관 개인정보 처리방침입니다. 보안 작업은 멈추지 않으므로 이 페이지의 내용도 계속 바뀝니다. 이 페이지와 그 문서가 서로 다르게 말한다면 문서가 우선합니다.

이 페이지의 내용에 대해 궁금한 점이 있으시면 [email protected]로 보내주세요. 그 밖의 문의는 문의하기 페이지를 이용해 주세요.