- 오래 준비된 HIBP 리브랜딩이 실제 서비스로 전환되며, 웹사이트 전면 재구축과 거의 모든 페이지의 기능 개편이 함께 공개됨
- 메인 검색은 결과 경험을 개선했지만 웹사이트에서는 username·phone number 검색을 제거하고, 기존 API 호환성은 유지함
- 새 침해별 페이지는 검색 결과를 덜 복잡하게 만들고, 사고 이후 사용자가 취할 수 있는 구체적 대응 안내를 별도 화면으로 분리함
- 이메일 접근 검증이 필요한 기능은 Sign In 기반 대시보드로 묶였고, domain search는 JSON API와 클라이언트 측 필터링으로 더 빠르게 동작함
- 기술 스택은 Azure, Cloudflare,.NET 9.0, Bootstrap, TypeScript 중심으로 정리됐으며, Google reCAPTCHA를 제거하고 Cloudflare Turnstile만 사용함
새 웹사이트와 검색 경험
- 새 Have I Been Pwned 웹사이트가 공개됨
- 공개 저장소의 리브랜딩 작업 첫 커밋은 2024년 2월에 이뤄짐
- 새 브랜드는 2025년 3월에 소프트 런칭됨
- 이번 릴리스에는 웹사이트 전면 재구축, 거의 모든 페이지 기능 변경, 새 기능 추가, 굿즈 스토어 공개가 포함됨
- 메인 검색 박스는 HIBP의 대표 기능을 유지하되 결과 표시 방식을 바꿈
- 일부 사용자는 축하 반응과 confetti 애니메이션을 보게 됨
- 침해가 확인된 경우에는 더 차분한 빨간 응답을 보여줌
- 결과는 역시간순으로 스크롤 가능한 timeline 형태이며, 각 침해의 개요를 함께 제공함
- 웹사이트 검색에서는 username과 phone number 지원이 제거됨
- username 검색은 2014년 Snapchat incident를 위해 도입됨
- phone number 검색은 2021년 Facebook incident를 위해 도입됨
- 두 데이터 유형은 그 두 사례 외에는 로드된 적이 없음
- username은 소유자를 특정하기 어렵고, phone number는 국제 형식과 표기 차이 때문에 파싱이 까다로움
- SMS 알림은 이메일보다 비용이 매우 높음
- 기존 사이트에서 이 입력을 허용하면서 “왜 내 번호가 특정 침해에 없느냐”는 혼란과 지원 부담이 생김
- API에서는 호환성 유지를 위해 계속 지원하지만, 추가 데이터가 들어갈 것으로 기대하지 말라고 밝힘
침해별 전용 페이지
- 새 breach page는 메인 검색 결과가 너무 복잡해지는 문제를 줄이기 위해 침해별 상세 정보를 별도 화면으로 분리함
- 예시는 Ashley Madison breach page
- 기존 정보를 더 사용자 친화적인 방식으로 보여줌
- 페이지의 핵심 변화는 침해 이후 사용자가 취할 행동을 더 구체적으로 안내하는 데 있음
- 침해를 당한 사용자가 무엇을 해야 하는지에 초점을 둠
- identity protection provider 같은 파트너 서비스와 연결하는 방향도 포함함
- 향후 침해와 사용자별 데이터를 더 보강할 계획임
- 해당 서비스가 2FA를 지원하면 일반 안내 대신 이를 구체적으로 표시함
- passkey도 별도 섹션으로 추가할 예정임
- 영국 NCSC와의 논의에서는 영국 사용자에게 NCSC 로고와 관련 안내 리소스를 보여주는 지역화된 데이터 유출 가이드를 다룸
통합 대시보드와 도메인 검색
- 이메일 주소 접근 확인이 필요한 기능이 여러 해 동안 늘어나면서, 이를 하나의 central dashboard로 통합함
- 2015년 Ashley Madison 사건 때 sensitive breach 개념이 도입되며 이메일 수신을 통한 확인이 필요해짐
- 2019년 API 남용을 줄이기 위해 API에 인증 계층을 추가했고, API key 구매 전 이메일 검증을 요구함
- 이후 domain search dashboard, 유료 구독 관리, stealer logs 조회가 추가됨
- 새 대시보드는 하나의 Sign In 뒤에서 이메일 주소 접근을 검증한 뒤 관련 기능을 보여줌
- 대중용 기능과 비즈니스 지향 기능이 함께 들어감
- 향후 이메일 전송 없이 로그인할 수 있도록 passkey 지원을 추가할 계획임
- 가족의 이메일 주소를 알림 구독에 등록하되 알림은 다른 주소로 받는 기능도 대시보드에 어울리는 예시로 다뤄짐
- domain search에는 화면 정리와 필터링 개선이 많이 들어감
- 검증된 도메인 목록이 더 깔끔해짐
- 검색 결과는 더 명확한 요약을 제공함
- 이메일 주소별 필터링과 “latest breach만 보기” 필터가 추가됨
- 도메인 검색 대시보드는 API에서 JSON을 받고 전체 대시보드가 단일 페이지 앱처럼 동작함
- 필터링은 전체 domain search JSON을 대상으로 클라이언트 측에서 수행됨
- 25만 개가 넘는 침해 이메일 주소가 있는 도메인에서도 동작 가능함을 테스트함
- 다만 그런 규모의 데이터는 브라우저에서 스크롤하기보다 API로 받는 편이 더 적절함
- 도메인 소유권 검증도 완전히 다시 작성됨
- 더 깔끔하고 단순한 인터페이스로 바뀜
- 이메일 외 검증 방식은 아직 더 매끄럽게 만들 작업이 남아 있음
API 문서와 굿즈 스토어
- API 자체에는 변경이 없음
- 이번 업데이트는 호환성을 깨는 변경을 만들지 않음
- 기존 API 사용자는 깨지는 부분이 없음
- API 문서는 새 방식으로 전환하지 못하고 기존 문서를 유지함
- UX rebuild GitHub repo에서 API 문서화 방식에 대한 논의가 있었고, 일반적 합의는 OpenAPI였음
- Scalar를 이용한 작업이 진행됐고 haveibeenpwned.com/scalar에서 볼 수 있음
- Scalar는 여러 언어의 샘플과 브라우저 내 테스트 러너를 제공함
- 큰 런칭 일정 안에서 완성하지 못해 기존 API 문서를 새 사이트 스타일로 맞춰 유지함
- 향후 여유가 생기면 Scalar 구현으로 전환할 계획임
- HIBP 굿즈 스토어가 merch.haveibeenpwned.com에 공개됨
- Teespring을 통해 운영됨
- 모든 상품은 원가로 판매되며 수익을 내지 않음
- 커뮤니티를 위한 재미있는 시도로 마련됨
- 스티커는 Teespring 옵션이 기존 Sticker Mule 품질에 못 미쳐 기존 Sticker Mule store를 계속 사용함
- open source artwork도 제공되어 원하는 곳에서 직접 인쇄할 수 있음
기술 스택과 성능
- 원본 서비스는 계속 Microsoft Azure에서 운영됨
- 웹사이트는 App Service를 사용함
- 대부분의 API는 serverless Functions를 사용함
- SQL Azure Hyperscale, queues, blobs, tables 같은 storage account 기능을 사용함
- 코드는 대부분 C#이며, .NET 9.0과 ASP.NET MVC on .NET Core를 사용함
- Cloudflare도 계속 큰 역할을 맡음
- Workers에 많은 코드가 있음
- R2 storage에 데이터가 있음
- WAF와 caching 기능을 사용함
- anti-automation은 Cloudflare Turnstile만 사용하고 Google reCAPTCHA는 완전히 제거함
- 프런트엔드는 최신 Bootstrap 세대, SASS, TypeScript를 사용함
- CSS는 SASS로 작성됨
- JavaScript는 TypeScript로 작성됨
- 웹사이트 성능도 측정 가능한 개선이 있음
- Pingdom 테스트 기준으로 페이지 크기를 28% 줄임
- 요청 수를 31% 줄임
- 로드 시간은 변동성이 커 큰 차이를 단정하지 않음
- 11년 뒤에도 웹페이지 크기와 요청 수에서 두 자릿수 비율을 줄였다는 점을 강조함
- 추적이나 광고성 부하로 볼 수 있는 요소는 넣지 않음
- 실제 트래픽 통계는 Cloudflare edge node를 지나는 트래픽 기반임
- 1Password product placement는 텍스트와 이미지뿐임
- outbound click도 추적하지 않음
- 침습적 추적 수치를 기대하는 identity theft 회사와의 product placement 논의는 더 어려워짐
개발 과정에서의 AI 활용
- ChatGPT는 재구축 과정, 특히 마지막 며칠 동안 광범위하게 사용됨
- Bootstrap icons에서 “Index” heading에 맞는 아이콘을 찾는 데 활용됨
- 2,000개가 넘는 아이콘 중 적절한 것을 약 30초 안에 찾는 식으로 쓰임
- 사이트 이전 확인에도 AI가 쓰임
haveibeenpwned.com을 크롤링해 고유 URL을 출력하는 PowerShell script를 작성하게 함- 발견한 path가
stage.haveibeenpwned.com에 존재하는지 확인하는 script도 작성하게 함 - 누락된
security.txt파일을 찾는 데 도움이 됨 - 존재한 적 없는 항목도 찾아내 “trust, but verify”가 필요했음
- CSS 조언, Cloudflare rule 설정, .NET Core 웹앱 특이점 같은 작은 작업에도 활용됨
- 답이 맞았던 비율을 약 90% 로 평가함
- 소프트웨어 개발에서 AI를 적극적으로 쓰지 않는다면 잘못하고 있다고 말할 정도로 강하게 긍정함
런칭과 Turnstile 이슈
- 새 사이트는 작성자 기준 일요일 이른 아침에 배포됨
- 거의 모든 것이 잘 진행됐고, 작은 glitch 한두 개는 빠르게 수정해 배포함
- 글은 라이브 2일 뒤에 공개해 먼저 문제를 최대한 정리함
- 그 사이 12개가 넘는 새 릴리스를 배포하며 빠르게 반복 개선함
- 약관과 개인정보 처리방침 같은 작은 변경에도 많은 시간이 들어감
- 데이터 처리 방식의 작은 업데이트와 stealer logs 같은 새 서비스 반영이 필요했음
- 변호사와의 작업에 여러 시간과 수천 달러가 들어감
- Cloudflare Turnstile은 Google reCAPTCHA처럼 트래픽을 Google로 넘기지 않는 anti-automation 방식임
- 완전히 보이지 않게 구현할 수 있음
- 브라우저에서 Cloudflare script가 challenge를 만들고, HTTP 요청과 함께 제출된 뒤 서버 측에서 검증됨
- HIBP에는 2023년부터 어떤 형태로든 적용돼 있었음
- 이메일을 보내는 폼처럼 봇 차단이 중요한 곳에서는 Turnstile 실패 시 사용자에게 다시 시도하거나 페이지를 새로고침하라는 안내를 표시함
- 두 번째 클릭이나 페이지 reload로 해결되는 경우가 자주 있었음
- 해결되지 않으면 사용자가 상호작용해야 하는 더 눈에 띄는 Turnstile widget 구현을 검토해야 함
- 메인 검색 페이지에서도 Turnstile이 중요하게 사용됨
- 비동기로 API endpoint에 요청하며 challenge token을 함께 보냄
- challenge 실패로 HIBP endpoint가 HTTP 401과
Invalid Turnstile token을 반환하면 full page post로 fallback해야 했음 - 새 사이트 최초 런칭 때는 이 fallback이 동작하지 않았지만 이후 수정됨
- full page post에서는 Cloudflare managed challenge가 표시되며, 더 침습적이지만 더 신뢰성 있음
- Cloudflare 통계 기준 발급된 challenge의 약 82% 가 성공적으로 해결됨
- 해결되지 않는 18% 중 상당수는 Turnstile이 의도대로 차단한 봇일 수 있음
- 실제 사람이 막힌 요청은 한 자릿수 비율일 가능성이 있으며, 이 수치를 낮추는 방법을 계속 봐야 함