티스토리 뷰
목표
- UUID v1부터 v4까지 다양한 방식의 UUID를 생성할 수 있다.
- 생성한 UUID를 URL에 포함 가능한 22개 문자열로 변환할 수 있다.
- API 업계에서 흔히 쓰이는 UUID 표현 방식은 UUID를
url62
방식으로 변환하는 것이다. url62란 UUID 바이트 배열을 Base 62([a-zA-Z0-9]
62개 문자만을 사용) 문자열 변환하는 것이다.
라이브러리 종속성 추가
dependencies {
compile group: 'com.fasterxml.uuid', name: 'java-uuid-generator', version: '3.1.4'
compile group: 'commons-codec', name: 'commons-codec', version: '1.10'
}
java-uuid-generator
(Apache 2.0)는 RFC 4122에 명시된 모든 방식의 UUID 생성 기능을 제공한다.commons-codec
(Apache 2.0)은 바이트 배열을 URL에 포함 가능한 22개 크기의 문자열로 변환하는 기능을 제공한다.- 한편, url62 방식을 사용하고자 한다면
glowfall/base62
(Apache 2.0)를 사용할 수 있다. 메이븐 저장소에 없기 때문에 복사하여 사용해야 한다.
UUID 생성하기
private String generateUUID() {
// RFC 4122 variant 2, version 1 방식으로 생성된 UUID를 반환
TimeBasedGenerator uuidV1Generator = Generators.timeBasedGenerator(EthernetAddress.fromInterface());
UUID uuid = uuidV1Generator.generate();
// 또는 RFC 4122 version 4 방식으로 생성된 UUID를 반환
uuid = Generators.randomBasedGenerator().generate();
// URL에 포함될 수 있는 Base64 문자열로 변환
ByteBuffer uuidBytes = ByteBuffer.wrap(new byte[16]);
uuidBytes.putLong(uuid.getMostSignificantBits());
uuidBytes.putLong(uuid.getLeastSignificantBits());
return org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString(uuidBytes.array());
}
- 한 번 생성된 UUID 객체는 toString()을 사용할 경우 32개 크기의 문자열로 변환할 수 있다. Apache Commons Codec이 제공하는 Base64 클래스를 이용하면 동일한 원자성을 유지하면서 URL 친화적인 22개 크기의 문자열을 생성할 수 있다. 결과는 아래와 같다.
Hsxpe15HTAmMaXteR3wJhA
YcrgST0DRf6K4Ek9A6X-dg
LyiTKOHpQPGokyjh6YDxAg
ZFqTy_xJRm2ak8v8SWZtdw
0cwWlpFrSDiMFpaRa7g48g
fHIjWcjyTLSyI1nI8ty0PA
ssrDdCCdSHyKw3QgnSh8ug
yde_mqRcSyWXv5qkXDslMQ
NepFt7mwR6uqRbe5sEercw
L_wLRdyVSqy8C0XclZqssQ
url62 변환 UUID 생성하기
private String generateUrl62UUIDv4 {
UUID uuid = Generators.randomBasedGenerator().generate();
ByteBuffer uuidBytes = ByteBuffer.wrap(new byte[16]);
uuidBytes.putLong(uuid.getMostSignificantBits());
uuidBytes.putLong(uuid.getLeastSignificantBits());
return Base62.encode(uuidBytes.array());
}
- 생성한 UUID를 url62 방식으로 변환하면 보다 안전한 문자열을 생성할 수 있다. client_id, authorization_code, access_token, refresh_token 등에 두루 사용할 수 있다.
BrIfqEKoPqVF5rSogettSH
OJ0wVlmILNhgDXVais0EyD
YNZShSzuEhzkJFKN7SLOWA
qBsv62QRENPgeV3GKiu5zH
mf0q7cwnGSsTruzBf0wi1E
XbtKb0gHDBvlqsRDeYY4HA
fHbFHfwQEU6Yq44DDRMpDI
x9LHxnqkFp9vcEfUlsCtBG
va9xZxtxCpllHnF3GLtW9C
v5Hau0qgIdqvo5SrCi2pmD
- 한편, client_secret 값 또한 url62로 생성이 가능하다. 다만, 데이터베이스에 보관할 때는 BCrypt로 해쉬 변환된 값을 저장해야 한다. 사용 예는 아래와 같다.
// 텍스트 그대로를 반환한다. 테스트 환경에서만 사용해야 하며 절대 운영 환경에서는 사용하면 안된다.
NoOpPasswordEncoder.getInstance().encode(client_secret);
// BCrypt 방식의 해시로 변환하여 반환한다. 운영 환경에 가장 적합하다.
BCryptPasswordEncoder.getInstance().encode(client_secret);
- 앞서 생성된 값들을 BCrypt 해시로 변환하면 아래와 같다. 60개 크기의 문자열이 생성된다.
$2a$10$C9dXz/q/ZE/nvOXFxG0Pvu4ZqWESlGXKtGyhkz5.q8s2OTSNyK/8y
$2a$10$7HZdG8.bvW08yoGpZZ9us.sFA2UANbivpWBo0/on4LemxGxpr946K
$2a$10$ENMG.zVPYjVujd.XHFIjkejo1fNrSchuks4NDFBxr0WfcRC5V12T.
$2a$10$A5OzbZBq9U2KPiAaeKEjx.bZgoF2uwSVoa3C2onVvPnfEqKMM1fDO
$2a$10$fBK8iyhC6tClKoHR8v/ZWOQRFMPkKXjmLquAHjpQLLwYjCQEc.K3q
$2a$10$L5EZAy4QltMKjtN6v8SD7esaMiqBy5MvdYg6gcRRDKET6e5vXjTpa
$2a$10$dN80n/LO5wLUi4peLfylO.UzJ4s4Xf0LWWehnV7//LjFB6e9OAz3a
$2a$10$WGuswZRmbgEKeAtgix78Y.oiXcz5H6pS0wrfC7XbKOiN6nD2cSjoa
$2a$10$7Z5zGcIIQraUzDNw4ZFyTeT0dBRu8fmsi54OiN9vMQZFIf30v3leu
$2a$10$YMzU80KrozWw4ABHj1ltiu735rARX1aC/owCkeYvcDbvVx5uxRTsa
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Spring MVC 3
- Eclipse
- 자전거
- 로드바이크
- 구동계
- graylog
- JHipster
- jpa
- 태그를 입력해 주세요.
- 로드 바이크
- kotlin
- Spring Boot
- node.js
- jsp
- Kendo UI Web Grid
- 평속
- maven
- DynamoDB
- Tomcat
- bootstrap
- jstl
- spring
- Docker
- chrome
- CentOS
- Kendo UI
- JavaScript
- MySQL
- 알뜰폰
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함