[EXT-008][중급] UUID로 겹치기 어려운 식별자 만들기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[EXT-008][중급] UUID로 겹치기 어려운 식별자 만들기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 20회 작성일 26-09-07 21:34

본문

[이번 수업]
여러 프로그램이 동시에 주문·파일·작업 번호를 만들면 1, 2, 3 같은 순번은 중앙 조정이 필요합니다. 이번에는 UUID(Universally Unique Identifier, 여러 곳에서 독립적으로 만들 수 있는 128비트 식별자)의 구조와 버전을 배우고 Python에서 UUIDv4를 생성·검사합니다.

[선수지식]
문자열, 리스트, 집합을 알고 Python 파일을 터미널에서 실행할 수 있으면 됩니다. 식별자는 대상을 구별하기 위해 붙이는 값입니다.

[학습목표]
1. UUID의 형식과 버전 필드를 설명한다.
2. UUIDv4를 생성하고 입력 문자열을 안전하게 검사한다.
3. 식별자와 보안용 비밀값의 역할을 구분한다.

[핵심개념]
RFC 9562는 UUID를 128비트 값으로 정의합니다. 흔한 문자열 표기는 `550e8400-e29b-41d4-a716-446655440000`처럼 16진수 32개를 8-4-4-4-12개로 나누고 하이픈을 넣습니다. 문자열 모양만 맞는다고 원하는 버전인 것은 아니므로 파싱 뒤 버전도 확인해야 합니다. 대문자와 소문자는 같은 16진수 값을 나타내지만 저장·비교 형식은 한 가지로 통일하는 편이 좋습니다.

UUIDv4는 버전과 변형을 표시하는 비트를 제외한 122비트를 무작위로 채웁니다. 충돌 가능성은 매우 작지만 0은 아니므로 데이터베이스의 UNIQUE 제약과 충돌 처리도 둡니다. UUIDv7은 Unix 시각 정보를 앞부분에 두어 대체로 시간순 정렬이 가능하지만, 생성 시각이 드러날 수 있고 같은 시각 안의 정확한 순서를 항상 뜻하지는 않습니다. 목적과 사용하는 도구의 지원 범위를 확인해 버전을 고릅니다.

UUID는 식별자이지 인증 수단이 아닙니다. 주소에 UUID가 보인다고 접근 권한이 생기는 것은 아니며 서버는 로그인 사용자에게 그 자원을 볼 권한이 있는지 따로 검사해야 합니다. 비밀번호 재설정 링크나 API 비밀값은 UUID가 아니라 보안 난수용 기능으로 만들고 만료·일회성 사용을 적용합니다.

[따라하기]
아래를 uuid_check.py로 저장합니다. 표준 라이브러리만 사용하며 네트워크나 외부 설치가 필요하지 않습니다.

```python
from uuid import UUID, uuid4

identifiers = [uuid4() for _ in range(3)]
parsed = [UUID(str(value)) for value in identifiers]

print("개수:", len(identifiers))
print("형식 확인:", parsed == identifiers)
print("모두 UUIDv4:", all(value.version == 4 for value in parsed))
print("모두 다름:", len(set(identifiers)) == len(identifiers))
```

macOS/Linux는 `python3 uuid_check.py`, Windows는 `py uuid_check.py`로 실행합니다. 생성값 자체는 매번 달라지지만 확인 결과는 보통 다음과 같습니다.

```text
개수: 3
형식 확인: True
모두 UUIDv4: True
모두 다름: True
```

외부 문자열을 받을 때는 `UUID(text)`를 `try` 안에서 호출해 ValueError를 처리하세요. 파싱 성공만 보지 말고 `value.version == 4`처럼 API가 요구한 버전을 확인합니다. 데이터베이스가 UUID 자료형을 제공하면 임의 길이 문자열보다 그 형식을 쓰고 UNIQUE 제약을 둡니다.

[흔한 실수]
UUID를 짧게 잘라 저장하면 충돌 가능성이 커지고 표준 형식 검증도 어려워집니다. 무작위 UUID가 생성 순서대로 정렬될 것이라 기대하거나, 문자열 정규화 없이 여러 표기를 섞는 것도 문제입니다. 단위 테스트에서 특정 UUIDv4 결과를 고정해 기대하지 말고 형식·버전·서로 다름을 검사하세요.

[보안 주의]
본인 소유의 로컬·격리 환경에서만 예제를 실행하세요. UUID가 추측하기 어려워 보여도 소유권 검사를 생략하면 다른 사용자의 자원에 접근하는 IDOR 문제가 생깁니다. 로그에는 식별자가 개인정보와 연결될 수 있으므로 필요한 기간만 보관하고 접근을 제한합니다. 보안 토큰은 Python의 `secrets` 같은 암호학적 난수 기능으로 만들며 코드나 문서에 실제 토큰을 기록하지 않습니다.

[직접 해볼 과제]
UUIDv4를 1000개 만들어 집합 크기가 1000인지 확인하세요. 이어 유효하지 않은 `not-a-uuid`를 파싱했을 때 ValueError를 잡아 `잘못된 형식`을 출력하고, 데이터베이스에 UNIQUE 제약이 필요한 이유를 한 문장으로 적으세요.

[확인문제]
1. UUID 문자열을 파싱한 뒤 버전까지 확인해야 하는 이유는 무엇입니까?
2. UUIDv4 충돌 가능성이 작아도 UNIQUE 제약이 필요한 이유는 무엇입니까?
3. UUID를 비밀번호 재설정 토큰으로 그대로 쓰면 안 되는 이유는 무엇입니까?

[다음 학습]
다음에는 텍스트가 같아 보여도 바이트가 다를 수 있는 유니코드 정규화와 안전한 비교를 배웁니다.

[공식 참고 자료]
- IETF RFC 9562 UUID 표준: https://www.rfc-editor.org/rfc/rfc9562.html
- Python uuid 공식 문서: https://docs.python.org/3/library/uuid.html
- Python secrets 공식 문서: https://docs.python.org/3/library/secrets.html
- W3C Web Cryptography Level 2: https://www.w3.org/TR/webcrypto-2/#Crypto-method-randomUUID
- PostgreSQL UUID 자료형: https://www.postgresql.org/docs/current/datatype-uuid.html

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
5,025
어제
6,862
최대
16,772
전체
770,976
Copyright © 소유하신 도메인. All rights reserved.