우리 서버가 값을 볼 수 없는 이유
짧게: 값을 여는 열쇠가 우리 서버에 아예 없습니다.
값이 지나가는 길
여러분이 입력한 값은 브라우저 안에서 요청한 사람의 1회용 공개키로 봉인됩니다 (libsodium sealed box · X25519). 우리 서버로 나가는 것은 그 암호문뿐이고, 그것을 풀 개인키는 요청한 사람의 노트북 키체인에만 있습니다. 봉인한 브라우저조차 자기가 봉인한 것을 다시 열 수 없습니다.
서버는 받은 암호문을 저장하기 전에 AWS KMS 로 한 번 더 감쌉니다. 데이터베이스 덤프가 통째로 새도 그 안에는 암호문조차 보이지 않습니다.
요청한 사람이 값을 자기 금고에 넣고 나면 우리는 암호문을 지웁니다. 만료(최대 24시간)가 오면 마찬가지입니다. 그 순간 이후 그 값을 풀 조합은 세상에 남지 않습니다.
링크만으로는 열리지 않습니다
링크를 주운 사람이 값을 넣거나 볼 수 없도록, 메일로 오는 6자리 코드를 먼저 확인합니다. 코드를 확인하기 전에는 어떤 키를 요청했는지도 보여 드리지 않습니다 — 링크가 단톡방에 잘못 붙었을 때 키 이름 자체가 정보가 되기 때문입니다.
링크 끝의 #fp=… 조각은 브라우저가 서버로 보내지 않는 부분입니다.
이 값으로 「서버가 준 공개키가 정말 요청자의 것인지」를 여러분 브라우저가 대조합니다. 다르면 화면이 멈춥니다.
정직하게 — 우리가 막지 못하는 것
| 못 막는 것 | 왜 |
|---|---|
| 키 이름·프로젝트·주고받은 사람·시각 | 우리 서버가 봅니다. 감사·회수·알림에 필요해서 일부러 그렇게 두었습니다. 값은 보지 않습니다. |
| 우리가 이 페이지의 코드를 악의적으로 바꾸는 경우 | 웹 브라우저로 참여하는 1회성 상대는 이 코드를 신뢰할 수밖에 없습니다. 이것이 설치 없이 쓰는 방식의 근본 한계입니다. 반복해서 주고받는 상대에게는 설치형(okey)을 권합니다 — 설치형끼리는 이 신뢰가 필요 없습니다. |
| 값을 받은 사람이 다시 어딘가에 붙여넣는 것 | 기술로 막을 수 없습니다. 남는 것은 기록과 빠른 교체입니다. |
| 이 도메인을 흉내 낸 피싱 사이트 | O'Key 링크는 항상 이 도메인 하나뿐이고, 메일 본문에 값을 절대 넣지 않습니다. |
남기는 기록
언제 누가 열었고 넣었고 적용했는지는 남깁니다. 값·값의 일부·값의 길이는 남기지 않습니다. 충분히 무작위한 값에 한해 8바이트 지문만 남겨 「보낸 것과 적용된 것이 같은지」를 대조할 수 있게 합니다.