맨위로가기

토큰 버킷

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

토큰 버킷은 네트워크 트래픽을 제어하는 데 사용되는 알고리즘으로, 특정 전송 속도를 유지하면서 버스트 트래픽을 허용한다. 이 알고리즘은 매 초마다 버킷에 토큰이 추가되고, 패킷 전송 시 버킷에서 토큰을 소비하는 방식으로 작동한다. 패킷 크기만큼 충분한 토큰이 있는 경우 패킷이 전송되지만, 그렇지 않은 경우 폐기되거나 지연될 수 있다. 토큰 버킷은 트래픽 쉐이핑 및 폴리싱, 데이터베이스 I/O 흐름 제어 등 다양한 분야에 활용된다. 계층형 토큰 버킷(HTB)은 리눅스 시스템에서 대역폭을 효과적으로 관리하기 위한 대안으로 사용된다.

더 읽어볼만한 페이지

  • 네트워크 스케줄링 알고리즘 - 트래픽 셰이핑
    트래픽 셰이핑은 네트워크 정체를 방지하고 서비스 품질을 보장하기 위해 트래픽의 양과 속도를 제어하는 기술이다.
  • 네트워크 스케줄링 알고리즘 - 라운드 로빈 스케줄링
    라운드 로빈 스케줄링은 프로세스 스케줄링에서 각 프로세스에 동일한 시간 할당량을 순환적으로 부여하는 선점형 방식이며, 네트워크 등 다양한 분야에 활용되고 가중 라운드 로빈, 결손 라운드 로빈 등 여러 변형된 방식들이 존재한다.
  • 네트워크 성능 - 대역폭 (컴퓨팅)
    대역폭은 통신 채널을 통해 단위 시간당 전송 가능한 데이터 양을 나타내는 용어로, 최대 비트 전송률, 정보 전송률, 유효 비트 전송률, 채널 용량 등 여러 의미로 사용되며, 데이터 전송 속도와의 차이를 이해하는 것이 중요하다.
  • 네트워크 성능 - 대기행렬이론
    대기행렬 이론은 1909년 에를랑에 의해 연구된 수학 이론으로, 서버, 대기실, 고객으로 구성된 시스템을 분석하며, 켄달의 표기법을 사용하여 대기열 모델의 특징을 나타내고, 컴퓨터 과학 등 다양한 분야에 응용되어 시스템 성능 분석 및 최적화에 활용된다.
토큰 버킷
네트워크 스케줄링 알고리즘
목적트래픽 흐름의 속도를 제어하고 네트워크 혼잡을 방지
작동 방식각 트래픽 흐름에 대한 가상 "토큰 버킷"을 유지
토큰 추가버킷에 주기적으로 토큰이 추가됨 (최대 용량 초과 불가)
패킷 전송패킷을 전송하려면 버킷에서 충분한 토큰을 제거해야 함
대기충분한 토큰이 없으면 패킷은 대기
주요 이점예측 가능한 대역폭 할당 제공
트래픽 버스트를 평활화하여 네트워크 혼잡을 줄임
주요 단점구성 및 관리가 복잡할 수 있음
모든 트래픽 흐름에 최적의 성능을 제공하지 못할 수 있음
변종Leaky bucket (누출 버킷)
Dual token bucket (이중 토큰 버킷)
응용
QoS (Quality of Service)다양한 유형의 트래픽에 우선순위를 부여
트래픽 쉐이핑네트워크로 전송되는 트래픽의 속도를 제어
대역폭 관리다양한 사용자 또는 애플리케이션 간에 대역폭을 할당
참고 자료
RFCRFC 2698 (A Two Rate Three Color Marker)
관련 항목리키 버킷
트래픽 쉐이핑
QoS

2. 알고리즘

