Chrome에 추가

작동 방식

보안을 검토하는 분들을 위한 기술 개요입니다. 여기 적힌 내용은 모두 소스 코드로 확인할 수 있습니다. 우리에게 불리한 부분도 빼지 않고 그대로 적었습니다.

구조

백엔드가 없습니다. 이 확장 프로그램은 Manifest V3 기반 Chrome 확장 프로그램으로, OTPAuth를 사용해 TOTP/HOTP 코드를 기기에서 생성합니다. 서버를 운영하지 않고, 계정을 보관하지 않으며, 사용자 데이터가 우리에게 도달할 수 있는 경로 자체가 없습니다.

서버가 없으므로 서버 측 키 자료도, 키 위탁도, 우리가 통제하는 복구 경로도 없습니다. 사용자가 비밀번호를 잊고 복구 코드까지 잃으면 우리가 해줄 수 있는 일은 없습니다. 의도된 설계입니다.

암호화

비밀번호 보호는 선택 사항이며 기본값은 꺼짐입니다. 켜면 다음과 같습니다:

암호 알고리즘
AES-256-GCM, 레코드마다·재기록마다 무작위 96비트 IV
키 유도
PBKDF2-HMAC-SHA256, 600,000회 반복, 128비트 무작위 솔트(OWASP 권고 기준)
마스터 키
256비트, crypto.getRandomValues로 한 번만 생성하며 비밀번호는 이를 감싸는 역할만 합니다
지문
HKDF로 유도한 하위 키를 사용하는 HMAC-SHA256, 기기 간 레코드 병합에 사용합니다
잠금 해제된 키의 보관
chrome.storage.session — 메모리에만 존재하고 디스크에 기록되지 않으며, 브라우저를 닫으면 삭제되고 콘텐츠 스크립트에서 접근할 수 없습니다
자동 잠금
열 때마다 / 5, 15, 60분간 사용하지 않으면 / 브라우저를 닫을 때까지
구현
WebCrypto만 사용합니다. 직접 구현한 암호 프리미티브가 없고, 암호 라이브러리를 번들에 포함하지도 않습니다.

키를 두 단계로 두는 이유

데이터를 비밀번호에서 유도한 키로 직접 암호화하는 일은 없습니다. 레코드는 무작위 마스터 키가 암호화하고, PBKDF2 출력은 그 마스터 키를 감싸기만 합니다. 여기서 두 가지 결과가 따라오는데, 둘 다 중요합니다:

  • 비밀번호를 바꿔도 모든 레코드·모든 백업·모든 내보내기를 다시 암호화하는 대신 32바이트만 다시 씁니다. 저장소가 데이터를 잃는 지점이 바로 그런 대량 재기록입니다.
  • 160비트 복구 코드가 같은 마스터 키를 독립적으로 감쌀 수 있어, 비밀번호를 잊어도 되돌릴 수 있습니다. 코드는 한 번만 표시되고, 확인을 위해 다시 입력해야 하며, 사용할 때마다 새로 발급됩니다. 사용자가 확인하기 전에는 디스크에 아무것도 기록하지 않습니다.

암호화되는 것과 되지 않는 것

비밀번호 보호를 켜면 식별자와 지문을 제외한 계정 레코드 전체가 암호화됩니다. 서비스 이름도 포함되므로, 프로필이 유출돼도 사용자가 어떤 서비스에 계정을 두고 있는지는 드러나지 않습니다. 기능을 켜면 레코드를 암호화한 뒤 복호화해 대조하는 방식으로 검증하고, 그다음에야 평문 사본을 모두 제거합니다. 브라우저 로컬 저장소, 동기화, 그리고 7일치 순환 백업 스냅샷 전부가 대상입니다.

평가에 영향을 주는 부분이라 그대로 밝힙니다:

  • 비밀번호 보호가 꺼져 있으면 계정은 암호화되지 않은 채 저장되고, Chrome 동기화가 켜져 있다면 사용자 본인의 Google 계정을 통해 복제됩니다. 우리에게는 결코 오지 않지만 Google은 보관하게 됩니다. 동기화는 끌 수 있으며, 끄면 이미 올라간 내용도 함께 삭제됩니다.
  • 사이트별 사용 기록(어떤 계정을 어떤 도메인에서 썼는지)은 로컬에 저장되며, 수집되는 동안에는 보관함의 보호를 받지 않습니다. 비밀번호 보호를 켜면 삭제되고, 따로 끌 수도 있습니다.

위협 모델

막아 주는 것

  • 브라우저 프로필 디렉터리를 통째로 훔치거나 복사하는 경우
  • 브라우저 데이터를 대량으로 빼내는 인포스틸러 악성코드
  • 자리를 비운 컴퓨터에 물리적으로 접근하는 사람
  • Chrome 동기화를 통해 계정 레코드가 Google로 넘어가는 것
  • 백업 파일의 분실이나 도난(비밀번호로 보호된 내보내기)

막지 못하는 것

  • 보관함이 잠금 해제된 상태에서 사용자 권한으로 실행되는 악성코드
  • 입력하는 순간 비밀번호를 가로채는 키로거
  • 이미 침해된 브라우저나 운영체제
  • 코드의 대상인 제3자 서비스 자체가 뚫리는 경우

