본문 바로가기
Develop/Study

UUID

by ys2ys2 2025. 4. 18.

출결 시스템에 QR 코드를 적용하면서 겪은 것들 정리하면서 한번 더 공부하기!

이번 프로젝트에서 QR이미지를 이용하면서 출결을 관리할 수 있는 로직을 만들어야 했다.

기능적인 부분에서는 QR 코드 이미지가 매번 다르게 생성되어야 했고, 출결 가능 여부를 판단할 수 있도록 유효 시간 조건도 포함되어야 했다.


이 두 가지 조건을 만족시키기 위해 선택한 것이 바로 UUID였다.

 

✅UUID ?

 

UUID란 Universally Unique Identifier의 약자로 128bit의 고유 식별자를 뜻한다.

다른 고유 ID 생성 방법과 다르게 UUID는 중앙 시스템에 등록하고 발급하는 과정이 없기 때문에 상대적으로 더 빠르고 간단하게 만들 수 있다는 장점이 있다.

 

RFC 4122문서에 정의된 UUID 버전 4 표준 규약에는 1조 개의 UUID 중, 중복이 일어날 확률은 10억분의1 이라고 한다...

(그럼 사실상.. 없는..수준..?)

또 크기가 작기 때문에 다른 고유 식별자에 비해 사용하기 쉽고 DB에 보관하기도 용이하다고 한다.

 


 

☑️UUID 구조

128bit 숫자 문자열이고 총 길이는 36자리라고 한다.32개의 16진수 숫자가 4개의 하이픈으로 나누어진 8-4-4-4-12 형태로 이루어져 있다.ex) 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d

 

하이픈 사이에 있는 16진수 숫자들은 하나의 필드로 되어있고 각 필드는 정수로 취급되며 가장 중요한 숫자가 앞에 나오게 된다.

출처 : https://docs.tosspayments.com/resources/glossary/uuid

 

위 사진을 보면 3번째 필드의 첫 숫자는 4인데, UUID의 버전을 나타낸다.

UUID의 버전? 버전이 어디까지 있고 버전별로 어떤 특징이 있지..?

 


 

☑️UUID 버전

 

UUID는 총 5개의 버전이 있다고 한다.

버전 1,2는 보통 timestamp UUID라고 부르고 만들어진 시점과 기기 정보를 알 수 있다고 한다.

버전 3,5는 NameSpace 기반으로 만드는 UUID라고 한다. 네임스페이스를 해싱 알고리즘으로 암호화해서 UUID를 생성한다.

(다른 정보와 연결된 값을 만들고 싶을 때 사용하면 좋다고 한다.)

 

가장 흔히 사용하는 버전은 4다. 다른 버전과 달리 외부 정보에 의존하지 않고 완전 랜덤한 값으로 생성한다. 시간, 기기 정보, 네임스페이스 등 정보가 없기 때문에 어디서 어떻게 생성됐는지 알 수가 없다.

 


 

 

☑️UUID 사용하기

대부분의 언어는 UUID 라이브러리를 지원하는데 나는 JAVA에서 사용했다.

 

import java.util.UUID;

UUID uuid = UUID.randomUUID(); // UUID 객체 생성
String token = uuid.toString(); // 문자열로 변환

 

자바에서는 UUID.randomUUID() 메서드를 통해 버전 4 UUID를 손쉽게 생성할 수 있다.

 

 

 

단순히 UUID만 QR코드에 넣으면 출결 시간이나 유효성 정보를 알 수 없다.

그래서 출결 관련 정보 + UUID를 결합한 문자열을 만들고 UUID를 기반으로 출결용 토큰을 구성했다.

교육장에 입실,퇴실도 3분으로 추가해서 테스트해봤다.

문자열은 백엔드에서 처리하게 하고 Base64 인코딩해서 토큰으로 만들었다.

@Override
public String generateToken(Integer clssrmId, LocalDateTime begin, LocalDateTime end) {

    LocalDateTime validFrom = begin.minusMinutes(3);
    LocalDateTime validTo = end.plusMinutes(3);

    UUID uuid = UUID.randomUUID();

    String raw = String.format(
        "CL:%d|FROM:%s|TO:%s|UUID:%s",
        clssrmId,
        validFrom,
        validTo,
        uuid
    );

    return Base64.getEncoder().encodeToString(raw.getBytes(StandardCharsets.UTF_8));
}
CL:101|FROM:2025-04-18T16:50|TO:2025-04-18T17:00|UUID:e834...d21

 

 

최종적으로 URL형식으로 접근한다.

http://localhost:포트번호/api/attendance/check?token=eyJ.....==

 

 

테스트를 하기 위해 3분동안으로 지정하고 테스트해봤다.

 

QR코드 이미지 디코딩은 여기서 사용했다.

https://zxing.org/w/decode.jspx

 

 

생성된 QR코드를 디코딩해서 URL로 바꾸고 출석 인정 시간 내에 URL을 입력하면 이런 화면이 나타난다.

 

 

50분 전후 3분까지 토큰 유효

 

 

5시 전후 3분까지 토큰 유효

 

 

이렇게 전후 3분으로 토큰값 필터링하고 잘 되는지 테스트하고 끝!

 


 

 

결과적으로 UUID는 고유한 식별자 필요시 매우 유용하다.

QR코드 이미지는 text값에 따라 계속 변하기 때문에 randomUUID랑 잘 연계해서 쓸 수 있다.

JAVA에서는 UUID.randomUUID() 한 줄로 쉽게 생성 가능하다.

토큰값을 랜덤으로 만들고 시간 제약까지 걸면 유효성 판단으로 사용할 수 있다.

 

끝!

'Develop > Study' 카테고리의 다른 글

패키지 매니저(npm, pnpm, yarn)  (1) 2025.06.28
REST API 규칙  (1) 2025.06.09
Deserialization Failure due to Date Format  (2) 2025.04.10
react, typescript  (0) 2025.03.22
Spring Framework  (0) 2025.03.14