토큰 버킷 알고리즘은 네트워크 트래픽을 제어하는 방법 중 하나로, 버킷에 토큰을 채우고 패킷을 전송할 때 토큰을 사용하는 방식으로 작동한다.
기본 원리에서는 토큰이 일정 속도로 버킷에 추가되며, 패킷 전송에는 해당 크기만큼의 토큰이 필요하다고 설명한다. 버킷에 토큰이 충분하면 패킷은 전송되고, 그렇지 않으면 패킷은 대기하거나 폐기된다.
변형에서는 기본 알고리즘에서 토큰 추가 주기를 조정하는 방법을 제시한다. 장치의 클럭 해상도가 낮아 1/r초마다 토큰을 추가하기 어려울 경우, 더 긴 주기(S 밀리초)마다 토큰을 추가할 수 있다. 이때 S 밀리초마다 추가되는 토큰 수는 (r*S)/1000이다.
속성에서는 알고리즘의 주요 특징으로 평균 전송률과 버스트 크기를 설명한다.


  • 평균 전송률: 장기적으로 패킷 전송률은 토큰 추가 속도(r)에 의해 제한된다.
  • 버스트 크기: 최대 버스트 크기는 버킷 용량(b)에 의해 결정되며, 일시적으로 평균 전송률보다 많은 트래픽을 처리할 수 있게 해준다. 최대 버스트 시간과 최대 버스트 크기는 계산 가능하다.


이 알고리즘은 트래픽의 버스트성을 조절하고, 네트워크 혼잡을 방지하는 데 사용될 수 있다.

2. 1. 기본 원리

토큰 버킷 알고리즘은 유추에 기반하여 작동하며, 버킷에는 정해진 속도로 토큰이 추가된다. 이 토큰은 보통 바이트 단위 또는 미리 정해진 크기의 패킷을 나타낸다.

패킷이 정의된 한계를 따르는지 확인하기 위해 버킷을 검사하여 충분한 토큰이 있는지 확인한다. 충분한 토큰이 있다면, 해당 바이트 길이만큼의 토큰을 제거("현금화")하고 패킷을 전송한다. 버킷에 토큰이 충분하지 않으면 패킷은 규칙을 따르지 않는 것으로 간주되며, 버킷의 내용은 변경되지 않는다.

규칙을 따르지 않는 패킷은 다음과 같이 처리될 수 있다.

  • 삭제될 수 있다.
  • 버킷에 충분한 토큰이 쌓일 때까지 나중 전송을 위해 대기열에 넣을 수 있다.
  • 전송될 수는 있지만, 규칙을 따르지 않음으로 표시되어 네트워크가 과부하 상태일 때 삭제될 수 있다.


따라서 규칙을 준수하는 흐름은 토큰이 버킷에 추가되는 속도까지의 평균 속도로 트래픽을 포함할 수 있으며, 버킷의 깊이에 따라 순간적으로 더 많은 트래픽을 처리할 수 있다.

토큰 버킷 알고리즘은 개념적으로 다음과 같이 이해할 수 있다.

  • 1/r초마다 버킷에 토큰이 추가된다.
  • 버킷은 최대 b개의 토큰을 담을 수 있다. 버킷이 가득 찬 상태에서 토큰이 도착하면 해당 토큰은 버려진다.
  • ''n'' 바이트의 패킷(PDU)이 도착하면,
  • 만약 버킷에 최소한 ''n''개의 토큰이 있다면, ''n''개의 토큰이 버킷에서 제거되고 패킷은 네트워크로 전송된다.
  • 만약 ''n''개 미만의 토큰이 사용 가능하다면, 버킷에서 토큰은 제거되지 않고 패킷은 ''비적합''으로 간주된다.


토큰 버킷은 버킷 내 토큰의 존재 여부에 따라 트래픽 전송 시점을 결정한다. 버킷에는 여러 개의 토큰이 있으며, 각 토큰은 특정 바이트 단위 또는 미리 설정된 크기의 패킷에 해당한다. 버킷 내 토큰은 패킷 전송 시 삭제된다. 네트워크 관리자는 얼마만큼의 바이트 전송에 몇 개의 토큰을 할당할지 설정한다. 토큰이 존재하면 트래픽을 전송할 수 있고, 토큰이 없으면 패킷을 전송할 수 없다.

이 알고리즘은 최대 ''b'' 바이트까지의 버스트 전송을 허용하지만, 장기적으로 볼 때 (''conformant'') 패킷의 전송 속도는 r 이라는 상수로 제한된다. ''non-conformant'' 패킷은 버려지거나, 큐에 보관되거나, non-conformant 표시를 붙여 전송될 수 있다.

