Emoji Reactions
게시물에 이모지 반응 버튼을 추가합니다. 독자당 반응 하나, 선택적 카운트, 쿠키 없음, 원본 IP 저장 없음.
플러그인
Emoji Reactions
게시물에 이모지 반응 버튼을 추가합니다. 독자당 반응 하나, 선택적 카운트, 쿠키 없음, 원본 IP 저장 없음.
설명
Reactions는 게시물에 이모지 반응 버튼(기본값은 💗 🤔 😗)을 추가합니다. 각 독자는 게시물마다 반응 하나를 고를 수 있습니다. 다시 클릭하면 취소되고, 다른 것을 클릭하면 바뀝니다.
기능
- 최대 6개의 버튼을 관리자 페이지에서 설정합니다(
key=emoji:label). - 각 이모지 옆에 선택적으로 라벨을 표시할 수 있고, 카운트를 공개로 표시할 수도 있습니다.
- 반응을 가장 많이 받은 게시물 10개를 나열하는 관리자 페이지.
- 관리자 페이지는 관리자 로캘(영어 또는 일본어)을 따릅니다.
- 추가 데이터베이스가 필요 없습니다: 데이터는 플러그인 자체의 EmDash 스토리지에 저장됩니다.
- 권한도 네트워크 접근도 요청하지 않습니다.
개인정보
- 독자는 IP 주소와 User-Agent의 SHA-256 해시(사이트별 무작위 솔트 포함)로 식별됩니다. IP와 User-Agent 자체는 절대 저장되지 않습니다.
- 투표마다 저장되는 것은 게시물 ID, 해시, 선택한 반응, 타임스탬프입니다. 쿠키는 사용하지 않습니다.
참고: 플러그인 자체는 아무것도 렌더링하지 않습니다. 설치한 후
Reactions.astro컴포넌트를 게시물 템플릿에 추가하세요(설치 참조).
요구 사항
- Cloudflare(D1)의 EmDash 1.x
- Workers Paid 요금제(샌드박스 플러그인은 Worker Loader 바인딩에서 실행됩니다)
설치
1. 플러그인 설치
이 페이지의 Open in EmDash로 Reactions를 설치하거나 소스에서 빌드하세요.
pnpm install
pnpm run build # dist/
소스에서 빌드할 때는 패키지를 사이트에 추가하고(pnpm add file:../emdash-plugin-emoji-reactions), astro.config.mjs의 sandboxed: [reactions]에 등록합니다.
2. 플러그인 샌드박스 활성화
샌드박스 플러그인에는 Worker Loader 바인딩이 필요합니다. wrangler.jsonc에서(템플릿에서는 주석 처리되어 있습니다):
"worker_loaders": []
src/worker.ts가 PluginBridge를 내보내는지(*-cloudflare 템플릿은 이미 내보냅니다), 그리고 astro.config.mjs에 sandboxRunner: sandbox()가 설정되어 있는지 확인하세요.
3. 게시물 템플릿에 버튼 추가(필수)
site-snippets/Reactions.astro를 src/components/에 복사하고 게시물 페이지에 배치하세요.
---
import Reactions from "../../components/Reactions.astro";
// `post` comes from getEmDashEntry()
---
post.data.id(데이터베이스 ID)를 사용하고, post.id(슬러그)는 사용하지 마세요. 게시물 이름을 바꾸면 슬러그가 바뀌며, 번역된 슬러그에는 /가 들어 있어 플러그인이 거부합니다.
속성: contentId(필수), heading(빈 문자열이면 숨김), label(버튼 그룹의 접근성 이름). CSS에서 --rx-accent를 설정해 강조 색상에 맞추세요.
4. 버튼 선택
관리자 사이드바에서 Reactions를 열고 필드를 편집하세요. 예:
love=💗:Love, hmm=🤔:Hmm, whistle=😗:Whoa
최대 6개 항목입니다. 키는 소문자로 시작합니다. 카운트는 키별로 저장됩니다. 키 이름을 바꾸면 새 버튼이 시작되고, 키를 제거하면 숨겨지지만 카운트는 유지됩니다.
자주 묻는 질문
사이트에 버튼이 나타나지 않아요
Reactions.astro가 게시물 템플릿에 추가되었는지 확인하세요. 플러그인 자체는 아무것도 렌더링하지 않습니다.- 브라우저 콘솔을 여세요. 실패는
[reactions] state: HTTP 403 CSRF_REJECTED ...처럼 기록됩니다. - 패키지를 설치하는 대신
dist/를 사이트에 복사했다면dist/index.mjs에"routes"가 들어 있는지 확인하세요. 없으면 EmDash가 공개 라우트를 비공개로 취급하고 요청을 거부합니다.
카운트를 숨길 수 있나요?
네. 관리자 페이지에서 Show counts를 끄세요. 그러면 카운트가 공개 API에서도 제외되므로 페이지에서 읽을 수 없습니다. 카운트는 계속 집계되고 관리자 페이지에서는 계속 볼 수 있습니다.
집이나 사무실의 두 사람이 한 명의 독자로 집계됩니다
같은 IP 뒤에서 같은 브라우저를 쓰는 독자는 한 명으로 취급됩니다. 이것은 가벼운 반응 버튼이지 투표 시스템이 아닙니다.
사람들이 버튼을 도배할 수 있나요?
각 독자는 게시물마다 반응이 하나이므로, 반복 클릭은 전환만 합니다. 다만 라우트는 공개되어 있습니다. 필요하다면 /_emdash/api/plugins/reactions/react에 Cloudflare 속도 제한 규칙을 추가하세요.
로컬 개발에서도 작동하나요?
네. 사용 가능한 클라이언트 IP가 없으면 브라우저가 대신 localStorage(rx-visitor)에 보관된 무작위 ID를 보냅니다.
보안
취약점 신고
보안 문제는 공개 이슈가 아니라 GitHub 비공개 취약점 신고로 비공개로 신고해 주세요.
플러그인이 접근할 수 있는 것
- 권한도 네트워크 접근도 요청하지 않습니다. 플러그인은 자체 스토리지 밖의 콘텐츠, 미디어, 사용자, 설정을 읽거나 변경할 수 없고, 다른 서비스를 호출할 수도 없습니다.
- 데이터는 자체 EmDash 스토리지에만 저장합니다. 게시물별 카운트, 투표당 레코드 하나, 그리고 버튼 설정입니다.
독자에 대해 저장되는 데이터
- 독자의 IP 주소와 User-Agent를 사이트별 무작위 솔트와 결합한, 잘라낸 SHA-256 해시. IP 주소와 User-Agent 자체는 저장되지 않습니다.
- 투표마다 게시물 ID, 그 해시, 선택한 반응, 타임스탬프. 쿠키는 없습니다.
공개 라우트
state(GET)와 react(POST)는 공개입니다. 둘 다 입력을 검증합니다. contentId는 [A-Za-z0-9_\-:.]와 일치해야 하고, 반응은 설정된 키여야 하며, 요청 본문은 1 KB로 제한됩니다. 관리자 라우트는 비공개입니다. 남용을 제한하려면 /_emdash/api/plugins/reactions/react에 Cloudflare 속도 제한 규칙을 추가하세요.
변경 내역
0.2.1 — 2026-10-18
- 레지스트리 아이콘을 추가했습니다.
0.2.0 — 2026-10-15
EmDash 플러그인 레지스트리의 첫 릴리스.
- 관리자 페이지에 Show labels와 Show counts 스위치를 추가했습니다. 라벨은 기본적으로 숨겨지며 툴팁과 스크린 리더 텍스트로 유지됩니다. 카운트를 숨기면 공개 API에서도 제외됩니다.
- EmDash 1.x가 필요합니다. 버튼 설정이
ctx.settings로 옮겨졌으며, 0.1.x에서 저장한 버튼은 그대로 이어집니다. - 관리자 페이지는 관리자 로캘(영어 또는 일본어)을 따릅니다. 기본 라벨은 이제 영어(
Love/Hmm/Whoa)입니다. 키는 바뀌지 않았으므로 기존 카운트는 그대로 연결됩니다. Reactions.astro: 실패를 조용히 숨기지 않고 브라우저 콘솔에 기록하며,label속성과--rx-accentCSS 변수를 추가하고,post.data.id를 전달하는 방법을 문서화했습니다.pnpm run test가 이제 빌드로 끝나므로dist/에 항상 공개 라우트 선언이 포함됩니다.
0.1.0
- 초기 버전(레지스트리에는 게시되지 않음).