GitLab.com 속도 제한
GitLab v19.5Offering: GitLab.com
요약
GitLab.com에는 다음 속도 제한이 적용됩니다. GitLab Self-Managed 및 GitLab Dedicated 인스턴스에는 인스턴스 운영자가 제어하는 자체 제한이 있습니다. 이 절의 제한은 제안된 것이며 아직 적용되지 않았습니다.
GitLab.com에는 다음 속도 제한이 적용됩니다.
GitLab Self-Managed 및 GitLab Dedicated 인스턴스에는 인스턴스 운영자가 제어하는 자체 제한이 있습니다. GitLab.com을 사용하지 않는 경우 대신 속도 제한 또는 인증된 사용자 속도 제한을 참고합니다.
플랜별 속도 제한#
이 절의 제한은 제안된 것이며 아직 적용되지 않았습니다. 현재 속도 제한의 제한은 지금 적용되고 있으며, 이 변경 사항이 적용된 뒤에도 계속 적용됩니다. GitLab은 구체적인 날짜를 미리 공지합니다. 제한이 적용되기 전에 GitLab은 예약된 브라운아웃(brownout) 기간을 운영하며, 이 기간에는 새 제한이 잠시 활성화되어 새 제한이 워크로드에 미치는 영향을 확인할 수 있습니다.
속도 제한은 티어를 인식하는 방식으로 바뀌고 있습니다. 모든 사용자에게 하나의 숫자를 적용하는 대신, 제한은 사용자의 플랜을 반영하며 사용자별로 적용됩니다. 인증된 요청은 해당 플랜의 전체 허용량을 받습니다. 익명 요청은 유사한 플랫폼과 비슷하게 훨씬 낮은 허용량을 받습니다.
각 플랜에는 인증된 트래픽에 대한 두 가지 제한이 있으며, 지속 제한이 우선합니다.
- 시간당 측정하는 지속 제한. 이 숫자를 기준으로 사용량을 계획합니다.
- 분당 측정하는 버스트 제한. 짧은 급증이 시간당 허용량 전체를 한꺼번에 소모하지 않도록 GitLab이 이 기본값을 설정합니다.
꾸준한 작업에서는 지속 제한에 먼저 도달합니다. 버스트 제한으로 요청을 한 시간 내내 보내면 모든 플랜에서 지속 제한을 초과합니다. 버스트 제한은 짧은 급증을 위한 상한선으로 보고, 유지할 수 있는 속도로 보지 않습니다.
버스트 제한으로 요청을 보내면 Free에서는 약 50분, Premium에서는 12분, Ultimate에서는 12.5분 만에 지속 제한에 도달합니다.
이 제한은 API 요청, 웹 요청, 인증된 Git over HTTPS 요청에 적용됩니다. Git clone, fetch, push는 각각 요청 한 건으로 계산하며, Git LFS 전송도 마찬가지입니다. 일부 인증되지 않은 요청은 IP 주소당 시간당 60개 요청이라는 인증되지 않은 요청 제한에 포함되지 않습니다.
- Git over HTTPS 요청
- 의존성 프록시에 대한 컨테이너 이미지 요청
- SAML SSO와 Google 또는 GitHub 같은 서드 파티 공급자를 통한 로그인을 포함한 로그인 요청
- OAuth 2.0 인가, 액세스 토큰, 디바이스 인가, 동적 클라이언트 등록 요청
- 클라우드 공급자가 CI/CD ID 토큰을 검증하기 위해 보내는 요청 같은 OpenID Connect 디스커버리 요청
- MCP 클라이언트가 로그인하기 전에 보내는 OAuth 디스커버리 요청
- Terraform 모듈 레지스트리에서 모듈을 설치하기 전에 보내는 Terraform 서비스 디스커버리 요청
- Unleash 클라이언트의 기능 플래그 폴링
- 등록 토큰으로 러너를 등록하는 요청
- ID 공급자의 SCIM 프로비저닝 요청
- Jira Cloud가 GitLab for Jira Cloud 앱으로 보내는 요청 (예: 리포지터리 검색 및 연결)
- GitLab for Slack 앱의 요청
- 파이프라인 트리거 토큰으로 파이프라인을 트리거하는 요청
- 모니터링 도구가 알림 통합 엔드포인트로 보내는 알림
이러한 요청에는 계속 현재 제한이 적용됩니다. GitLab for Slack 앱에는 IP 주소당 시간당 1,000개 요청과 분당 100개 요청이라는 자체 제한도 있습니다.
지속 제한#
| 속도 제한 | Free | Premium | Ultimate |
|---|---|---|---|
| 사용자의 인증된 트래픽 | 시간당 5,000개 | 시간당 15,000개 | 시간당 25,000개 |
| IP 주소의 인증되지 않은 트래픽 | 시간당 60개 | 시간당 60개 | 시간당 60개 |
버스트 제한#
| 속도 제한 | Free | Premium | Ultimate |
|---|---|---|---|
| 사용자의 인증된 트래픽 | 분당 100개 | 분당 1,250개 | 분당 2,000개 |
제한을 초과한 경우#
요청이 속도 제한에 걸리면 GitLab은 429 Too Many Requests 상태 코드로 응답합니다. 요청을 다시 시도하기 전에
기다립니다.
제한된 요청에 대한 응답에는 할당량이 초기화될 때까지 남은 시간을 초 단위로 알려 주는 Retry-After 헤더와,
같은 정보를 날짜와 시간으로 나타내는 RateLimit-ResetTime 헤더가 포함됩니다. 프로젝트 및 그룹 생성 제한은
기간이 24시간이므로 Retry-After가 최대 86,400초일 수 있습니다. 제한되었는지 여부와 관계없이 모든 응답에는
RateLimit-Limit, RateLimit-Remaining 및 관련 헤더가 포함되며, 제한에 도달하기 전에 사용량을 추적하는 데 사용할 수 있습니다.
전체 목록은
응답 헤더를 참고합니다.
제한을 올바르게 처리하려면 다음을 수행합니다.
- 다시 시도하기 전에
Retry-After에 지정된 시간 동안 기다립니다. - 계속 제한되면 지수적으로 백오프합니다.
RateLimit-Remaining을 모니터링하고 할당량이 소진되기 전에 속도를 줄입니다.
Projects, Groups, Users API에 대한 속도 제한 응답에는 정보 헤더가 포함되지 않습니다.
응답 헤더는 일부 다른 제한도 반영하지 않으므로, 이전 응답의 헤더에 남은 할당량이 표시되었더라도 429
응답을 받을 수 있습니다.
더 많은 여유분이 필요한 경우#
제한에 정기적으로 도달한다면 부담이 가장 적은 방법부터 큰 방법까지 여러 선택지가 있습니다.
- API 사용 방식을 최적화합니다. 요청을 일괄 처리하고, 응답을 캐시하고, 페이지 매김을 사용하고,
Retry-After헤더를 따릅니다. 대부분의 사용량은 제한 아래에 머뭅니다. - 요청을 인증합니다. 익명 트래픽은 가장 낮은 허용량을 받습니다. 개인 액세스 토큰, OAuth 토큰 또는 CI/CD 작업 토큰으로 인증하면 해당 플랜의 전체 제한을 받습니다.
- 플랜을 업그레이드합니다. Premium과 Ultimate는 더 높은 제한을 제공합니다.
플랜 제한을 넘는 지속적인 요구에 대해서는 추가 여유분을 구매하는 옵션이 설계 중입니다. 자세한 내용은 제공 시점이 가까워지면 게시됩니다.
현재 속도 제한#
이 제한은 현재 GitLab.com에서 적용되고 있으며, 플랜별 속도 제한이 도입된 뒤에도 계속 적용됩니다.
GitLab은 먼저 플랜의 제한을 확인한 다음 이 표의 제한을 확인합니다. 둘 중 더 낮은 제한이 적용됩니다. 이 표의 제한이 플랜의 제한보다 낮을 수 있으므로 이 표의 제한에 먼저 도달할 수 있습니다.
예를 들어 사용자의 인증된 API 트래픽은 분당 2,000개 요청으로 제한됩니다. Free와 Premium에서는 플랜의 버스트 제한이 더 낮으므로 그 제한에 먼저 도달합니다. Ultimate에서는 버스트 제한도 분당 2,000개 요청이므로 두 제한이 같습니다.
| 속도 제한 | 설정 |
|---|---|
| IP 주소의 보호된 경로 | 분당 요청 10개 |
IP 주소의 로그인 시도(POST /users/sign_in) |
5분당 요청 10개 |
| 프로젝트, 커밋 또는 파일 경로의 Raw 엔드포인트 트래픽 | 분당 요청 300개 |
| 프로젝트의 인증되지 않은 Raw 엔드포인트 트래픽 | 분당 요청 800개 |
| IP 주소의 인증되지 않은 트래픽 | 분당 요청 500개 |
| 사용자의 인증된 API 트래픽 | 분당 요청 2,000개 |
| 사용자의 인증된 비 API HTTP 트래픽 | 분당 요청 1,000개 |
| 사용자의 인증된 Git HTTPS 트래픽 | 분당 요청 10,000개 |
| IP 주소의 인증되지 않은 Git HTTPS 트래픽 | 분당 요청 15,000개 |
| 사용자, 프로젝트, Git 명령별 Git SSH 작업 | 분당 작업 600개 |
| IP 주소의 모든 트래픽 | 분당 요청 2,000개 |
| 이슈 생성 | 분당 요청 200개 |
사용자의 프로젝트 생성(POST /api/v4/projects 및 UI) |
일당 요청 200개 |
사용자의 그룹 생성(POST /api/v4/groups 및 UI) |
일당 요청 200개 |
| 이슈 및 머지 리퀘스트의 노트 생성 | 분당 요청 60개 |
| IP 주소의 고급, 프로젝트 또는 그룹 검색 API | 분당 요청 100개 |
| 사용자의 고급, 프로젝트 또는 그룹 검색 API | 분당 요청 100개 |
| IP 주소의 GitLab Pages 요청 | 50초당 요청 1,000개 |
| GitLab Pages 도메인의 GitLab Pages 요청 | 10초당 요청 5,000개 |
| IP 주소의 GitLab Pages TLS 연결 | 50초당 요청 1,000개 |
| GitLab Pages 도메인의 GitLab Pages TLS 연결 | 10초당 요청 400개 |
| 프로젝트, 사용자 또는 커밋의 파이프라인 생성 요청 | 분당 요청 25개 |
| 사용자의 파이프라인 생성 요청 | 분당 요청 2,000개 |
| 프로젝트의 알림 통합 엔드포인트 요청 | 시간당 요청 3,600개 |
GitLab Duo aiAction 요청 |
8시간당 요청 160개 |
| 풀 미러링 간격 | 5분 |
사용자의 /api/v4/users/:id API 요청 |
10분당 요청 300개 |
| IP 주소의 GitLab 패키지 호스팅 시스템 요청 | 분당 요청 1,000개 |
| IP 주소 및 최상위 그룹의 가상 레지스트리 요청 | 15초당 요청 4,000개 |
| IP 주소의 거부된 가상 레지스트리 패키지 요청 | 15초당 요청 4,000개 |
IP 주소 및 파일 경로의 리포지터리 파일 API 요청(GET /api/v4/projects/:id/repository/files/*) |
분당 요청 500개 |
사용자 팔로워 요청(/api/v4/users/:id/followers) |
분당 요청 100개 |
사용자 팔로잉 요청(/api/v4/users/:id/following) |
분당 요청 100개 |
사용자 상태 요청(/api/v4/users/:user_id/status) |
분당 요청 240개 |
사용자 SSH 키 요청(/api/v4/users/:user_id/keys) |
분당 요청 120개 |
단일 SSH 키 요청(/api/v4/users/:id/keys/:key_id) |
분당 요청 120개 |
사용자 GPG 키 요청(/api/v4/users/:id/gpg_keys) |
분당 요청 120개 |
단일 GPG 키 요청(/api/v4/users/:id/gpg_keys/:key_id) |
분당 요청 120개 |
사용자 프로젝트 요청(/api/v4/users/:user_id/projects) |
분당 요청 300개 |
사용자 기여 프로젝트 요청(/api/v4/users/:user_id/contributed_projects) |
분당 요청 100개 |
사용자 별표 프로젝트 요청(/api/v4/users/:user_id/starred_projects) |
분당 요청 100개 |
프로젝트 목록 요청(/api/v4/projects) |
10분당 요청 2,000개 |
IP 주소의 인증되지 않은 프로젝트 목록 요청(/api/v4/projects) |
10분당 요청 400개 |
그룹 프로젝트 요청(/api/v4/groups/:id/projects) |
분당 요청 600개 |
단일 프로젝트 요청(/api/v4/projects/:id) |
분당 요청 400개 |
그룹 목록 요청(/api/v4/groups) |
분당 요청 50개 |
단일 그룹 요청(/api/v4/groups/:id) |
분당 요청 400개 |
러너 토큰을 사용한 러너 작업 요청(/api/v4/jobs/request) |
분당 요청 2,000개 |
IP 주소에서 러너 토큰을 사용한 러너 작업 요청(/api/v4/jobs/request) |
분당 요청 2,400개 |
작업 토큰을 사용한 러너 작업 트레이스 패치 요청(/api/v4/jobs/trace) |
분당 요청 200개 |
작업 토큰을 사용한 러너 작업 요청(/api/v4/jobs/*) |
분당 요청 200개 |
| 프로젝트의 모든 프로젝트 멤버 나열 | 분당 요청 200개 |
보호된 경로와 Raw 엔드포인트의 속도 제한에 대한 자세한 내용을 확인할 수 있습니다.
GitLab은 여러 계층에서 요청의 속도를 제한할 수 있습니다. 이 제한은 IP 주소별로 가장 엄격한 제한입니다.
가상 레지스트리 속도 제한#
히스토리
가상 레지스트리는 Maven 같은 패키지 요청에 전용 속도 제한을 적용합니다. 요청이 어떤 속도 제한에 포함되는지는 요청이 액세스 검사를 통과하는지 여부에 따라 달라집니다.
| 요청 | 속도 제한 | 속도 제한 범위 |
|---|---|---|
| 액세스 검사를 통과한 요청 | 15초당 요청 4,000개 | IP 주소 및 최상위 그룹 |
| 액세스 검사에 실패한 요청 | 15초당 요청 4,000개 | IP 주소 |
다음 경우 요청이 액세스 검사에 실패합니다.
- 레지스트리 ID가 존재하지 않습니다.
- 자격 증명이 없거나 유효하지 않습니다.
- 사용자에게 레지스트리에 대한 액세스 권한이 없습니다.
인증된 가상 레지스트리 패키지 요청은 사용자의 인증된 API 트래픽 제한이나 플랜별 속도 제한에 포함되지 않습니다. 대신 가상 레지스트리 속도 제한이 적용됩니다.
사용자별 제외와 액세스 검사에 실패한 요청에 대한 제한은 패키지 요청에만 적용되며 컨테이너 가상 레지스트리 요청에는 적용되지 않습니다.
두 제한 중 하나를 넘으면 GitLab은 429 Too Many Requests 오류를 반환합니다.
보호된 경로 스로틀은 계속 적용됩니다.
서비스 데스크 이메일 속도 제한#
GitLab.com은 최상위 그룹이 시간당, 일당 보낼 수 있는 서비스 데스크 발신 알림 이메일 수를 플랜별로 제한합니다.
| 플랜 | 시간당 제한 | 일당 제한 |
|---|---|---|
| Free, Premium 체험판, Ultimate 체험판 | 100 | 700 |
| 오픈 소스 | 1,500 | 10,000 |
| Premium | 5,000 | 50,000 |
| Ultimate, Ultimate 체험판 유료 고객 | 무제한 | 무제한 |
자세한 내용은 서비스 데스크 이메일 속도 제한을 참고합니다.
내보내기 파일 업로드를 통한 그룹 및 프로젝트 가져오기#
남용을 막기 위해 GitLab.com은 다음에 속도 제한을 적용합니다.
- 프로젝트 및 그룹 가져오기.
- 파일을 사용하는 그룹 및 프로젝트 내보내기.
- 내보내기 다운로드.
자세한 내용은 다음을 참고합니다.
IP 차단#
GitLab.com이 단일 IP 주소로부터 시스템이 악의적일 가능성이 있다고 판단하는 비정상적인 트래픽을 받으면 IP 차단이 발생할 수 있습니다. 이러한 차단은 속도 제한 설정에 기반할 수 있습니다. 비정상적인 트래픽이 멈추면 GitLab은 해당 IP 주소를 자동으로 해제합니다. 해제 시점은 다음 절에서 설명하는 것처럼 차단 유형에 따라 다릅니다.
GitLab.com에 대한 모든 요청에서 403 Forbidden 오류를 받는다면 차단을 유발했을 수 있는 자동화된
프로세스가 있는지 확인합니다. 도움이 필요하면 영향받은 IP 주소 같은 세부 정보와 함께
GitLab 지원에 문의합니다.
Git 및 컨테이너 레지스트리 인증 실패 차단#
단일 IP 주소가 1분 동안 인증 실패 요청을 300개 보내면 GitLab.com은 15분 동안 403 Forbidden 상태 코드로
응답합니다.
이 응답은 Git 요청과 컨테이너 레지스트리(/jwt/auth) 요청(합산)에만 적용됩니다.
이 제한은 다음과 같습니다.
- 인증에 성공한 요청으로 초기화됩니다. 예를 들어 인증 실패 요청 299개 다음에 성공한 요청 하나, 그 다음에 인증 실패 요청 299개가 더 오더라도 차단이 발생하지 않습니다.
gitlab-ci-token으로 인증된 JWT 요청에는 적용되지 않습니다.
응답 헤더는 제공되지 않습니다.
HTTPS를 통한 Git 요청은 항상 인증되지 않은 요청을 먼저 보내며, 프라이빗
리포지터리에서는 이 요청이 401 Unauthorized 오류를 반환합니다. 그다음 Git은 사용 가능한 경우
사용자 이름, 비밀번호 또는 액세스 토큰으로 인증된 요청을 시도합니다. 이러한 요청이 동시에 너무 많이 전송되면
일시적인 IP 차단이 발생할 수 있습니다. 이 문제를 해결하려면
SSH 키로 GitLab과 통신합니다.
구성할 수 없는 제한#
GitLab.com에서 사용하는 구성할 수 없는 속도 제한에 대한 자세한 내용은 구성할 수 없는 제한을 참고합니다.
페이지 매김 응답 헤더#
성능상의 이유로 쿼리가 10,000개를 넘는 레코드를 반환하면 GitLab은 일부 헤더를 제외합니다.
보호된 경로 스로틀#
같은 IP 주소가 보호된 경로로 1분에 POST 요청을 10개보다 많이 보내면 GitLab.com은
429 Too Many Requests 상태 코드를 반환합니다.
보호된 경로에는 사용자 생성, 사용자 확인, 사용자 로그인, 비밀번호 재설정이 포함됩니다. 전체 목록은 보호된 경로를 참고합니다.
차단된 요청에 GitLab이 포함하는 헤더는 사용자 및 IP 속도 제한을 참고합니다.
SSH 최대 연결 수#
GitLab.com은 MaxStartups 설정을 사용해
동시에 인증되지 않은 SSH 연결의 최대 수를 정의합니다. 허용된 최대 연결 수보다 많은 연결이 동시에 발생하면
GitLab은 초과 연결을 끊습니다.
그러면 사용자는
ssh_exchange_identification 오류를 받습니다.