1/r 초마다 토큰을 추가하려면 해당 장치의 클럭이 그보다 더 미세해야 한다. 그렇지 않은 경우, S밀리초마다 토큰 버킷을 갱신할 수 있다. S밀리초마다 추가하는 토큰 수는 (r*S)/1000이다.

2. 2. 변형

이 알고리즘을 구현하는 플랫폼에서 \frac{1}{r}초마다 버킷에 토큰을 하나씩 추가하는 데 필요한 시계 해상도가 부족한 경우, 다른 공식을 고려할 수 있다. S 밀리초마다 토큰 버킷을 업데이트할 수 있다면, S 밀리초마다 추가할 토큰 수는 \frac{(r \times S)}{1000}이다.[1]

\frac{1}{r} 초마다 토큰을 추가하려면, 해당 장치의 클럭이 그보다 더 미세해야 한다. 그렇지 않은 장치에서는, 구현에 다른 공식화가 필요하다. S밀리초마다 토큰 버킷을 갱신할 수 있는 경우, S밀리초마다 추가하는 토큰 수는 \frac{(r \times S)}{1000}이 된다.[1]

2. 3. 속성

토큰 버킷 알고리즘은 고정 용량의 유추에 기반하며, 버킷에 토큰이 일정한 속도로 추가된다. 토큰은 보통 바이트 단위나 미리 정해진 크기의 패킷을 나타낸다. 패킷이 정의된 한계를 따르는지 확인하기 위해 버킷을 검사하여 충분한 토큰이 있는지 확인한다. 충분한 토큰이 있다면, 해당 바이트 길이만큼의 토큰을 제거하고 패킷을 전송한다. 버킷에 토큰이 충분하지 않으면 패킷은 준수하지 않는 것으로 간주되며, 버킷의 내용은 변경되지 않는다.

비준수 패킷은 삭제, 대기열에 추가, 또는 비준수로 표시되어 전송될 수 있다. 준수 흐름은 토큰이 버킷에 추가되는 속도까지의 평균 속도로 트래픽을 포함할 수 있으며, 버킷의 깊이에 따라 버스티함(burstiness)이 결정된다. 버스티함은 지터 허용 오차(평균 속도 제한에서 예상되는 것보다 패킷이 얼마나 더 빨리 준수될 수 있는지) 또는 버스트 허용 오차(최대 버스트 크기, 유한 기간 동안 평균 트래픽 수준보다 얼마나 더 많은 트래픽이 준수될 수 있는지)로 표현될 수 있다.

2. 3. 1. 평균 전송률

장기간에 걸쳐 적합한 패킷의 출력은 토큰 추가 속도 r에 의해 제한된다. 이 알고리즘은 최대 ''b'' 바이트까지의 버스트 전송을 허용하지만, 장기적으로 볼 때 (''conformant'') 패킷의 전송 속도는 r 이라는 상수로 제한된다.

개념적으로 설명하면 다음과 같다.

  • 토큰은 1/r 초마다 버킷에 추가된다.
  • 버킷은 최대 ''b'' 개의 토큰을 보관할 수 있다. 버킷이 가득 찬 경우, 새로운 토큰은 버려진다.
  • ''n'' 바이트의 패킷 (PDU)이 도착하면, ''n'' 개의 토큰을 제거하고, 해당 패킷을 네트워크로 전송한다.
  • 사용 가능한 토큰이 ''n'' 개 미만인 경우, 토큰은 제거하지 않고, 해당 패킷은 ''non-conformant'' 상태로 처리된다.


''non-conformant'' 패킷에는 다음과 같은 몇 가지 처리 방법이 있다.

  • 버린다.
  • 버킷 내의 빈 토큰이 충분한 수가 될 때까지 큐에 보관한다.
  • non-conformant 라는 표시를 붙여서 무시하고 전송한다. 단, 네트워크가 고부하 상태라면 어딘가에서 버려질 수 있다.


1/r 초마다 토큰을 추가하려면, 해당 장치의 클럭이 그보다 더 미세해야 한다. 그렇지 않은 장치에서는, S밀리초마다 토큰 버킷을 갱신할 수 있는 경우, S밀리초마다 추가하는 토큰 수는 (r*S)/1000이 된다.

