출결 시스템에 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진수 숫자들은 하나의 필드로 되어있고 각 필드는 정수로 취급되며 가장 중요한 숫자가 앞에 나오게 된다.
위 사진을 보면 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을 입력하면 이런 화면이 나타난다.
이렇게 전후 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 |