k-익명성이란? 내 비밀번호가 안전하게 확인되는 원리
PW Checkup이 비밀번호를 서버로 보내지 않고도 유출 여부를 확인할 수 있는 k-익명성의 원리를 쉽게 설명해요.
비밀번호를 입력하는데, 왜 안전할까요?
“유출된 비밀번호인지 확인해준다”는 서비스에 정작 비밀번호를 입력하는 게 이상하게 느껴질 수 있어요. 서버로 비밀번호를 보내야만 확인할 수 있을 것 같으니까요. 하지만 PW Checkup은 k-익명성(k-anonymity) 이라는 방식을 사용해서, 여러분의 실제 비밀번호나 그 해시값 전체를 서버로 전혀 보내지 않고도 유출 여부를 확인해요.
1단계: 브라우저에서 해시로 변환해요
비밀번호를 입력하면, 그 즉시 여러분의 브라우저 안에서 SHA-1이라는 방식으로 해시값이 계산돼요. 해시는 원래 값을 알아낼 수 없는 방식으로 뒤섞은 고정 길이의 문자열이에요. 예를 들어 password123이라는 비밀번호는 브라우저 안에서 CBFDAC6008F9CAB4083784CBD1874F76618D2A97처럼 40자리 문자열로 변환돼요. 이 계산은 전적으로 브라우저 안에서, 순식간에 이루어져요.
2단계: 앞 5자리만 서버로 보내요
여기가 핵심이에요. 40자리 해시값 전체가 아니라, 앞 5자리만 서버로 전송돼요. 위 예시라면 CBFDA만 보내지는 거예요. 서버는 이 5자리만으로는 여러분이 어떤 비밀번호를 확인하는지 전혀 알 수 없어요 — 같은 5자리로 시작하는 해시값이 수백~수천 개나 존재하거든요.
3단계: 서버가 후보 목록을 통째로 돌려줘요
서버는 그 5자리로 시작하는 모든 해시값의 나머지 35자리 목록(보통 수백~수천 개)을 통째로 돌려줘요. 이 목록 안에 여러분이 확인하려는 정확한 해시값이 포함되어 있을 수도, 없을 수도 있어요. 서버 입장에서는 이 목록에 있는 수많은 후보 중 여러분이 실제로 어떤 것을 찾고 있는지 구별할 방법이 없어요.
4단계: 최종 비교는 다시 브라우저 안에서
서버가 돌려준 목록을 받은 뒤, 여러분의 브라우저가 그 목록 안에서 자신의 전체 해시값(나머지 35자리 포함)과 정확히 일치하는 항목이 있는지 직접 비교해요. 이 비교 과정 역시 전적으로 브라우저 안에서만 일어나고, 그 결과(“유출됨” 또는 “안전함”)도 여러분에게만 보여져요.
왜 “익명성”이라고 부를까요?
k-익명성은 “특정 데이터를 최소 k개의 비슷한 데이터 사이에 숨겨서, 그중 어떤 것이 진짜인지 구별할 수 없게 만드는” 개인정보 보호 기법이에요. 여기서는 여러분이 조회하려는 정확한 해시값이 같은 5자리 접두사를 가진 수백~수천 개의 다른 해시값들 사이에 숨겨지는 셈이에요. 이 방식은 Have I Been Pwned의 창시자인 트로이 헌트(Troy Hunt)가 처음 설계했고, 지금은 클라이언트 사이드 비밀번호 확인의 업계 표준으로 널리 쓰이고 있어요.
직접 확인해보고 싶다면
브라우저 개발자 도구의 ‘네트워크’ 탭을 열어두고 PW Checkup에서 비밀번호를 확인해보세요. api.pwnedpasswords.com으로 나가는 요청에 5자리 문자열만 포함되어 있고, 응답으로는 여러 줄의 해시 목록이 돌아오는 걸 직접 눈으로 확인하실 수 있어요.