2. 3. 2. 버스트 크기

최대 버스트 크기(B_\text{max})는 최대 버스트 시간(T_\text{max})과 관련이 있으며, 이를 통해 트래픽의 버스트성(burstiness)을 조절할 수 있다. 여기서 버스트성이란, 평균 속도 제한보다 패킷이 얼마나 더 빨리 전송될 수 있는지, 또는 유한한 시간 동안 평균 트래픽 수준보다 얼마나 더 많은 트래픽이 허용될 수 있는지를 나타낸다.

M을 초당 최대 전송률이라고 할 때, 최대 버스트 시간은 다음과 같이 계산된다.

:T_\text{max} =

\begin{cases}

b/(M -r) & \text{ if } r < M \\

\infty & \text{ otherwise }

\end{cases}



여기서 r은 토큰이 추가되는 속도, b는 버킷의 최대 용량(토큰 수)이다. r < M인 경우, 즉 토큰이 추가되는 속도가 최대 전송률보다 작은 경우에만 최대 버스트 시간이 유한한 값을 가진다.

최대 버스트 크기는 최대 버스트 시간에 최대 전송률을 곱하여 구할 수 있다.

:B_\text{max} = T_\text{max}*M

토큰 버킷 알고리즘은 최대 b 바이트까지의 버스트 전송을 허용하지만, 장기적으로는 패킷 전송 속도를 r로 제한한다.

3. 리키 버킷과의 비교

토큰 버킷 알고리즘은 누수 버킷 알고리즘의 두 가지 버전 중 하나와 직접 비교할 수 있다. 이와 비교 가능한 버전은 미터로서의 누수 버킷 알고리즘으로, 토큰 버킷의 정반대이다. 즉, 적합한 패킷은 유체를 추가하는데, 이는 토큰 버킷에서 적합한 패킷이 토큰을 제거하는 것과 같다. 유한 용량 버킷에 추가된 유체는 일정한 속도로 배출되며, 이는 토큰이 고정된 속도로 추가되는 것과 같다.

큐로서의 누수 버킷 알고리즘은 또 다른 버전이다. 이는 적합한 패킷이 버킷을 통과하는 미터로서의 누수 버킷의 특수한 경우이다. 큐로서의 누수 버킷은 트래픽 셰이핑에만 적용되며, 출력 패킷 스트림에 버스트(지터)가 없도록 허용하지 않으므로 토큰 버킷 알고리즘과 상당히 다르다.

이 두 버전의 누수 버킷 알고리즘은 모두 같은 이름으로 문헌에 설명되어 혼란을 야기했지만, 기본적으로 동일하다. 올바르게 구현되고 동일한 매개변수가 주어지면 정확히 동일한 패킷을 적합 및 부적합으로 간주한다.

트래픽 셰이핑에는 토큰 버킷 외에 리키 버킷도 사용되지만, 이 둘은 성질과 목적이 다르다.[1] 리키 버킷은 데이터 전송률의 상한을 설정하는 반면, 토큰 버킷은 평균 전송률에 제한을 가하고 어느 정도의 버스트성을 허용한다.

4. 계층형 토큰 버킷 (HTB)

계층 토큰 버킷(HTB)은 리눅스에서 클래스 기반 큐잉(CBQ) 큐잉 규칙을 대체하는 더 빠른 대안이다. HTB는 각 클라이언트의 다운로드/업로드 속도를 제한하여, 제한된 클라이언트가 총 대역폭을 모두 사용하지 않도록 하는 데 유용하다.

HTB는 물리적 단일 링크를 여러 개의 더 느린 링크처럼 취급하여, 각 링크가 서로 다른 종류의 트래픽을 처리하도록 한다. 이를 위해 물리적 링크를 가상 링크로 분할하고, 각 패킷을 어떤 링크로 보낼지 설정해야 한다.

4. 1. HTB의 개념 및 구조

