-
Base62 인코딩을 활용해 초대링크 만들기프로젝트/WebRTC 화상통화 프로젝트 2022. 7. 31. 10:37
사용자가 그룹에 가입하게 위해 그룹장과 사용자에게 편의성을 주기 위해 초대링크를 제공하고자 했습니다.
요구사항은 다음과 같았습니다.
1. 초대링크는 Unique 해야 한다
2. 너무 길지도 너무 짧지도 않아야 한다
3. 어떤 그룹의 초대링크인지 예측할 수 없어야 한다.
예를 들어 그룹id 1의 초대링크가 1이라면 그룹1에 대한 초대링크인지 알게 되고 이를 악용할 수 있는 여지가 발생하게 됩니다.
따라서 흔히 알려진 URL Shortener기법을 사용하여 이 문제를 해결하고자 했습니다.
URL Shortener는 긴 URL을 짧게 축약하여 5~9개 정도로 단축하는 것을 말합니다.
해결하기 위한 방법들
MD5, Sha-1등의 해시 알고리즘들은 길이가 너무 깁니다.
- MD5: 9e107d9d372bb6826bd81d3542a419d6
NanoId, UUID 등도 길이가 너무 길어서 Shorten URL에 어울리지 않습니다.
import { nanoid } from 'nanoid' model.id = nanoid() //=> "V1StGXR8_Z5jdHi6B-myT" import { v4 as uuidv4 } from 'uuid'; uuidv4(); // ⇨ '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'
DB Sequence를 사용하자
7자리를 넘어가는 수가 존재 할 수 있습니다. 1,000,000(7자리)
10,000,00은 10진수로 표현되어 있으니 16진수로 표현하게 되면 총 268,435,455개를 만들 수 있습니다. (268배 증가)
이를 64진수로 표현하면 더욱 많이 표현할 수 있습니다.
64진수란?
알파벳과 숫자 총 62개와 두가지 특수문자 +,/를 담아서 64진수로 사용합니다
64진수에서 +,/를 제외하여 62진법 사용하여 구현하고자 합니다.
이렇게 되면 7자리의 문자를 사용하더라도 총 3조5천개 정도의 URL을 매핑할 수 있습니다.
구현
static final char[] BASE62 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".toCharArray(); public String makeInviteLink() { final StringBuilder sb = new StringBuilder(); int value = this.id.intValue() + 100_000; do{ int i = value % 62; sb.append(BASE62[i]); value /= 62; } while( value > 0); return sb.toString(); }
100_000이라는 숫자를 더해준 이유는 초기에는 A, B 등 하나의 문자로만 나오게 됩니다
따라서 적절한 숫자를 더해줘야 나머지연산이 일어나면서 조금 복잡하고 길어지는 문자열을 초대링크로 활용할 수 있게 됩니다.
출처
'프로젝트 > WebRTC 화상통화 프로젝트' 카테고리의 다른 글
Spring JPA에 Index 적용하기 (0) 2022.08.02 Redis Sorted Set을 이용한 실시간 랭킹 시스템 구축(1) (0) 2022.08.01 JPA Entity 연관관계 구현하기(양방향 연관관계 List Empty 문제 해결) (0) 2022.07.29 Controller 단위테스트 하기 (0) 2022.07.26 스프링 부트 + Mysql 도커로 띄우기 (0) 2022.07.21