보안

“믿어 주세요”는 답이 아닙니다.

Klorn은 내가 읽지 않아도 되도록 다른 사람들이 보낸 메일을 대신 읽습니다. 그 문장이 곧 위협 모델입니다. 주된 입력은 낯선 사람이 쓴 텍스트이고, 그중 일부는 악의적입니다. 아키텍처가 실제로 보장하는 것을, 각각을 구현한 파일과 함께 정리했습니다.

이 번역은 편의를 위해 제공되며, 영문판이 우선합니다. 영문판 보기

Google 검증과 독립 평가

Google은 2026-10-03에 Klorn에 대한 OAuth 검증 심사를 마쳤습니다. 그에 앞서 Klorn은 TAC Security로부터 CASA Tier 2 기준 독립 평가를 받았고, 결과는 In Compliance(적합)였습니다. 이 평가의 검증 서한(Letter of Validation)은 이후 Google에 제출되었습니다.

평가
CASA Tier 2, 동적 애플리케이션 보안 테스트(DAST), TAC Security 수행
결과
In Compliance(적합), 보증 수준 AL1(OWASP ASVS Level 1)
날짜
2026-08-12 평가 · 2026-08-30 보고서 발행 · 2026-10-03 Google 심사 완료
재평가
매년. 다음 평가는 2027년 8월 예정

Google 권한 범위(scope) 다섯 개와 각각의 이유

이 다섯 개가 해당 심사에서 승인된 Google 권한 범위이며, Klorn이 요청하는 메일·캘린더 권한 범위의 전부입니다. Gmail 전체 접근 권한은 요청하지 않으며, 캘린더는 calendar.events와 calendar.readonly만 요청합니다 — 캘린더 전체 권한은 요청하지 않습니다.

gmail.readonly
Klorn이 메일을 분류하고, 각 판단의 이유를 보여 주고, 요청할 때 스레드를 요약할 수 있도록 메일을 읽습니다.
gmail.modify
Klorn에서 내가 조작할 때 메일 상태를 바꿉니다: 보관 또는 보관 해제, 휴지통으로 이동 또는 복원, 별표, 읽음 또는 안 읽음 표시, Gmail에 답장 초안 저장.
gmail.send
내가 승인할 때만 메일을 보냅니다 — 내가 확인한 답장, 내가 요청한 mailto 구독 해지 — 또는 내가 직접 정한 규칙에 따른 자동 답장.
calendar.readonly
모든 캘린더의 바쁨/한가함 정보를 읽어, 회의 메일을 실제 일정과 대조하고 겹치는 일정을 잡아냅니다.
calendar.events
Klorn에 요청할 때 기본 캘린더에서 일정을 만들거나 바꾸거나 지웁니다 — 캘린더 설정이나 공유는 건드리지 않습니다.

Google로 로그인할 때는 이름과 이메일만 요청합니다. 메일과 캘린더 권한 범위는 나중에, 메일함을 연결할 때 두 번째 동의 화면에서 요청합니다. 캘린더만 연결할 때는 메일 권한 없이 calendar.readonly만 요청합니다. (openid와 userinfo.email/userinfo.profile도 그 파일에 나옵니다. 어떤 계정으로 로그인했는지 식별하는 용도로, 민감 정보가 아니며 Google 심사 대상에 포함되지 않습니다.)

데이터가 가는 곳

OAuth 토큰은 저장 전에 AES-256-GCM으로 암호화되고, 모든 호스팅 환경은 TLS로만 통신하며, 분석 데이터에는 메일 내용이 절대 포함되지 않습니다 — 각 항목을 구현한 파일은 아래 표에 있습니다. 로그는 보관 기간에 적힌 고정 일정에 따라 만료됩니다. 메일이 우리 서버를 아예 거치지 않기를 원한다면, 같은 코드를 직접 설치해서 내 모델 키나 로컬 모델로 돌리세요. 개인정보처리방침은 /privacy에 있습니다.