요약하면, 이것이 지키는 것은 저장된 상태의 데이터입니다. 사용 중에 이미 공격자 통제 아래 있는 기기는 지켜 주지 못하며, 지킬 수도 없습니다.

권한

매니페스트가 선언하는 권한은 정확히 두 개이며, 호스트 권한은 없습니다:

storage
계정과 설정은 로컬 저장소에, 잠금 해제된 키는 세션 저장소에, 그리고 선택적인 동기화 사본
activeTab
일치하는 계정을 강조하기 위해 현재 탭의 호스트 이름을 읽고, 사용자가 화면에서 QR 코드를 스캔할 때 해당 탭을 캡처합니다

콘텐츠 스크립트가 전혀 없고, tabs·cookies·webRequest 권한도 없으며, 웹에서 접근 가능한 리소스도 없습니다. 이 확장 프로그램은 어떤 페이지의 내용도 읽거나 바꿀 수 없습니다.

카메라

카메라 QR 스캔은 팝업이 아니라 탭으로 열린 확장 프로그램 페이지에서 실행됩니다. 팝업은 포커스를 잃으면 파괴되는데, 권한 요청이 바로 그 포커스를 빼앗기 때문입니다. 여기에는 매니페스트 권한이 필요하지 않습니다. 브라우저의 표준 카메라 요청을 사용하고, 확장 프로그램 출처 단위로 부여되며 사이트 설정에서 취소할 수 있고, 사용자가 스캐너를 열기 전에는 절대 요청하지 않습니다. 영상은 기기에서 디코딩되며 전송되거나 저장되지 않습니다.

외부로 나가는 통신

일반적인 사용 중에는 어떤 자동 요청도 하지 않으며, Manifest V3는 원격 코드를 금지합니다. 발생할 수 있는 연결은 다음이 전부입니다:

호스트시점사용자 데이터를 담나요?
worldtimeapi.org
timeapi.io
시계 오차 확인. 캐시되며 실패해도 조용히 넘어갑니다. 시계가 어긋나면 TOTP가 어긋납니다.아니요
authenticator.sh설치 시 환영 페이지, 삭제나 평가 시 피드백 페이지.아니요(일반적인 웹 서버 로그)

글꼴, 스크립트, 스타일, 이미지 중 어느 것도 제3자 호스트에서 불러오지 않습니다. 화면을 그리는 데 필요한 것은 모두 패키지 안에 들어 있습니다.

우리가 배포한 것을 검증하기

위 내용 중 어느 것도 그냥 믿을 필요가 없습니다. 확장 프로그램은 오픈 소스이며 모든 릴리스를 재현할 수 있습니다:

  1. Chrome 웹 스토어에서 배포된 .crx를 내려받아 압축을 풉니다
  2. 해당하는 git 태그를 체크아웃합니다
  3. Node 20 LTS에서 npm ci && npm run build를 실행합니다
  4. 생성된 dist/를 압축을 푼 패키지와 비교합니다

빌드된 dist/ 안 모든 파일의 SHA-256을 GitHub 릴리스마다 SHA256SUMS-v<version>.txt 파일로, sha256sum 형식으로 함께 배포합니다. 그래서 4단계는 sha256sum -c 한 번 실행으로 끝납니다. 차이는 아카이브 내부의 파일 순서와, Node 패치 버전에 따른 최소화 출력의 공백 정도로 제한되어야 합니다.

런타임 의존성은 의도적으로 적습니다. OTPAuth, React, jsQR, Zustand, Framer Motion, Lucide뿐이며 저장소에 커밋된 lockfile로 고정되어 있습니다. CycloneDX 형식의 SBOM은 요청하시면 제공합니다.

소스 코드 보기

우리에게 없는 것

저희는 작은 독립 개발사입니다. 다음 중 하나라도 귀사 절차의 필수 요건이라면, 평가가 3주쯤 진행된 뒤보다 지금 아시는 편이 낫습니다:

  • SOC 2, ISO 27001 또는 이에 준하는 인증이 없습니다
  • 현재까지 외부 기관 모의침투 테스트를 의뢰한 적이 없습니다
  • 유료 버그 바운티 프로그램이 없습니다

대신 제공하는 것은 소스 코드의 완전한 공개, 검증 가능한 빌드, 최소한의 권한, 그리고 애초에 귀사의 데이터를 보관할 수 있는 서버 인프라가 존재하지 않는다는 사실입니다.

문의

취약점 제보와 보안 문의는 security@authenticator.sh로 보내주세요. 공개 정책, 적용 범위, 응답 시간, 세이프 하버 조건은 보안 정책 페이지에 있고, 무엇이 저장되고 무엇이 기기를 떠나는지는 개인정보처리방침에 정리되어 있습니다.

서면 공급업체 평가 설문에 답변하거나, 보안팀과 함께 코드를 짚어 나가는 일도 기꺼이 하겠습니다.

보안과 무관한 사안(설치, 계정 복구, 배포 과정의 청구 문의 등)은 지원 페이지을 참고하세요. 취약점 제보는 그쪽으로 보내지 말아 주세요. 그 메일함은 기밀로 취급하지 않습니다.