실시간 채팅 구현(2)

지헌·2025년 2월 26일

UUID 를 통해 사용자를 구분해주었다.

오늘은 UUID에 대해 알아보려고한다.

UUID(Universally Unique Identifier) - 범용 고유 식별자

UUID는 네트워크 상에서 고유성이 보장되는 id가 필요 할 때 사용하는 128-bit의 고유 식별자입니다.

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

또한, 로컬에서 ID를 생성하면 아이디의 중복 여부를 체크하기 수월하지만 네트워크 상에서는 ID를 관리하는 중앙 관리자가 없기 때문에 중복 여부를 확인하기가 힘듭니다. 그래서 네트워크 상에서 중복되는 확률이 0에 가까운 ID를 만드는 방법을 표준화 한 것이 UUID입니다.

  • 고유성 : 특정 집합 내에서 각 항목을 구별하기 위해 사용하며 UUID가 서로 다른 것을 보장해주는 것
  • 유일성 : 전세계적으로 단 하나만 존재하는 것, UUID는 중복성이 매우 낮지만 중복될 수 있는 경우가 있기 때문에 유일성은 지켜지지 않는다.

필드사이즈(바이트)설명
time-low4hexOctet / 32bit타임스탬프의 low field
time-mid2hexOctet / 16bit타임스탬프의 mid field
time-high-and-version2hexOctet / 16bit타임스탬프의 high field & UUID 버전
clock-seq-hi-and-reservedhexOctet / 8bit(2)클락 시퀀스의 high field & variant
clock-seq-lowhexOctet / 8bit(2)클락 시퀀스의 low field
node6hexOctet / 48bitnode 식별자

테스트 결과

현재 로컬 환경에서 실시간 익명 채팅 기능을 수행할 때 일반 크롬창 하나와 시크릿모드 창 두 개를 키고 채팅 기능을 수행했습니다. 이 때, 로컬 환경에서 3개의 창 모두 다 다른 식별자 코드를 발급 받았는데 그 이유가 무엇일까하고 고민했습니다.

UUID는 여러 가지 방법으로 생성될 수 있으며, 그 중 가장 일반적인 방법은 다음과 같습니다:

시간 기반 UUID: 현재 시간과 MAC 주소를 기반으로 생성됩니다.
랜덤 UUID: 무작위로 생성된 숫자와 문자를 조합하여 생성됩니다.
네임 기반 UUID: 특정 네임스페이스와 이름을 기반으로 해시를 생성하여 UUID를 만듭니다.

일반 크롬 창과 시크릿 모드의 크롬 창에서 각각 UUID가 달랐던 이유

독립적인 세션: 일반 크롬 창과 시크릿 모드는 서로 독립적인 세션을 유지합니다. 시크릿 모드는 쿠키, 캐시, 세션 데이터 등을 저장하지 않기 때문에, 각 창에서 UUID를 생성할 때 서로 다른 상태에서 생성됩니다.

랜덤성: 만약 UUID가 랜덤 방식으로 생성되었다면, 각 세션에서 UUID를 생성할 때 무작위로 선택된 값이 다를 수 있습니다. UUID의 생성 알고리즘에 따라, 랜덤 UUID는 중복될 가능성이 매우 낮지만, 완전히 불가능하지는 않습니다.

시간 기반 요소: 만약 UUID가 시간 기반으로 생성되었다면, 각 창에서 생성된 UUID는 생성 시점이 다르기 때문에 서로 다른 값을 가질 수 있습니다.

이러한 문제점 때문에 접속한 유저가 새로고침을 눌러도 UUID값이 변하기 때문에 상태 휘발이 되어서 불편함을 야기할 수 있을 것 같아 쿠키에 UUID 값을 저장해주는 방법을 적용을 생각해봐야할 것 같다.

구현

저는 ReactJs와 nodeJs로 구현 중입니다.

  1. 라이브러리 설치
    npm i uuid

  2. 코드

import { v4 as uuidv4 } from "uuid";

const userId = uuidv4();
v4 함수를 통해 랜덤 UUID를 생성해준 뒤 userId 변수에 저장해줍니다.

참고 자료

profile
차곡차곡 그만 쌓아올리고 취업해서 부딪쳐보고 싶은

0개의 댓글