티스토리 뷰

SW 개발/Java

Java, UUID 생성하기

지단로보트 2017.08.09 06:47

목표

  • UUID v1부터 v4까지 다양한 방식의 UUID를 생성할 수 있다.
  • 생성한 UUIDURL에 포함 가능한 22개 문자열로 변환할 수 있다.
  • API 업계에서 흔히 쓰이는 UUID 표현 방식은 UUIDurl62 방식으로 변환하는 것이다. url62UUID 바이트 배열을 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());
}
  • 생성한 UUIDurl62 방식으로 변환하면 보다 안전한 문자열을 생성할 수 있다. 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
댓글
댓글쓰기 폼