보안 및 검증
최종 업데이트: 2026년 8월 11일
Comoji는 손쉬운 사용과 입력 모니터링 권한을 요청해요. macOS에서 가장 민감한 두 권한이고, “믿어 주세요, 전부 로컬이에요”는 답이 될 수 없어요. 이 페이지는 저희 말을 그냥 믿지 않아도 되도록 존재해요. 아래에는 앱이 연결할 수 있는 모든 호스트, 각 연결이 일어나는 조건, 그리고 입력하는 동안 내 Mac에서 Comoji를 직접 지켜볼 수 있는 정확한 명령이 있어요.
요약하면: 키 입력은 절대 Mac 밖으로 나가지 않아요. 저희에게도, 다른 누구에게도요. Comoji에는 계정도, 원격 측정도, 분석도, 충돌 리포터도 없어요. 네트워크 요청은 아래에 나열된 네 가지뿐이고, GIF 선택기 자체의 검색창을 제외하면 그 어느 것도 입력한 내용을 담지 않아요.
단계별 안내가 더 좋다면 Comoji가 로컬인지 단계별로 확인하는 방법에서 스크린샷과 복사해 붙여 넣을 수 있는 명령으로 똑같이 확인할 수 있어요.
각 권한의 용도
macOS의 권한 요청 창은 앱이 어떤 권한을 원하는지만 알려 주고, 그 권한으로 무엇을 하는지는 절대 알려 주지 않아요. 그래서 정확히 밝혀 둘게요.
입력 모니터링
- 용도:
:liz같은 콜론으로 시작하는 토큰을 지켜보는 키보드 이벤트 탭. 문자는 작은 메모리 버퍼에 쌓이고, 토큰이 끝나는 순간(스페이스, Esc, 다른 곳 클릭, 결과 수락) 바로 버려져요. - 절대 쓰지 않는 용도: 입력한 내용을 기록, 저장, 전송하는 것. 버퍼는 디스크에 쓰이지도, 로그에 남지도, 어디로 전송되지도 않아요. 키 입력을 처리하는 코드에 네트워크 API나 원격 URL이 나타나면 앱의 테스트 스위트가 빌드를 실패시켜요.
- 아예 지켜보지 않는 곳: 보안(암호) 텍스트 필드, 그리고 암호 관리자, 터미널, 원격/가상 머신 클라이언트를 포함하는 기본 제외 목록, 환경설정 › 개인정보 보호에서 직접 추가한 앱이나 웹사이트.
손쉬운 사용
- 용도: 어떤 텍스트 필드에 키보드 포커스가 있고 화면에서 커서가 어디 있는지 macOS에 물어봐서 제안 팝업을 알맞은 자리에 띄우는 것, 그리고 고른 이모지를 그 필드에 다시 입력하는 것(가상 백스페이스와 잠깐의 클립보드 붙여넣기를 사용하고, 그 뒤에 이전 클립보드 내용을 복원해요).
- 절대 쓰지 않는 용도: 필드의 내용, 문서, 메시지, 다른 창을 읽는 것.
전체 네트워크 연결 범위
이게 전체 목록이에요. Comoji가 이 목록에 없는 호스트에 연결하는 걸 보게 된다면 그건 버그이고, support@comoji.io(으)로 꼭 알려 주세요.
storage.googleapis.com
- 무엇: 업데이트 피드(Sparkle appcast)와 새 버전의 DMG. 둘 다 Comoji의 Firebase Storage 버킷에 있어요.
- 언제: 백그라운드 업데이트 확인과 다운로드, 그리고 “업데이트 확인…” 메뉴 항목. 환경설정에서 “Comoji를 최신 상태로 유지”를 끄면 직접 요청할 때만 연결해요.
- 요청에 담기는 내용: 단순한 GET 요청. Sparkle의 사용자 에이전트에 앱 이름과 현재 버전이 담겨요.
fonts.gstatic.com
- 무엇: 앱에 포함되어 있지 않은 스티커의 이미지(Google의 Noto Animated Emoji).
- 언제: /sticker 선택기에서 앱에 포함되지 않은 스티커를 고를 때. 처음 사용한 뒤에는 Mac에 캐시되므로 스티커마다 한 번만 일어나요.
- 요청에 담기는 내용: 이모지 코드 포인트로 이름 붙은 이미지 파일 하나에 대한 단순한 GET 요청.
api.giphy.com
- 무엇: /gif 선택기의 GIF 검색 결과와 인기 결과.
- 언제: /gif를 열 때, 그리고 그 선택기에서 검색어를 입력할 때마다. 자동으로는 절대 일어나지 않아요. /gif를 열지 않으면 요청도 없어요.
- 요청에 담기는 내용: GIF 선택기의 검색창에 입력한 텍스트와 Comoji의 GIPHY API 키, 그리고 Comoji를 영어가 아닌 언어로 쓰고 있다면 결과를 그 언어에 맞추기 위한 언어 코드(예: ko)만 보내요. Mac의 다른 곳에서 입력한 내용은 전혀 보내지 않아요.
*.giphy.com
- 무엇: GIPHY CDN(media0–media4.giphy.com)에서 받아 오는 GIF 파일 자체.
- 언제: 이미 요청한 검색 결과에서 GIF를 표시하거나 넣을 때.
- 요청에 담기는 내용: 검색 결과가 지정한 정확한 GIF URL에 대한 단순한 GET 요청.
그 밖에는 없어요
분석 엔드포인트도, 원격 측정도, 오류 보고도, 라이선스 서버도, 계정 시스템도 없어요. Comoji를 설치하고 /gif나 /sticker를 한 번도 열지 않고 자동 업데이트 확인을 끄면, 앱은 실행되는 동안 네트워크 요청을 전혀 하지 않아요.
이 목록은 앱에 대한 설명에 그치지 않아요. 앱이 지키는 규칙이에요. 모든 URL이 소스 코드에 적혀 있는 건 아니에요. GIF 파일 자체의 주소는 GIPHY의 검색 응답이 정해 줘요. 그런 요청은 하나하나 요청을 보내기 전에 위 목록과 대조되고, 맞지 않으면 버려져요. 리디렉션도 같은 방식으로 확인하기 때문에, “대신 여기로 가세요”라고 답하는 서버도 저희를 다른 곳으로 보낼 수 없어요. 변조되거나 탈취된 검색 응답이라도 Comoji가 이 페이지에 나오지 않는 호스트에 연결하게 만들 수는 없어요.
다음 호스트 이름도 앱 안에 있지만 Comoji가 직접 가져오지는 않아요. URL을 macOS에 넘기면 사용 중인 브라우저가 페이지를 열어요: www.comoji.io, www.mattsenter.com, www.senter.net, www.stockcar.app, www.premail.pro, www.burly.click, www.beeready.buzz, www.highwire.news, www.orga.bot, www.weatherling.app, www.seedmatrix.com.
직접 확인하는 방법
아래 명령은 모두 읽기 전용이라 안전하게 실행할 수 있어요. Comoji를 실행해 둔 상태에서 터미널에 붙여 넣으세요. (개발 빌드를 설치했다면 프로세스 이름은 Comoji가 아니라 ComojiDev예요.)
1. 입력하는 동안 연결 지켜보기
먼저 Comoji가 실제로 실행 중인지 확인하고 프로세스 ID를 얻으세요:
pgrep -x Comoji숫자 하나가 나와야 해요. 아무것도 나오지 않는다면 Comoji가 실행 중이 아닌 거예요(메뉴 막대 앱이니 Dock이 아니라 메뉴 막대를 확인하세요). 이 상태에서는 아래 명령이 실제 연결 여부와 상관없이 연결이 없다고 보고해요. 먼저 PID를 얻으세요. 그렇지 않으면 나머지는 아무것도 증명하지 못해요.
lsof는 프로세스가 열어 둔 네트워크 소켓을 보여 줘요. 메시지를 열고 :fire를 입력해 Tab을 몇 번 누른 다음 실행하세요:
lsof -nP -i -a -p "$(pgrep -x Comoji)"아무것도 출력되지 않아야 해요. 출력이 없다는 건 프로세스에 열린 네트워크 연결이 없다는 뜻이고, 바로 그 주장을 직접 테스트한 거예요.
사용하는 동안 계속 지켜보려면, 남는 터미널 창에서 이 명령을 실행하고 다른 앱에서 한동안 입력해 보세요:
while :; do
printf '%s ' "$(date +%T)"
lsof -nP -i -a -p "$(pgrep -x Comoji)" | tail -n +2 | awk '{print $9}' | paste -sd' ' -
echo
sleep 2
done아무리 많이 입력해도 줄은 비어 있어요. 그런 다음 /gif를 열고 무언가를 검색하면 api.giphy.com과 giphy.com CDN 호스트가 나타나요. 오직 그때만요.
2. 주고받은 총 바이트
nettop은 프로세스별 누적 트래픽을 보여 주기 때문에, lsof가 샘플링하는 사이에 놓칠 수 있는 짧은 연결도 잡아내요:
nettop -P -p "$(pgrep -x Comoji)"GIF와 스티커 선택기는 건드리지 않고 몇 분 동안 입력해 보세요. bytes_in과 bytes_out 열은 계속 0이에요. 종료하려면 q를 누르세요.
3. 배포된 바이너리에서 호스트 이름 읽어 내기
실행 중인 프로세스는 자신이 아는 곳에만 연결할 수 있어요. 내려받은 앱에서 URL을 바로 뽑아낼 수 있어요:
strings -a /Applications/Comoji.app/Contents/MacOS/Comoji \
| grep -Eo 'https?://[A-Za-z0-9._-]+' | sort -u
/usr/libexec/PlistBuddy -c 'Print :SUFeedURL' \
/Applications/Comoji.app/Contents/Info.plist실제로 보게 될 결과와 맞도록 솔직하게 두 가지를 덧붙일게요. 첫째, api.giphy.com은 전체 URL로 저장되지 않고 호스트 이름으로 조립되기 때문에 첫 번째 목록에는 나타나지 않아요. strings -a … | grep -Eo '[a-z0-9.-]*giphy\.com'로 직접 검색하세요. 이 패턴은 호스트 이름만 찾기 때문에 번들에 함께 들어 있는 API 키는 출력하지 않아요. 둘째, 번들에 포함된 Sparkle 업데이트 프레임워크는 Contents/Frameworks/Sparkle.framework 안에 자체 문서 URL(sparkle-project.org, andymatuschak.org)을 담고 있어요. 이건 서드파티 라이브러리 안의 문자열일 뿐, Comoji가 연결하는 호스트가 아니에요.
4. 방화벽으로 차단하고 무엇이 멈추는지 보기
가장 확실한 확인 방법은 아웃바운드 방화벽이에요. LuLu는 무료 오픈 소스이고, Little Snitch는 상용 표준이에요. 둘 중 하나를 모든 아웃바운드 연결에 알림을 띄우도록 설정하고 Comoji의 모든 연결을 차단해 보세요. 이모지 자동 완성은 처음부터 네트워크가 필요 없었기 때문에 언제까지나 그대로 작동해요. 멈추는 건 업데이트 확인과 원격 스티커나 GIF 이미지뿐이에요.
5. 앱이 정말 저희 것이고 변조되지 않았는지 확인하기
Comoji는 Apple Developer ID로 서명되고 Apple의 공증을 받았어요. 다음 명령으로 디스크에 있는 사본이 변조되지 않았는지 확인할 수 있어요:
codesign -dv --verbose=4 /Applications/Comoji.app
spctl -a -vvv -t exec /Applications/Comoji.app
codesign -d --entitlements - /Applications/Comoji.app하기로 한 것과 하지 않기로 한 것
당연히 나올 질문은 왜 전체를 오픈 소스로 공개하지 않느냐는 거예요. 추측하지 않고 직접 판단할 수 있도록 지금 저희의 입장을 밝혀 둘게요. 자세한 이유는 저장소에 아키텍처 결정 기록(docs/adr/0001-verifiable-local-processing.md)으로 남겨 두었어요.
- 완료: 정확한 네트워크 연결 범위 공개. 위의 목록은 앱의 환경설정 › 개인정보 보호에서도 보여 주고, 앱이 컴파일될 때 쓰는 것과 같은 선언에서 생성되며, 실행 중에도 그 선언에 맞춰 강제돼요. 그래서 다른 누군가의 서버가 앱에 넘겨준 URL이라도 공개되지 않은 호스트에는 닿을 수 없어요.
- 완료: 직접 확인하는 방법 안내. 이 페이지와 링크된 단계별 안내예요.
- 완료: CI에서 주장을 강제. 모든 풀 리퀘스트와 모든 릴리스는 macOS 러너에서 앱의 테스트 스위트를 실행해요(
.github/workflows/app-ci.yml, 그리고 무엇이든 서명하기 전에release.yml안에서 다시 한 번). 이 테스트 스위트는 실제 소스를 검사해서, 이 페이지에 공개되지 않은 호스트가 나타나거나 키 입력을 처리하는 코드에 네트워크 API나 원격 URL이 나타나면 실패해요. 두 규칙 중 하나라도 어긴 빌드는 병합될 수도, 릴리스될 수도 없어요. - 당분간 보류: 입력 경로만 오픈 소스로 공개. 이벤트 탭, 토큰 버퍼, 매처만 공개해도 실질적인 신뢰의 신호가 되고, 상업적 가치도 없는 부분이에요. 아직 하지 않는 이유는 좋은 이유라기보다 솔직한 이유예요. 공개한 일부가 공증된 바이너리 속 코드와 같다는 걸 증명할 수 없다면 보이는 것보다 증명하는 게 적고, 제대로 하려면 재현 가능한 빌드(아래)가 필요해요. 그래서 실제로 내려받은 바이너리에서 직접 할 수 있는 검증을 먼저 제공하기로 했어요. 언제든 다시 검토할 수 있고, 공개한다면 입력 경로가 가장 먼저예요.
- 당분간 보류: 재현 가능한 빌드와 유료 보안 감사. 둘 다 가장 신뢰도가 높은 방법이지만, 지금 이 프로젝트가 버는 것보다 비용이 더 들어요. 무시한 게 아니라 미룬 거예요. 수익이 받쳐 주면 요약을 공개하는 유료 제3자 감사가 다음 단계이고, 그 결과는 여기에 공개할 거예요.
직접 확인하다가 이 페이지의 내용과 어긋나는 점을 발견하면 support@comoji.io(으)로 메일을 보내 주세요. 페이지와 앱 중 틀린 쪽을 고칠게요.
Comoji가 Mac에 로컬로 저장하는 내용은 개인정보 처리방침도 참고하세요.