설계 원칙
DT의 성패는 기능이 아니라 세 가지에 달려 있습니다. 중립성, 조작 방지, 민감정보 보호. 이 데모는 그 세 가지를 말이 아닌 구조로 보장하는 방법을 실제로 동작하는 화면으로 보여줍니다.
원칙 1
운영자 불개입
운영자는 의견을 만들거나 고르거나 지우지 않습니다. 집계와 검증만 합니다.
✓
삭제 기능이 없습니다관리자 페이지도, 삭제 API도 없습니다. 코드에 없는 기능은 남용될 수 없습니다.
✓
가림은 규칙이 합니다서로 다른 참여자 10명이 신고하면 자동으로 가려집니다. 기준은 공개돼 있고 사람의 판단이 끼지 않습니다. 원문과 표는 보존됩니다.
✓
노출 순서는 숫자만 따릅니다참여량·최신·찬반 비율 등 공개된 기준으로만 정렬됩니다. 추천·큐레이션이 없습니다.
✓
진영 색을 쓰지 않습니다찬성·반대는 특정 정당을 연상시키는 파랑·빨강이 아닌 색으로 표시합니다.
원칙 2
조작·중복 방지
"이 숫자는 진짜"를 운영자가 주장하는 대신, 누구나 스스로 확인할 수 있게 합니다.
✓
1인 1표는 DB 제약(의견, 가명) 쌍이 기본키입니다. 코드 실수로도 두 번 셀 수 없습니다.
✓
모든 표는 공개 원장에표와 표 변경은 순서대로 기록되고, 각 기록은 앞 기록의 해시를 품습니다. 하나를 바꾸면 뒤가 모두 어긋납니다.
✓
브라우저가 다시 셉니다검증 페이지는 원장을 내려받아 해시와 표 수를 직접 재계산합니다. 서버를 믿을 필요가 없습니다.
✓
참여자가 자기 표를 확인합니다투표 직후 가명과 원장 번호가 적힌 영수증을 받고, 검증 페이지에서 내 표가 기록된 대로 세어졌는지 직접 봅니다.
✓
인용에 해시를 붙입니다기사가 인용한 시점의 원장 해시를 함께 적으면, 뒤에 누구든 그때의 숫자를 재현할 수 있습니다.
원칙 3
민감정보 보호
정치적 견해는 개인정보보호법상 민감정보입니다. 모으지 않고, 이을 수 없게 만듭니다.
✓
최소 수집이메일, 연령대, 시·도만 받습니다. 이름·생년월일·전화번호·성별은 받지 않습니다.
✓
표와 사람을 다른 표에회원 표에는 어떤 의견에 참여했는지가 없고, 표 기록에는 회원번호가 없습니다. 둘을 잇는 열 자체가 없습니다.
✓
의견마다 다른 가명가명 = HMAC(서버 비밀키, 회원번호:의견번호). 같은 사람이 여러 의견에 참여해도 모아 볼 수 없고, 키 없이는 누구도 되돌릴 수 없습니다.
✓
구성 통계만 공개연령·지역은 집계 표에서 숫자로만 공개됩니다. 소수 표본은 화면에서 구간을 합쳐 재식별을 막습니다(실서비스 적용).
데이터가 어떻게 나뉘어 저장되는가
회원 정보와 정치적 견해 사이에 직접 연결이 없습니다
회원 (users)
- 이메일 · 비밀번호 해시
- 연령대 · 시·도
- 인증 수준 1 이메일 → 2 본인인증(2차)
여기에는 어떤 의견에 참여했는지가 없습니다
→
HMAC(비밀키,
회원:의견)
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 키 관리와 교체, 접근 로그, 개인정보 영향평가 지원 자료 |