HTB는 계층 구조로 배열된 여러 개의 토큰 버킷으로 구성된다. 각 장치의 기본 이그레스 큐잉 규율(''qdisc'')은 루트 qdisc라고 불린다. 루트 qdisc는 하나의 클래스를 포함하며, 이 클래스는 ''rate''와 ''ceil'' 두 가지 매개변수로 설정된다. 이 값은 최상위 클래스에서 동일해야 하며 링크에서 사용 가능한 총 대역폭을 나타낸다.

HTB에서 ''rate''는 특정 클래스에 보장된 대역폭을, ''ceil''(ceiling의 약자)은 해당 클래스가 소비할 수 있는 최대 대역폭을 의미한다. 클래스가 보장된 것보다 많은 대역폭을 요청하면, 상위 클래스의 ''ceil''에 도달하지 않는 한 상위 클래스로부터 대역폭을 빌릴 수 있다. 계층 토큰 버킷은 리눅스 트래픽 제어 시스템에 대한 클래스 기반 큐잉 메커니즘을 구현하며, 사용자는 특정 트래픽 클래스에 대한 절대 대역폭을 제어하고 추가 대역폭이 사용 가능할 때 (ceil까지) 대역폭 분배 비율을 지정할 수 있다.

최상위 클래스의 대역폭을 선택할 때, 트래픽 쉐이핑은 LAN과 인터넷 사이의 병목 현상에서만 효과적이다. 이는 일반적으로 전체 LAN이 DSL 또는 T1 연결로 서비스되는 가정 및 사무실 네트워크 환경에 해당한다.

HTB는 물리적으로 단일 링크를 여러 개의 저속 링크처럼 취급하여, 각 저속 링크가 다른 종류의 트래픽을 처리하도록 한다. 이를 위해 물리 링크를 가상 링크로 분할하고, 개별 패킷을 어떤 링크로 보낼지 설정해야 한다.

4. 2. HTB의 활용

계층 토큰 버킷(Hierarchical token bucket, HTB)은 클래스 기반 큐잉(CBQ) 큐잉 규율을 대체하는 리눅스의 더 빠른 대안이다. 이는 각 클라이언트의 다운로드/업로드 속도를 제한하여, 속도 제한된 클라이언트가 총 대역폭을 포화시키지 않도록 하는 데 유용하다.

세 명의 클라이언트가 동일한 아웃바운드 대역폭을 공유하고 있습니다.


HTB는 물리적으로 단일 링크를 여러 개의 저속 링크처럼 취급하여, 각 저속 링크마다 다른 종류의 트래픽을 담당하게 한다. 이를 위해 물리 링크를 가상적인 여러 링크로 분할하는 설정과, 개별 패킷을 어떤 링크로 보낼 것인지 설정이 필요하다.

즉, HTB는 클라이언트 머신의 다운로드/업로드 전송 속도를 제한할 때 특히 유용하며, 전송 속도가 제한된 클라이언트는 네트워크 전체의 대역폭을 다 사용해 버리는 일이 없다.

5. 응용 분야

토큰 버킷 알고리즘은 트래픽 쉐이핑 및 트래픽 폴리싱 외에도 데이터베이스 IO 흐름 제어에도 사용된다. 이 알고리즘에서는 IOPS(초당 입출력 연산)나 대역폭 모두에 제한을 두는 대신, 이 둘의 선형 조합에 제한을 적용한다. 토큰은 IO 요청 가중치와 길이를 정규화한 합으로 정의되며, 알고리즘은 앞서 언급한 함수의 시간 미분이 필요한 임계값 이하로 유지되도록 한다.

5. 1. 트래픽 쉐이핑 및 폴리싱

토큰 버킷 알고리즘은 네트워크 트래픽을 관리하는 데 사용되는 방법 중 하나이다. 이 알고리즘은 버킷에 토큰을 일정한 속도로 추가하는 방식으로 작동한다. 여기서 버킷은 용량이 정해져 있고, 토큰은 보통 바이트 단위나 미리 정해진 크기의 패킷을 나타낸다.

