사전 토큰화
용어함정

토큰화

gabury1고친 사람 github-actions[bot]

토큰화는 이름 하나로 서로 다른 두 일을 가리킵니다. 검색과 컴파일러에서는 긴 글을 낱말 같은 조각으로 쪼개는 일입니다. 보안과 결제에서는 카드 번호 같은 민감한 값을 아무 뜻 없는 값으로 바꿔 두는 일입니다.

쉽고 빠른 이해

무슨 일을 하는 물건인가 — 같은 이름으로 서로 다른 두 일을 부릅니다. 하나는 「어제 한강을 달렸다」를 「어제」「한강을」「달렸다」 같은 조각으로 쪼개는 일입니다. 다른 하나는 카드 번호를 아무 뜻 없는 다른 번호로 바꿔 저장하는 일입니다. 검색·컴파일러·언어 모델 쪽에서 들으면 쪼개는 뜻입니다. 결제·개인정보 쪽에서 들으면 바꾸는 뜻입니다.

왜 이렇게 하나 — 컴퓨터는 글을 글자가 늘어선 줄로만 받습니다. 낱말로 쪼개 두지 않으면 낱말로 찾을 수도, 문법을 따질 수도 없습니다. 카드 번호는 저장한 곳이 많을수록 샐 곳도 늘어납니다. 진짜 번호를 한곳에만 두고 나머지에는 바꾼 번호만 두면 샐 곳이 줄어듭니다.

어떻게 도나

  1. 글을 쪼갤 때는 띄어쓰기와 문장부호를 경계로 삼아 자릅니다
  2. 한국어는 낱말 끝에 붙은 조사도 떼어 냅니다
  3. 카드 번호를 바꿀 때는 진짜 번호와 바꾼 번호의 짝을 따로 지키는 저장소에 적어 둡니다. 되돌릴 때는 그 짝을 찾아봅니다

대가 — 넣을 때와 찾을 때 쪼개는 방법이 다르면 같은 낱말이 서로 못 만납니다. 카드 번호 쪽은 짝을 적어 둔 저장소가 멈추면 결제도 멈춥니다.

상세

이 절은 먼저 「토큰화」가 가리키는 두 일을 표 하나로 가릅니다. 그다음 글을 쪼개는 쪽과 값을 바꾸는 쪽을 차례로 봅니다.

토큰화가 가리키는 두 일

뜻은 둘입니다. 쓰는 분야는 다섯입니다. 검색 엔진과 컴파일러와 언어 모델은 모두 「글을 쪼갠다」는 같은 뜻으로 씁니다. 결제와 개인정보 보호 쪽만 다른 뜻으로 씁니다.

글을 쪼개는 토큰화 민감한 값을 바꾸는 토큰화
쓰는 분야 검색 엔진 · 컴파일러 · 언어 모델 결제 · 개인정보 보호
넣는 것 긴 글 한 덩이 카드 번호 같은 값 하나
나오는 것 조각 여럿 뜻 없는 값 하나
하는 까닭 낱말 단위로 다루려고 진짜 값을 숨기려고
되돌리기 할 일이 없다 짝을 적어 둔 저장소를 찾아본다

두 쪽 다 결과물을 토큰이라고 부릅니다. 앞쪽의 토큰은 글의 한 조각입니다. 뒤쪽의 토큰은 진짜 값을 대신하는 값입니다. 이름만 같을 뿐 하는 일은 겹치지 않습니다.

글을 쪼개는 토큰화

컴퓨터가 받는 글은 글자가 한 줄로 늘어선 것일 뿐입니다. 어디서 한 낱말이 끝나고 다음 낱말이 시작하는지는 글 안에 표시돼 있지 않습니다. 이 경계를 정해 글을 조각으로 나누는 일이 글을 쪼개는 토큰화입니다.

나눠진 조각 하나가 토큰입니다. 토큰화를 맡는 프로그램이나 부품은 토크나이저라고 부릅니다.

무엇을 한 조각으로 볼지는 쓰는 곳마다 다릅니다. 검색 엔진은 낱말을, 컴파일러는 예약어와 이름과 연산자를, 언어 모델은 낱말보다 작은 조각을 한 토큰으로 봅니다. 아래 세 소절이 그 셋입니다.

