6자리 리딤코드는 어디까지 안전하게 만들 수 있을까
고객에게 7Q2M9A 같은 6자리 코드를 보내고 한 번만 혜택을 받게 해야 한다고 해보자.
코드는 숫자와 영문 대문자로 만들고, 다른 고객에게 같은 코드가 나가면 안 된다. 사용자가 입력하면
서버는 실제 발급한 코드인지 확인하고 혜택을 지급한 뒤 다시 사용할 수 없게 해야 한다.
이처럼 문자열을 가진 사람이 혜택을 청구하는 방식을 bearer형 리딤코드라고 부른다. 여러 사람이 함께 입력하는 공개 프로모션 코드와는 요구사항이 다르다. 여기서는 개별 발급형을 다룬다.
핵심 질문은 ‘어떤 암호를 쓸까’보다 먼저 있다. 중복 없는 발급, 발급 순서 은닉, 유효한 사용 판정과 추측 방어를 각각 어디서 맡을 것인가?