유틸리티 소개

분산 시스템에서 해시로 데이터 분배하는 방법 일관된 해싱의 원리

Redis 클러스터나 분산 캐시에서 데이터를 여러 서버에 고르게 분배하는 방법이 뭘까요? 일관된 해싱(Consistent Hashing)이 답입니다.

단순 해싱의 문제

hash(key) % 서버수 로 분배하면, 서버가 추가되거나 제거될 때 거의 모든 데이터의 위치가 바뀝니다. 캐시 히트율이 급락하는 문제가 생기죠.

일관된 해싱의 해결책

해시 공간을 원형(링)으로 만들고, 서버와 데이터 모두 해시값 위치에 배치합니다. 데이터는 시계 방향으로 가장 가까운 서버에 저장됩니다. 서버가 추가/제거되면 일부 데이터만 이동하면 되죠.

가상 노드

해시 생성기로 "server1-1", "server1-2" 처럼 여러 해시를 만들어 가상 노드로 사용하면 데이터 분포가 더 균일해집니다. 실무에서 많이 쓰는 기법입니다.

해시와 보안의 관계

해시는 보안에서 중요한 역할을 하지만, 만능이 아닙니다. 해시 생성기로 만든 해시값은 원본 데이터를 숨기는 데는 좋지만, 짧거나 예측 가능한 입력은 무차별 대입으로 찾아낼 수 있습니다. 예를 들어 4자리 PIN을 해시해도 10,000가지 경우의 수만 시도하면 원본을 찾을 수 있죠. 그래서 비밀번호 해싱에는 솔트(salt)를 추가하고, bcrypt처럼 의도적으로 느린 알고리즘을 씁니다.

레인보우 테이블 공격

미리 계산해둔 해시-원본 쌍을 이용한 공격입니다. 솔트를 사용하면 각 사용자마다 다른 해시가 생성되어 이 공격을 무력화할 수 있습니다. 요즘 프레임워크들은 솔트를 자동으로 처리해주지만, 직접 구현할 때는 반드시 솔트를 포함시켜야 합니다.

결론적으로, 해시 함수는 현대 컴퓨팅의 핵심 기술입니다. 보안, 데이터 관리, 성능 최적화 등 다양한 분야에서 활용되며, 올바르게 사용하면 시스템의 신뢰성을 크게 높일 수 있습니다.