검색 엔진의 토큰화

검색 엔진은 글을 낱말로 찾아 주는 시스템입니다. 낱말로 찾으려면 글이 들어올 때 미리 낱말로 쪼개 둬야 합니다. 그래서 문서가 들어오면 가장 먼저 토큰화를 합니다.

가장 단순한 방법은 띄어쓰기에서 자르는 것입니다. 이 방법으로는 문장부호가 낱말에 붙어 남습니다. 그래서 문장부호도 경계로 삼아 떼어 냅니다.

넣은 글 띄어쓰기에서만 자르면 문장부호도 떼면
Wireless earphones, 2 pack! Wireless · earphones, · 2 · pack! Wireless · earphones · 2 · pack
어제 한강을 달렸다. 어제 · 한강을 · 달렸다. 어제 · 한강을 · 달렸다

첫 줄에서는 쉼표와 느낌표가 떨어졌습니다. 둘째 줄에서는 마침표만 떨어졌습니다. 「한강을」에는 조사가 붙은 채 남았습니다. 이 상태로 두면 「한강」으로 찾을 때 이 글이 안 걸립니다.

한국어는 낱말 끝에 조사와 어미가 붙습니다. 뜻을 가진 가장 작은 말 단위를 형태소라고 합니다. 「한강을」은 「한강」과 「을」 두 형태소로 되어 있습니다.

글을 형태소로 나누는 일이 형태소 분석입니다. 한국어 검색에서는 형태소 분석이 토큰화를 맡습니다. 조사와 어미를 떼어 내야 「한강을」과 「한강에서」가 같은 「한강」이 됩니다.

형태소 분석 없이 가는 방법도 있습니다. 글자를 n 개씩 겹쳐 자른 조각을 n-gram이라고 합니다. 두 개씩 자르면 「한강을」은 「한강」과 「강을」 두 조각이 됩니다. 낱말 사전이 필요 없는 대신 적어 둘 조각 수가 늘어납니다.

토큰화 뒤에는 조각의 모양을 고르는 단계가 이어집니다. 대문자는 소문자로 바꿉니다. 「달렸다」는 원래 모양 「달리다」로 되돌립니다. 토큰화와 이 단계를 한데 묶은 부품이 분석기입니다.

분석기를 지난 토큰은 역색인에 적힙니다. 역색인은 낱말마다 그 낱말이 든 문서 번호를 적어 둔 찾아보기 표입니다. 검색어도 같은 분석기를 지납니다. 넣을 때와 찾을 때 쪼개는 방법이 같아야 두 쪽의 토큰이 만납니다.

flowchart TD
    subgraph S1["넣을 때"]
        D["문서 1 · 어제 한강을 달렸다"] --> DA["분석기"] --> DT["어제 · 한강 · 달리다"]
    end
    subgraph S2["찾을 때"]
        Q["검색어 · 한강에서"] --> QA["같은 분석기"] --> QT["한강"]
    end
    DT --> I["역색인 · 한강 → 문서 1"]
    QT --> I

그림에서 문서와 검색어는 서로 다른 글입니다. 그래도 같은 분석기를 지나 둘 다 「한강」이라는 토큰을 내놓습니다. 그래서 역색인의 「한강」 줄에서 검색어가 문서 1을 찾아냅니다.

컴파일러의 토큰화

컴파일러는 소스 코드를 기계가 실행할 형태로 옮기는 프로그램입니다. 소스 코드도 컴파일러가 처음 받을 때는 그냥 글입니다. 그래서 먼저 토큰으로 쪼갭니다. 컴파일러에서는 이 단계를 어휘 분석이라고 부릅니다.

쪼개는 부품을 렉서라고 합니다. 렉서는 공백과 주석을 버립니다. 남은 조각마다 예약어인지 이름인지 숫자인지 갈래를 붙입니다.

if (count >= 10) 한 줄을 렉서에 넣으면 토큰 여섯 개가 나옵니다. 오른쪽 주석이 각 토큰의 갈래입니다.

if     // 예약어
(      // 괄호
count  // 이름
>=     // 연산자
10     // 숫자
)      // 괄호