패킷이 전송될 때, 이 패킷이 정해진 기준에 맞는지 확인하기 위해 버킷을 검사한다. 버킷에 충분한 토큰이 있으면, 해당 패킷의 크기만큼 토큰을 제거하고 패킷을 전송한다. 만약 버킷에 토큰이 충분하지 않으면, 패킷은 기준에 맞지 않는 것으로 간주된다. 이러한 비준수 패킷은 다음과 같이 처리될 수 있다.

  • 삭제될 수 있다.
  • 버킷에 충분한 토큰이 쌓일 때까지 대기열에 저장될 수 있다.
  • 전송은 되지만, 네트워크가 혼잡할 경우 나중에 삭제될 수 있도록 표시될 수 있다.


토큰 버킷 알고리즘은 트래픽 쉐이핑 또는 트래픽 폴리싱에 사용될 수 있다. 트래픽 폴리싱에서는 기준에 맞지 않는 패킷을 버리거나 우선순위를 낮춘다. 트래픽 쉐이핑에서는 패킷이 기준에 맞을 때까지 지연시킨다. 이러한 기능들은 과도하거나 급격하게 변동하는 트래픽으로부터 네트워크를 보호하는 데 사용되며, 대역폭 관리 및 혼잡 회피에 중요한 역할을 한다. 트래픽 쉐이핑은 주로 네트워크 인터페이스호스트에서 사용되어, 네트워크에서 전송이 거부되는 것을 방지한다.

토큰 버킷은 트래픽 전송 시점을 결정하는 제어 메커니즘이다. 버킷에는 여러 개의 토큰이 있으며, 각 토큰은 특정 바이트 단위 또는 미리 설정된 크기의 단일 패킷에 해당한다. 버킷 내의 토큰은 패킷을 전송할 때 삭제된다. 네트워크 관리자는 얼마만큼의 바이트 전송에 몇 개의 토큰을 할당할지 설정한다. 토큰이 존재할 경우 트래픽을 전송할 수 있다. 버킷 내에 토큰이 없을 경우 패킷을 전송할 수 없다. 따라서 개별 흐름에 충분한 토큰이 할당되어 있고, 버스트 임계값이 적절하게 설정되어 있다면 해당 흐름은 버스트적으로 전송될 수 있다.

이 알고리즘은 개념적으로 다음과 같이 설명할 수 있다.

  • 토큰은 1/r 초마다 버킷에 추가된다.
  • 버킷은 최대 ''b'' 개의 토큰을 보관할 수 있다. 버킷이 가득 찬 경우, 새로운 토큰은 버려진다.
  • ''n'' 바이트의 패킷 (PDU)이 도착하면, ''n'' 개의 토큰을 제거하고, 해당 패킷을 네트워크로 전송한다.
  • 사용 가능한 토큰이 ''n'' 개 미만인 경우, 토큰은 제거하지 않고, 해당 패킷은 ''non-conformant'' 상태로 처리된다.


이 알고리즘은 최대 ''b'' 바이트까지의 버스트 전송을 허용하지만, 장기적으로 볼 때 (''conformant'') 패킷의 전송 속도는 r 이라는 상수로 제한된다. ''non-conformant'' 패킷에는 다음과 같은 몇 가지 처리 방법이 있다.

  • 버린다.
  • 버킷 내의 빈 토큰이 충분한 수가 될 때까지 큐에 보관한다.
  • non-conformant 라는 표시를 붙여서 무시하고 전송한다. 단, 네트워크가 고부하 상태라면 어딘가에서 버려질 수 있다.


1/r 초마다 토큰을 추가하려면, 해당 장치의 클럭이 그보다 더 미세해야 한다. 그렇지 않은 장치에서는, S밀리초마다 토큰 버킷을 갱신할 수 있다. 이때 S밀리초마다 추가하는 토큰 수는 (r*S)/1000이 된다.

5. 2. 데이터베이스 IO 흐름 제어

토큰 버킷 알고리즘은 데이터베이스 IO 흐름 제어에도 사용된다. 이 알고리즘에서는 IOPS나 대역폭 모두에 제한이 적용되지 않고 둘의 선형 조합에 제한이 적용된다. 토큰을 IO 요청 가중치와 길이를 정규화한 합으로 정의함으로써, 알고리즘은 앞서 언급한 함수의 시간 미분이 필요한 임계값 이하로 유지되도록 한다.


본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com