이것이 의미하는 것과 의미하지 않는 것. 심사와 평가는 Klorn이 요청하는 Google 데이터를 어떻게 다루는지를 확인합니다. Google이 Klorn을 보증한다는 뜻이 아니며, 해당 권한 범위 밖의 것은 다루지 않습니다. 현재 연결할 수 있는 것은 Gmail, Google 캘린더, 네이버 메일(베타), iCloud 메일(베타)이며, 다른 메일 서비스는 아직 지원하지 않습니다.

아키텍처가 보장하는 것

항목실제로 사실인 것확인할 곳
메일은 적대적 입력모든 메일 본문, 제목, 제3자 문자열은 모델에 닿기 전에 <untrusted_content> 표지로 감싸지며, 조작된 메시지가 감싸기를 닫지 못하도록 기존 감싸기 태그를 먼저 제거합니다. 프롬프트 인젝션은 받아들인 한계가 아니라 대응 범위 안에 있습니다SECURITY.md
저장 시 토큰 암호화토큰이 데이터베이스에 닿기 전에 AES-256-GCM으로 암호화하며, 키링 교체(v1/v2 봉투)를 지원해 유출이 의심되면 일괄 전환일 없이 키를 교체합니다. dev/test 밖에서 키가 없으면 대체 동작으로 넘어가지 않고 부팅을 중단합니다crypto-tokens.ts
외부로 나가는 작업보내기, 영구 삭제, 외부 전달은 분류기의 확신도만으로 실행될 수 없습니다. 각 작업에는 승인 시점에 발급되어 정규화한 페이로드의 sha256을 고정하는 영수증이 필요하고, 실행 시점에 다시 검증합니다. 그 사이에 무엇이든 바뀌었으면 작업은 거부됩니다attention-floor.ts
개발용 편의 기능개발용 JWT 시크릿, 개발용 암호화 키, localhost CORS, 데모 사용자는 dev/test 허용 목록 뒤에 있으며, 그 밖의 모든 NODE_ENV에서는 문제가 생기면 차단하는 쪽으로 동작(fail closed)합니다env.ts
분석자체 수집만. Klorn 자체 Postgres에 저장되는, 짧은 허용 목록의 대략적인 이벤트 이름뿐입니다. 외부 추적기는 없고, 메일 내용은 절대 포함되지 않습니다analytics.ts
전송 중 암호화모든 호스팅 환경에서 TLS만 사용 — API, 웹, Google API, 모델 제공사self-hosting.md

보관 기간

로그 보관 기간은 약속이 아니라 예약된 정리 작업으로 강제됩니다. 에이전트 작업, 메일 처리, 푸시 전송, 웹훅 원장은 90일 뒤, 요청 한도 기록은 30일 뒤, 토큰 사용량 기록은 비용 변동 분석을 위해 180일 뒤 삭제됩니다. 이 기간은 소스 코드 안의 표이지, diff에 드러나지 않게 몰래 늘릴 수 있는 설정이 아닙니다.

취약점 신고

설명과 재현 절차를 적어 k0820086@gmail.com으로 메일을 보내 주세요. 악용 가능한 문제는 공개 이슈로 올리지 말아 주세요. 며칠 안에 접수 확인을 드리며, 승인 하한과 토큰 암호화 경로에 대한 수정이 무엇보다 우선합니다. 기계가 읽을 수 있는 연락처 정보는 /.well-known/security.txt에 있습니다.

주장하지 않는 것. 위의 CASA Tier 2 평가 외에, Klorn은 제3자 침투 테스트나 SOC 2 감사를 받은 적이 없으며, 이 페이지는 그런 것을 암시하지 않습니다. 혼자 유지보수하는 베타 제품입니다. 이를 보완하는 장치는 코드가 AGPL-3.0이고 보안 관련 경로를 위에 파일 단위로 밝혀 두었다는 점입니다 — 우리 말을 믿는 대신 직접 읽어 보실 수 있습니다.

SECURITY.md에 더 긴 버전이 있으며, 생략하지 않고 밝히기로 한 알려진 공백도 함께 적혀 있습니다.