>= 는 글자 둘이지만 토큰 하나입니다. 렉서는 한 토큰으로 읽을 수 있는 가장 긴 글자열을 고르기 때문입니다. 이 규칙을 최장 일치라고 부릅니다.

렉서가 내놓은 토큰들은 파서로 넘어갑니다. 파서는 이 토큰들로 문법 구조를 세웁니다.

언어 모델의 토큰화

언어 모델은 글을 받아 다음에 올 글을 이어 쓰는 모델입니다. 언어 모델도 글을 토큰으로 쪼개서 받습니다. 모델이 한 번에 받을 수 있는 글 길이를 이 토큰 수로 셉니다.

이 분야에서 토큰 하나는 낱말보다 작은 경우가 많습니다. 자주 나오는 낱말은 낱말 하나가 한 토큰이 됩니다. 드문 낱말은 여러 조각으로 나뉩니다. 이런 조각을 서브워드라고 부릅니다.

낱말보다 작게 자르는 까닭은 가짓수와 길이 사이의 균형입니다. 낱말마다 토큰을 하나씩 주면 모델이 알아야 할 토큰 가짓수가 끝없이 늘어납니다. 글자 하나를 한 토큰으로 두면 같은 글도 토큰 수가 많아집니다. 서브워드는 그 사이에 섭니다.

민감한 값을 바꾸는 토큰화

여기부터는 값을 바꾸는 뜻입니다. 온라인 가게는 단골 손님의 카드 번호를 저장해 두고 싶어 합니다. 카드 번호를 저장한 시스템이 많을수록 샐 곳이 늘어납니다. 지켜야 할 보안 기준도 그 시스템 전부에 걸립니다.

이 토큰화는 카드 번호를 아무 뜻 없는 값으로 바꿔 줍니다. 진짜 번호는 따로 지키는 저장소 한곳에만 둡니다. 나머지 시스템은 바꾼 값만 들고 다닙니다. 이 바꾼 값이 이 분야의 토큰입니다.

진짜 값과 토큰의 짝을 적어 둔 저장소를 토큰 볼트라고 부릅니다. 토큰만 보고는 진짜 번호를 계산해 낼 방법이 없습니다. 되돌리려면 볼트에서 짝을 찾아봐야 합니다. 볼트는 허락받은 시스템만 들여다볼 수 있습니다.

이 일은 대개 결제 대행사나 따로 둔 토큰화 서비스가 맡습니다. 결제할 때는 이 서비스가 볼트에서 진짜 번호를 찾아 카드 결제망에 넘깁니다. 카드 결제망은 결제 요청을 카드사까지 실어 나르는 망입니다. 주문 서버가 카드 번호를 한 번 넘기고 토큰을 받는 흐름은 이렇습니다.

sequenceDiagram
    participant 주문 as 주문 서버
    participant 토큰 as 토큰화 서비스
    participant 결제 as 카드 결제망
    주문->>토큰: 카드 번호를 한 번 넘긴다
    Note over 토큰: 볼트에 번호와 토큰의 짝을 적는다
    토큰-->>주문: 토큰을 돌려준다
    Note over 주문: 이 뒤로는 토큰만 저장한다
    주문->>토큰: 결제할 때 토큰을 보낸다
    토큰->>결제: 볼트에서 찾은 진짜 번호로 결제를 요청한다

카드 번호가 주문 서버를 지나는 것은 맨 위 한 번뿐입니다. 그 뒤로 주문 서버의 데이터베이스와 로그에는 토큰만 남습니다. 주문 서버가 털려도 새는 것은 토큰입니다.

대신 결제할 때마다 볼트를 거쳐야 합니다. 볼트가 멈추면 토큰을 진짜 번호로 되돌릴 수 없어 결제도 함께 멈춥니다.

토큰은 흔히 진짜 값과 같은 모양으로 만듭니다. 카드 번호라면 같은 자릿수의 숫자로 만듭니다. 끝 네 자리는 진짜 번호와 같게 남기기도 합니다. 아래 두 번호는 설명을 위해 지어낸 것입니다.

진짜 번호   4111 1111 1111 1234
토큰       7302 5819 4460 1234

