- 인증되지 않은 API 요청 요금 제한 활성화
- 인증되지 않은 웹 요청 요금 제한 활성화
- 인증된 API 요청 요금 제한 활성화
- 인증된 웹 요청 요금 제한 활성화
- 사용자 지정 요금 제한 응답 사용
project/:id/jobs
에 대한 최대 인증 요청 수(분당)- 응답 헤더
- HTTP 헤더를 사용하여 속도 제한 우회하기
- 특정 사용자가 인증된 요청 속도 제한을 우회하도록 허용
- 속도 제한 설정을 적용하기 전에 테스트하기
- 문제 해결
사용자 및 IP 요금 제한
Offering: Self-managed
요금 제한은 웹 애플리케이션의 보안 및 내구성을 향상시키는 데 사용되는 일반적인 기술입니다. 자세한 내용은 요금 제한을 참조하세요.
기본적으로 다음의 제한 사항은 비활성화되어 있습니다:
인증되지 않은 API 요청 요금 제한 활성화
인증되지 않은 API 요청 요금 제한을 활성화하려면:
-
왼쪽 사이드바에서 하단에 있는 관리자를 선택합니다.
-
설정 > 네트워크를 선택합니다.
-
사용자 및 IP 요금 제한을 확장합니다.
-
인증되지 않은 API 요청 요금 제한 활성화를 선택합니다.
-
선택 사항. IP당 요금 제한 기간당 최대 인증되지 않은 API 요청 값을 업데이트합니다. 기본값은
3600
입니다. -
선택 사항. 인증되지 않은 요금 제한 기간(초) 값을 업데이트합니다. 기본값은
3600
입니다.
-
인증되지 않은 웹 요청 요금 제한 활성화
인증되지 않은 웹 요청 요금 제한을 활성화하려면:
-
왼쪽 사이드바에서 하단에 있는 관리자를 선택합니다.
-
설정 > 네트워크를 선택합니다.
-
사용자 및 IP 요금 제한을 확장합니다.
-
인증되지 않은 웹 요청 요금 제한 활성화를 선택합니다.
-
선택 사항. IP당 요금 제한 기간당 최대 인증되지 않은 웹 요청 값을 업데이트합니다. 기본값은
3600
입니다. -
선택 사항. 인증되지 않은 요금 제한 기간(초) 값을 업데이트합니다. 기본값은
3600
입니다.
-
인증된 API 요청 요금 제한 활성화
인증된 API 요청 요금 제한을 활성화하려면:
-
왼쪽 사이드바에서 하단에 있는 관리자를 선택합니다.
-
설정 > 네트워크를 선택합니다.
-
사용자 및 IP 요금 제한을 확장합니다.
-
인증된 API 요청 요금 제한 활성화를 선택합니다.
-
선택 사항. 사용자당 요금 제한 기간당 최대 인증된 API 요청 값을 업데이트합니다. 기본값은
7200
입니다. -
선택 사항. 인증된 API 요금 제한 기간(초) 값을 업데이트합니다. 기본값은
3600
입니다.
-
인증된 웹 요청 요금 제한 활성화
인증된 웹 요청 요금 제한을 활성화하려면:
-
왼쪽 사이드바에서 하단에 있는 관리자를 선택합니다.
-
설정 > 네트워크를 선택합니다.
-
사용자 및 IP 요금 제한을 확장합니다.
-
인증된 웹 요청 요금 제한 활성화를 선택합니다.
-
선택 사항. 사용자당 요금 제한 기간당 최대 인증된 웹 요청 값을 업데이트합니다. 기본값은
7200
입니다. -
선택 사항. 인증된 웹 요금 제한 기간(초) 값을 업데이트합니다. 기본값은
3600
입니다.
-
사용자 지정 요금 제한 응답 사용
요금 제한을 초과하는 요청은 429
응답 코드 및 기본적으로 나중에 다시 시도하십시오
라는 일반 텍스트 본문을 반환합니다.
사용자 지정 응답을 사용하려면:
-
왼쪽 사이드바에서 하단에 있는 관리자를 선택합니다.
-
설정 > 네트워크를 선택합니다.
-
사용자 및 IP 요금 제한을 확장합니다.
-
요금 제한에 도달한 클라이언트에게 전송할 일반 텍스트 응답 텍스트 상자에 일반 텍스트 응답 메시지를 추가합니다.
project/:id/jobs
에 대한 최대 인증 요청 수(분당)
- GitLab 16.5에서 도입됨.
타임아웃을 줄이기 위해 project/:id/jobs
엔드포인트는 인증된 사용자당 기본 요청 속도 제한을 600호출로 설정했습니다.
최대 요청 수를 수정하려면:
-
왼쪽 사이드바의 하단에서 Admin을 선택합니다.
-
Settings > Network를 선택합니다.
-
User and IP rate limits를 확장합니다.
-
project/:id/jobs
에 대한 최대 인증 요청 수(분당) 값을 업데이트합니다.
응답 헤더
클라이언트가 관련 속도 제한을 초과할 경우, 다음 요청이 차단됩니다. 서버는 특정 기간 후에 재시도할 수 있도록 요청자에게 속도 제한 정보를 포함한 응답을 제공할 수 있습니다. 이러한 정보는 응답 헤더에 첨부됩니다.
헤더 | 예시 | 설명 |
---|---|---|
RateLimit-Limit |
60 |
클라이언트 매 분에 대한 요청 할당량입니다. Admin 영역에 설정된 속도 제한 기간이 1분과 다를 경우, 이 헤더의 값은 대략 가장 가까운 60분 주기로 조정됩니다. |
RateLimit-Name |
throttle_authenticated_web |
요청을 차단하는 스로틀의 이름입니다. |
RateLimit-Observed |
67 |
해당 클라이언트가 시간 창 내에 발생시킨 요청 수입니다. |
RateLimit-Remaining |
0 |
시간 창 내에서 남은 할당량입니다. RateLimit-Limit - RateLimit-Observed 의 결과입니다. |
RateLimit-Reset |
1609844400 |
요청 할당량이 재설정되는 유닉스 시간 형식의 시간입니다. |
RateLimit-ResetTime |
Tue, 05 Jan 2021 11:00:00 GMT |
요청 할당량이 재설정되는 RFC2616 형식의 날짜 및 시간입니다. |
Retry-After |
30 |
할당량이 재설정될 때까지 남은 시간 초 단위입니다. 이는 표준 HTTP 헤더입니다. |
HTTP 헤더를 사용하여 속도 제한 우회하기
조직의 필요에 따라 속도 제한을 활성화하고 일부 요청은 속도 제한을 우회하도록 하려는 경우가 있을 수 있습니다.
이것은 속도 제한을 우회해야 하는 요청에 대해 사용자 정의 헤더로 표시하여 수행할 수 있습니다. GitLab 앞에 있는 로드 밸런서나 리버스 프록시 어디에선가 이 작업을 수행해야 합니다. 예를 들어:
-
우회 헤더의 이름을 선택합니다. 예:
Gitlab-Bypass-Rate-Limiting
. -
로드 밸런서가 GitLab의 속도 제한을 우회해야 하는 요청에 대해
Gitlab-Bypass-Rate-Limiting: 1
으로 설정하도록 구성합니다. - 로드 밸런서를 구성하여 다음 중 하나를 수행합니다:
-
Gitlab-Bypass-Rate-Limiting
을 지웁니다. - 속도 제한의 영향을 받아야 할 모든 요청에 대해
Gitlab-Bypass-Rate-Limiting
을1
이 아닌 값으로 설정합니다.
-
- 환경 변수
GITLAB_THROTTLE_BYPASS_HEADER
를 설정합니다.-
리눅스 패키지 설치의 경우,
gitlab_rails['env']
에'GITLAB_THROTTLE_BYPASS_HEADER' => 'Gitlab-Bypass-Rate-Limiting'
을 설정합니다. - 자체 컴파일 설치의 경우,
/etc/default/gitlab
에export GITLAB_THROTTLE_BYPASS_HEADER=Gitlab-Bypass-Rate-Limiting
을 설정합니다.
-
리눅스 패키지 설치의 경우,
로드 밸런서가 모든 수신 트래픽에서 우회 헤더를 지우거나 덮어쓰는 것이 중요합니다. 그렇지 않으면 사용자가 해당 헤더를 설정하여 GitLab의 속도 제한을 우회하는 것을 신뢰해야 합니다.
우회는 헤더가 1
로 설정된 경우에만 작동합니다.
우회 헤더로 인해 속도 제한을 우회한 요청은 production_json.log
에 "throttle_safelist":"throttle_bypass_header"
로 표시됩니다.
우회 메커니즘을 비활성화하려면 환경 변수 GITLAB_THROTTLE_BYPASS_HEADER
를 설정 해제하거나 비워 두어야 합니다.
특정 사용자가 인증된 요청 속도 제한을 우회하도록 허용
위에서 설명한 우회 헤더와 유사하게, 특정 사용자 집합이 속도 제한기를 우회할 수 있도록 허용하는 것이 가능합니다. 이는 인증된 요청에만 적용됩니다: 인증되지 않은 요청의 경우, 정의상 GitLab은 사용자가 누구인지 알 수 없습니다.
허용 목록은 GITLAB_THROTTLE_USER_ALLOWLIST
환경 변수에 사용자 ID의 쉼표로 구분된 목록으로 구성됩니다. 사용자가 1, 53 및 217이 인증된 요청 속도 제한기를 우회하려면, 허용 목록 구성은 1,53,217
이 됩니다.
-
Linux 패키지 설치의 경우,
gitlab_rails['env']
에'GITLAB_THROTTLE_USER_ALLOWLIST' => '1,53,217'
를 설정하세요. - 자체 컴파일 설치의 경우,
/etc/default/gitlab
에export GITLAB_THROTTLE_USER_ALLOWLIST=1,53,217
를 설정하세요.
사용자 허용 목록으로 인해 속도 제한기를 우회한 요청은 production_json.log
에서 "throttle_safelist":"throttle_user_allowlist"
로 표시됩니다.
애플리케이션 시작 시, 허용 목록은 auth.log
에 기록됩니다.
속도 제한 설정을 적용하기 전에 테스트하기
GITLAB_THROTTLE_DRY_RUN
환경 변수를 쉼표로 구분된 속도 제한 이름 목록으로 설정하여 속도 제한 설정을 테스트할 수 있습니다.
가능한 이름은 다음과 같습니다:
-
throttle_unauthenticated
- GitLab 14.3에서 더 이상 사용되지 않음. 대신
throttle_unauthenticated_api
또는throttle_unauthenticated_web
를 사용하세요.throttle_unauthenticated
는 여전히 지원되며 두 가지 모두를 선택합니다.
- GitLab 14.3에서 더 이상 사용되지 않음. 대신
throttle_unauthenticated_api
throttle_unauthenticated_web
throttle_authenticated_api
throttle_authenticated_web
throttle_unauthenticated_protected_paths
throttle_authenticated_protected_paths_api
throttle_authenticated_protected_paths_web
throttle_unauthenticated_packages_api
throttle_authenticated_packages_api
throttle_authenticated_git_lfs
throttle_unauthenticated_files_api
throttle_authenticated_files_api
throttle_unauthenticated_deprecated_api
throttle_authenticated_deprecated_api
예를 들어, 보호되지 않는 경로에 대한 모든 인증된 요청을 시도하려면
GITLAB_THROTTLE_DRY_RUN='throttle_authenticated_web,throttle_authenticated_api'
로 설정할 수 있습니다.
모든 속도 제한에 대해 드라이 런 모드를 활성화하려면, 변수를 *
로 설정할 수 있습니다.
속도를 드라이 런 모드로 설정하면 제한에 도달할 경우 auth.log
에 메시지가 기록되며, 요청이 계속 진행됩니다. 로그 메시지에는 env
필드가 track
으로 설정되어 있습니다. matched
필드에는 도달한 속도 제한의 이름이 포함됩니다.
환경 변수를 우선 설정해야 속도 제한을 활성화할 수 있습니다. 관리자 영역의 설정은 즉시 적용되며, 환경 변수를 설정하는 것은 모든 Puma 프로세스를 재시작해야 합니다.
문제 해결
관리자 접근을 차단한 후 속도 제한 비활성화
많은 사용자가 동일한 프록시 또는 네트워크 게이트웨이를 통해 GitLab에 연결하는 경우, 속도 제한이 너무 낮으면 관리자가 차단될 수 있습니다. 이는 GitLab이 속도 제한을 트리거한 요청과 동일한 IP를 사용하고 있는 관리자를 식별할 수 있기 때문입니다.
관리자는 Rails 콘솔을 사용하여 속도 제한을 비활성화할 수 있습니다. 이는 GITLAB_THROTTLE_DRY_RUN 변수에 대해 나열된 것들과 동일합니다. 예를 들어:
Gitlab::CurrentSettings.update!(throttle_authenticated_web_enabled: false)
이 예제에서 throttle_authenticated_web
매개변수는 _enabled
이름 접미사가 있습니다.
제한에 대한 숫자 값을 설정하려면, _enabled
이름 접미사를 _period_in_seconds
및 _requests_per_period
접미사로 교체하세요.