설계 원칙

DT의 성패는 기능이 아니라 세 가지에 달려 있습니다. 중립성, 조작 방지, 민감정보 보호. 이 데모는 그 세 가지를 말이 아닌 구조로 보장하는 방법을 실제로 동작하는 화면으로 보여줍니다.

원칙 1

운영자 불개입

운영자는 의견을 만들거나 고르거나 지우지 않습니다. 집계와 검증만 합니다.

삭제 기능이 없습니다관리자 페이지도, 삭제 API도 없습니다. 코드에 없는 기능은 남용될 수 없습니다.
가림은 규칙이 합니다서로 다른 참여자 10명이 신고하면 자동으로 가려집니다. 기준은 공개돼 있고 사람의 판단이 끼지 않습니다. 원문과 표는 보존됩니다.
노출 순서는 숫자만 따릅니다참여량·최신·찬반 비율 등 공개된 기준으로만 정렬됩니다. 추천·큐레이션이 없습니다.
진영 색을 쓰지 않습니다찬성·반대는 특정 정당을 연상시키는 파랑·빨강이 아닌 색으로 표시합니다.
원칙 2

조작·중복 방지

"이 숫자는 진짜"를 운영자가 주장하는 대신, 누구나 스스로 확인할 수 있게 합니다.

1인 1표는 DB 제약(의견, 가명) 쌍이 기본키입니다. 코드 실수로도 두 번 셀 수 없습니다.
모든 표는 공개 원장에표와 표 변경은 순서대로 기록되고, 각 기록은 앞 기록의 해시를 품습니다. 하나를 바꾸면 뒤가 모두 어긋납니다.
브라우저가 다시 셉니다검증 페이지는 원장을 내려받아 해시와 표 수를 직접 재계산합니다. 서버를 믿을 필요가 없습니다.
참여자가 자기 표를 확인합니다투표 직후 가명과 원장 번호가 적힌 영수증을 받고, 검증 페이지에서 내 표가 기록된 대로 세어졌는지 직접 봅니다.
인용에 해시를 붙입니다기사가 인용한 시점의 원장 해시를 함께 적으면, 뒤에 누구든 그때의 숫자를 재현할 수 있습니다.
원칙 3

민감정보 보호

정치적 견해는 개인정보보호법상 민감정보입니다. 모으지 않고, 이을 수 없게 만듭니다.

최소 수집이메일, 연령대, 시·도만 받습니다. 이름·생년월일·전화번호·성별은 받지 않습니다.
표와 사람을 다른 표에회원 표에는 어떤 의견에 참여했는지가 없고, 표 기록에는 회원번호가 없습니다. 둘을 잇는 열 자체가 없습니다.
의견마다 다른 가명가명 = HMAC(서버 비밀키, 회원번호:의견번호). 같은 사람이 여러 의견에 참여해도 모아 볼 수 없고, 키 없이는 누구도 되돌릴 수 없습니다.
구성 통계만 공개연령·지역은 집계 표에서 숫자로만 공개됩니다. 소수 표본은 화면에서 구간을 합쳐 재식별을 막습니다(실서비스 적용).

데이터가 어떻게 나뉘어 저장되는가

회원 정보와 정치적 견해 사이에 직접 연결이 없습니다

회원 (users)

  • 이메일 · 비밀번호 해시
  • 연령대 · 시·도
  • 인증 수준 1 이메일 → 2 본인인증(2차)

여기에는 어떤 의견에 참여했는지가 없습니다


HMAC(비밀키,
회원:의견)

표 (votes) · 원장 (ledger)

  • 의견번호 · 가명 · 찬/반
  • 연령대 · 시·도 (통계용)
  • 시각 · 이전 해시 · 해시

여기에는 회원번호·이메일이 없습니다

비밀키는 DB와 다른 곳(배포 환경의 시크릿 저장소)에 있습니다. DB 전체가 유출돼도 누가 어떤 견해를 냈는지 복원할 수 없습니다. 실서비스에서는 키를 HSM/KMS에 두고 정기 교체 절차를 둡니다.

2차 본인인증을 얹을 수 있는 회원 구조

1차 이메일 회원이 그대로 인증 회원으로 올라갑니다

인증 수준확인 방법할 수 있는 것표에 남는 것
L1 이메일이메일 소유 확인 (1차)의견 작성 · 참여level=1
L2 본인인증PASS · 통신사 · 신용정보사 (2차, 인증기관 계약·법률 검토 후)같은 계정 그대로 · "인증 참여만 보기"에 포함level=2
L3 예비향후 필요 시 (예: 거주지 확인)지역 현안 참여 가중 등level=3
중복 계정 차단은 이렇게. 본인인증이 돌려주는 연계정보(CI)는 원문을 저장하지 않고 단방향 해시만 별도 표에 둡니다. 새 인증 시 해시가 이미 있으면 "이미 인증된 사람"으로 막습니다. 원문이 없으니 유출돼도 개인을 특정할 수 없습니다.
표는 그대로, 신뢰만 올라갑니다. 모든 표에 참여 당시 인증 수준이 기록돼 있어, 2차 오픈 뒤 스코어보드에 "전체 참여 / 인증 참여" 두 숫자를 함께 보여줄 수 있습니다. 1차 데이터를 버리지 않습니다.

토론(2차)으로 가는 길

방을 나누지 않고, 보는 방식만 나눕니다

기획 의도 문서의 방향 그대로, 토론은 연령·성향별로 방을 나누지 않습니다. 모든 시민이 한 공간에서 이야기하고, 각 글에 익명의 연령대 태그가 붙고, 필터로 특정 집단의 목소리만 뽑아 볼 수 있습니다. 이 데모의 의견 목록이 이미 그 구조입니다. 연령 태그와 필터가 있고 방은 하나입니다. 토론 글은 같은 가명·같은 원장 방식으로 붙이면 됩니다.

이 데모에 실제로 구현된 것

보여주기용 화면이 아니라 동작하는 코드입니다

영역데모에서 동작실서비스에서 더할 것
회원이메일 가입·로그인, 연령대·지역, 인증 수준 필드이메일 확인 메일 발송, 간편 로그인(카카오·네이버·구글), 비밀번호 재설정
의견작성·목록·상세, 카테고리·연령 필터, 검색, 정렬임시 저장, 이미지 첨부 여부 결정, 금칙어 자동 필터(규칙 공개)
투표1인 1표(DB 제약), 표 변경, 실시간 집계, 연령·지역 구성요청 빈도 제한, 비정상 패턴(짧은 시간 대량 가입) 자동 탐지와 공개 로그
스코어보드카테고리 순위와 순위 변동, 24시간·7일·전체, 상위 의견, 구성 공개, 인용 카드(SVG)와 인용 문구PNG 카드, 임베드 위젯, 기간 지정 URL
검증해시 체인 공개 원장, 브라우저 재계산, 참여 영수증(가명·원장 번호)으로 내 표 확인, CSV 내려받기일별 원장 해시의 외부 앵커링(공개 저장소·OpenTimestamps) — 운영자 자신의 사후 조작까지 검출
운영삭제 기능 없음, 신고 10건 자동 가림, 규칙 공개운영 행위 공개 로그(2차 관리자 페이지도 "읽기·검증"만)
보안비밀번호 PBKDF2, HttpOnly 세션, 가명 HMAC, 표·회원 분리KMS 키 관리와 교체, 접근 로그, 개인정보 영향평가 지원 자료