두 번호가 같은 것은 끝 네 자리 1234 뿐입니다. 이렇게 모양이 같으면 카드 번호를 담던 데이터베이스 칸과 화면을 고치지 않고 토큰을 넣을 수 있습니다.

암호화 · 해싱과 가르는 선

암호화도 진짜 값을 알아볼 수 없는 값으로 바꿉니다. 차이는 되돌리는 방법에 있습니다. 암호화한 값은 열쇠만 있으면 계산으로 원래 값을 되살립니다. 볼트를 쓰는 토큰은 계산으로는 안 됩니다. 볼트의 짝을 찾아봐야만 되살아납니다.

해싱은 입력을 정해진 길이의 값으로 요약하는 계산입니다. 되돌릴 수 없게 만든 계산입니다. 그래서 결제처럼 나중에 진짜 번호가 필요한 곳에는 못 씁니다.

암호화 해싱 볼트를 쓰는 토큰화
원래 값으로 되돌리나 된다 안 된다 된다
되돌리는 데 필요한 것 열쇠 되돌릴 수 없다 볼트에 적힌 짝
바뀐 값과 원래 값 사이 계산으로 이어진다 계산으로 이어진다 계산 관계가 없다
바뀐 값만 훔치면 열쇠까지 털려야 원래 값이 나온다 가짓수가 적은 값은 대입해 보면 찾힌다 볼트 없이는 쓸모가 없다

표의 마지막 줄이 토큰화를 고르는 까닭입니다. 카드 번호는 가짓수가 한정돼 있습니다. 그래서 해시 값만 훔친 사람도 가능한 번호를 전부 해싱해 대 보면 원래 번호를 찾아냅니다.

볼트 없이 암호 계산으로 토큰을 만드는 방식도 있습니다. 이 방식은 되돌리는 방법이 암호화와 같습니다. 그래도 토큰이라 부르는 까닭은 쓰임새가 볼트 쪽 토큰과 같아서입니다. 여러 시스템이 진짜 번호와 같은 모양의 이 값을 진짜 번호 대신 들고 다닙니다.

어느 뜻인지 가르는 단서

「토큰화」가 나오면 옆에 붙은 낱말을 봅니다. 대개 그것만으로 어느 뜻인지 갈립니다.

함께 나오는 말 뜻
검색 · 분석기 · 형태소 · 역색인 글을 쪼갠다 · 검색 엔진
렉서 · 파서 · 소스 코드 · 문법 글을 쪼갠다 · 컴파일러
언어 모델 · 입력 길이 · 서브워드 글을 쪼갠다 · 언어 모델
카드 번호 · 볼트 · 개인정보 · 결제 민감한 값을 바꾼다

관련 항목

글을 쪼갠 뒤 이어지는 검색 처리 단계

분석기 · 형태소 분석 · 어간 추출 · 표제어 추출 · 불용어 · 동의어 사전 · 유니코드 정규화 · 역색인

글을 쪼갠 조각을 세는 단위

토큰 · 형태소 · n-gram · 서브워드 · 어휘

글을 쪼개는 부품과 알고리즘

토크나이저 · 렉서 · 형태소 분석기 · 바이트 쌍 인코딩 · 정규 표현식

소스 코드를 쪼갠 뒤 이어지는 컴파일 단계

어휘 분석 · 최장 일치 · 파서 · 구문 분석 · 추상 구문 트리 · 컴파일러 · 예약어 · 식별자

토큰 수로 길이를 세는 언어 모델 개념

언어 모델 · 대규모 언어 모델 · 컨텍스트 창 · 임베딩

토큰화한 글을 찾는 검색 시스템

검색 엔진 · 전문 검색 · Elasticsearch · Lucene · BM25

민감한 값을 감추는 다른 수단

암호화 · 해싱 · 데이터 마스킹 · 가명 처리 · 익명화 · 형식 보존 암호화 · 난독화

결제 토큰화가 기대는 장치와 기준

토큰 볼트 · PCI DSS · 결제 대행사 · 키 관리 서비스 · 하드웨어 보안 모듈 · 접근 제어

토큰이라는 이름만 겹치는 다른 개념

액세스 토큰 · 토큰 버킷 · 토큰 링 · 자산 토큰화

다른 이름: tokenization · tokenize · 토크나이징 · 토크나이제이션