프로젝트 구성원

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

구성원은 프로젝트에 액세스할 수 있는 사용자 및 그룹입니다.

각 구성원에게는 프로젝트에서 수행할 수 있는 작업을 결정하는 역할이 부여됩니다.

멤버십 유형

사용자는 멤버십 유형을 정의하는 다양한 방법으로 그룹 또는 프로젝트의 구성원이 될 수 있습니다.

멤버십 유형 멤버십 프로세스
직접 사용자가 현재 그룹 또는 프로젝트에 직접 추가됩니다.
상속 사용자는 현재 그룹이나 프로젝트를 포함하는 상위 그룹의 구성원입니다.
직접 공유 사용자는 현재 그룹 또는 프로젝트에 공유된 그룹 또는 프로젝트의 구성원입니다.
상속된 공유 사용자는 현재 그룹 또는 프로젝트에 공유된 그룹이나 프로젝트의 상위 구성원입니다.
flowchart RL subgraph 그룹 A A(직접 멤버) B{{공유된 멤버}} subgraph 프로젝트 A H(1. 직접 멤버) C{{2. 상속된 멤버}} D{{4. 상속된 멤버}} E{{3. 공유된 멤버}} end A-->|그룹 A의 직접 멤버십\n프로젝트 A의 상속된 멤버십|C end subgraph 그룹 C G(직접 멤버) end subgraph 그룹 B F(직접 멤버) end F-->|Group B\nshared with\nGroup A|B B-->|프로젝트 A의 상속된 멤버십|D G-->|그룹 C가 프로젝트 A와 공유|E

프로젝트에 사용자 추가

프로젝트에 사용자를 추가하여 직접 멤버가 되고 작업을 수행할 수 있는 권한을 부여하세요.

전제 조건:

  • 소유자 또는 관리자 역할이 있어야 합니다.
  • 그룹 멤버십 잠금이 비활성화되어 있어야 합니다.
  • 가입을 비활성화했을 경우, 관리자는 먼저 사용자를 이메일로 추가해야 합니다.

프로젝트에 사용자를 추가하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 관리 > 멤버를 선택합니다.
  3. 멤버 초대를 선택합니다.
  4. 사용자가:

    • GitLab 계정이 있는 경우, 그들의 사용자 이름을 입력합니다.
    • GitLab 계정이 없는 경우, 그들의 이메일 주소를 입력합니다.
  5. 기본 역할 또는 사용자 정의 역할을 선택하세요.
  6. 선택 사항. 액세스 만료 날짜를 선택합니다. 해당 날짜부터 사용자는 더 이상 프로젝트에 액세스할 수 없습니다.

    액세스 만료 날짜를 선택한 경우 프로젝트 구성원은 액세스가 만료되기 7일 전에 이메일 알림을 받습니다.

    경고: 구성원에게 관리자 역할을 부여하고 만료 날짜를 선택한 경우 해당 구성원은 권한을 풀로 가집니다. 이는 자신의 관리자 역할 기간을 연장하는 능력을 포함합니다.

  7. 초대를 선택합니다. 사용자를 다음과 같이 초대했다면:

    • GitLab 사용자 이름으로 초대했다면, 사용자는 멤버 목록에 추가됩니다.
    • 이메일 주소로 초대했다면, 해당 이메일 주소로 초대장이 전송되며 계정을 만들도록 안내됩니다. 초대가 수락되지 않으면, GitLab은 2일, 5일, 10일 후에 리마인더 이메일을 보냅니다. 수락되지 않은 초대는 90일 후에 자동으로 삭제됩니다.

할당할 수 있는 역할

할당할 수 있는 최대 역할은 그룹의 소유자 또는 관리자 역할 여부에 따라 달라집니다. 예를 들어, 설정할 수 있는 최대 역할은 다음과 같습니다:

  • 프로젝트에서 소유자(50).
  • 프로젝트에서 관리자(40).

GitLab 14.8 및 그 이전 버전에서 프로젝트의 직접 멤버들은 최대로 관리자 역할을 가질 수 있습니다. 소유자 역할은 그룹에만 추가할 수 있습니다.

상속된 멤버십

프로젝트가 그룹에 속하는 경우 프로젝트 멤버는 해당 그룹에서 역할을 상속받습니다.

프로젝트 멤버 페이지

이 예에서:

  • 세 명의 멤버가 프로젝트에 액세스할 수 있습니다.
  • 사용자 0은 리포터이며 demo 그룹에 포함된 프로젝트에서 역할을 상속받았습니다.
  • 사용자 1은 프로젝트에 직접 추가되었습니다. 소스(Source) 열에는 직접 멤버(Direct member)로 나와 있습니다.
  • 관리자소유자이자 모든 그룹의 멤버입니다. 해당 그룹에서 역할을 상속받았습니다.

사용자가:

  • 프로젝트의 직접 멤버인 경우, 만료최대 역할(Max role) 필드를 프로젝트에서 직접 업데이트할 수 있습니다.
  • 상위 그룹에서 상속된 멤버인 경우, 만료최대 역할 필드는 해당 멤버의 상위 그룹에서 업데이트해야 합니다.

프로젝트에 그룹 추가

프로젝트에 그룹을 추가하면 모든 그룹 멤버(직접 또는 상속)가 프로젝트에 액세스 권한을 받습니다. 각 멤버의 액세스 권한은 다음을 기반으로 합니다:

  • 그룹에서 할당된 역할.
  • 그룹으로 초대할 때 선택한 최대 역할.

그룹 멤버가 그룹 역할에 비해 더 적은 권한을 가지는 경우, 해당 멤버는 프로젝트에서 그룹 역할의 권한만 유지합니다. 예를 들어, 최대 역할이 메인테이너인 프로젝트에 게스트 역할을 가진 멤버를 추가하는 경우, 해당 멤버는 프로젝트에서 게스트 역할의 권한만 가집니다.

필수 구성 요소:

  • 메인테이너 또는 소유자 역할이 있어야 합니다.
  • 다른 그룹과의 프로젝트 공유를 방지하지 않아야 합니다.

프로젝트에 그룹을 추가하려면:

  1. 좌측 사이드바에서 검색 또는 이동을 선택하여 프로젝트를 찾습니다.
  2. 관리 > 멤버를 선택합니다.
  3. 그룹 초대를 선택합니다.
  4. 그룹을 선택합니다.
  5. 그룹 내 사용자의 최고 역할을 선택합니다.
  6. 선택 사항입니다. 액세스 만료 날짜를 선택합니다. 해당 날짜부터 그룹은 더 이상 프로젝트에 액세스할 수 없습니다.
  7. 초대를 선택합니다.

초대된 그룹은 그룹 탭에 표시됩니다. 비인가 사용자에게서 비공개 그룹은 가려집니다. 비공개 그룹은 보호된 브랜치, 보호된 태그, 보호된 환경에 대한 프로젝트 설정에 표시됩니다. 초대된 그룹의 멤버는 멤버 탭에 표시되지 않습니다. 멤버 탭에 표시되는 내용:

  • 프로젝트에 직접 추가된 멤버.
  • 프로젝트가 추가된 그룹 네임스페이스의 상속된 멤버.

프로젝트를 그룹과 공유

한 명씩 사용자를 추가하는 대신 프로젝트를 전체 그룹과 공유할 수 있습니다.

다른 프로젝트에서 멤버 가져오기

다른 프로젝트의 직접 멤버를 귀하의 프로젝트로 가져올 수 있습니다. 가져온 프로젝트 멤버는 가져온 프로젝트와 동일한 권한을 유지합니다.

주의: 프로젝트의 직접 멤버만 가져옵니다. 상속된 또는 공유된 프로젝트 멤버는 가져오지 않습니다.

필수 구성 요소:

  • 메인테이너 또는 소유자 역할이 있어야 합니다.

목표 프로젝트에서 가져오기 멤버의 역할이:

  • 메인테이너인 경우, 소스 프로젝트에서 소유자 역할을 가진 멤버는 메인테이너 역할로 가져와집니다.
  • 소유자인 경우, 소스 프로젝트에서 소유자 역할을 가진 멤버는 소유자 역할로 가져와집니다.

프로젝트의 멤버를 가져오려면:

  1. 좌측 사이드바에서 검색 또는 이동을 선택하여 프로젝트를 찾습니다.
  2. 관리 > 멤버를 선택합니다.
  3. 프로젝트에서 가져오기를 선택합니다.
  4. 프로젝트를 선택합니다. 메인테이너인 경우에만 표시됩니다.
  5. 프로젝트 멤버 가져오기를 선택합니다.

가져오기가 성공하면 성공 메시지가 표시됩니다. 멤버 탭에서 가져온 멤버를 보려면 페이지를 새로 고쳐주세요.

프로젝트에서 멤버 삭제

사용자가:

  • 프로젝트의 직접 멤버인 경우, 해당 멤버를 프로젝트에서 직접 제거할 수 있습니다.
  • 상위 그룹에서 상속된 멤버인 경우, 해당 멤버를 상위 그룹에서만 제거할 수 있습니다.

필수 구성 요소:

  • 다음 역할을 가진 직접 멤버를 제거하려면:
    • 메인테이너, 개발자, 리포터 또는 게스트 역할을 가진 경우, 메인테이너 역할이 있어야 합니다.
    • 소유자 역할이면 소유자 역할이 있어야 합니다.
  • 선택 사항. 해당 사용자가 할당된 모든 이슈 및 병합 요청에서 할당 해제합니다.

프로젝트에서 멤버를 제거하려면:

  1. 좌측 사이드바에서 검색 또는 이동을 선택하여 프로젝트를 찾습니다.
  2. 관리 > 멤버를 선택합니다.
  3. 제거하려는 프로젝트 멤버 옆에 멤버 제거를 선택합니다.
  4. 선택 사항. 확인 대화상자에서 이 사용자를 관련된 이슈 및 병합 요청에서도 할당 해제 확인란을 선택합니다.
  5. 비공개 프로젝트에서 민감한 정보 누설을 방지하려면 해당 멤버가 비공개 저장소를 포크하거나 웹훅을 생성하지 않았는지 확인합니다. 기존 포크는 상위 프로젝트에서 계속해서 변경을 받고 웹훅은 계속해서 업데이트를 받습니다. 또한 프로젝트가 그룹 내에서 외부로 포크되는 것을 방지하도록 프로젝트를 구성할 수도 있습니다.
  6. 멤버 제거를 선택합니다.
## 삭제된 사용자가 스스로 다시 초대되지 않도록 보장

유지자 또는 소유자 역할을 가진 악의적인 사용자는 GitLab 관리자가 그들을 제거한 그룹 또는 프로젝트로 자신을 다시 초대할 수 있는 레이스 조건을 악용할 수 있습니다.

이 문제를 피하기 위해 GitLab 관리자는 다음을 할 수 있습니다:

- [GitLab Rails 콘솔](../../../administration/operations/rails_console.md)에서 악의적인 사용자 세션을 제거합니다.
- 악의적인 사용자를 표시하여:
  - 프로젝트에서 사용자를 제거합니다.
  - GitLab에서 사용자를 로그아웃합니다.
- 악의적인 사용자 계정을 차단합니다.
- 악의적인 사용자 계정을 삭제합니다.
- 악의적인 사용자 계정의 암호를 변경합니다.

## 프로젝트 멤버 필터링 및 정렬

> - [GitLab 12.6에 도입](https://gitlab.com/gitlab-org/gitlab/-/issues/21727).
> - [GitLab 13.9에서 개선됨](https://gitlab.com/groups/gitlab-org/-/epics/4901).
> - [GitLab 13.10에서 기능 플래그가 제거됨](https://gitlab.com/gitlab-org/gitlab/-/issues/299954).

프로젝트의 멤버를 필터링하고 정렬할 수 있습니다.

### 직접 멤버 표시

1. 왼쪽 사이드바에서 **검색 또는 이동**을 선택하고 프로젝트를 찾습니다.
1. **관리 > 멤버**를 선택합니다.
1. **멤버 필터** 상자에서 `멤버십` `=` `직접`을 선택합니다.
1. <kbd>Enter</kbd> 키를 누릅니다.

### 상속된 멤버 표시

1. 왼쪽 사이드바에서 **검색 또는 이동**을 선택하고 프로젝트를 찾습니다.
1. **관리 > 멤버**를 선택합니다.
1. **멤버 필터** 상자에서 `멤버십` `=` `상속된`을 선택합니다.
1. <kbd>Enter</kbd> 키를 누릅니다.

### 프로젝트의 멤버 검색

프로젝트 멤버를 검색하려면:

1. 왼쪽 사이드바에서 **검색 또는 이동**을 선택하고 프로젝트를 찾습니다.
1. **관리 > 멤버**를 선택합니다.
1. 검색 상자에 멤버의 이름, 사용자 이름 또는 이메일을 입력합니다.
1. <kbd>Enter</kbd> 키를 누릅니다.

### 프로젝트의 멤버 정렬

다음을 기준으로 회원을 오름차순 또는 내림차순으로 정렬할 수 있습니다:

- **계정** 이름
- **부여된 액세스** 날짜
- 그룹 내 재정의 **최대 역할**
- **사용자 생성** 날짜
- **최근 활동** 날짜
- **최근 로그인** 날짜

회원을 정렬하려면:

1. 왼쪽 사이드바에서 **검색 또는 이동**을 선택하고 프로젝트를 찾습니다.
1. **관리 > 멤버**를 선택합니다.
1. 멤버 목록 상단에서 드롭다운 목록에서 원하는 항목을 선택합니다.

## 프로젝트에 액세스 요청

GitLab 사용자는 프로젝트의 멤버가 되도록 요청할 수 있습니다.

1. 왼쪽 사이드바에서 **검색 또는 이동**을 선택하고 멤버가 되고 싶은 프로젝트를 찾습니다.
1. 프로젝트 이름 옆에 **액세스 요청**을 선택합니다.

![액세스 요청 버튼](img/request_access_button.png)

가장 최근에 활동한 프로젝트 유지자 또는 소유자에게 이메일이 전송됩니다.
최대 열 명의 프로젝트 유지자 또는 소유자에게 알림이 전송됩니다.
프로젝트 소유자 또는 유지자는 요청을 승인하거나 거절할 수 있습니다.
프로젝트 유지자는 소유자 역할 액세스 요청을 승인할 수 없습니다.

프로젝트에 직접 소유자나 유지자가 없는 경우, 알림이 프로젝트의 상위 그룹의 가장 최근에 활동한 소유자에게 전송됩니다.

### 프로젝트의 액세스 요청 취소

액세스 요청이 승인되기 전에 프로젝트의 액세스 요청을 취소할 수 있습니다.
액세스 요청을 취소하려면:

1. 왼쪽 사이드바에서 **검색 또는 이동**을 선택하고 액세스를 요청한 프로젝트를 찾습니다.
1. 프로젝트 이름 옆에 **액세스 요청 취소**를 선택합니다.

## 프로젝트에 액세스 요청 방지

프로젝트에 대한 액세스 요청을 방지할 수 있습니다.

전제 조건:

- 프로젝트에 대한 소유자 역할이 있어야 합니다.

1. 왼쪽 사이드바에서 **검색 또는 이동**을 선택하고 프로젝트를 찾습니다.
1. **설정 > 일반**을 선택합니다.
1. **가시성, 프로젝트 기능, 권한**을 확장합니다.
1. **프로젝트 가시성** 아래에서 **사용자가 액세스 요청을 할 수 있음**을 선택합니다.
1. **변경 사항 저장**을 선택합니다.

## 멤버십 및 가시성 권한

그룹 또는 프로젝트의 멤버의 멤버십 유형에 따라 다른 [가시성 수준](../../../user/public_access.md)과 권한이 부여됩니다.

다음 표는 프로젝트 멤버의 멤버십 및 가시성 권한을 나열합니다.

| 작업 | 직접 프로젝트 멤버 | 상속된 프로젝트 멤버 | 직접 공유된 프로젝트 멤버 | 상속된 공유된 프로젝트 멤버 |
| --- | ------------------- | ---------------------- | -------------------------- | ----------------------------- |
| 보드 생성 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 |
| 상위 그룹의 이슈 보기 <sup>1</sup> | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 |
| 상위 그룹의 라벨 보기 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 |
| 상위 그룹의 마일스톤 보기 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 |
| 다른 그룹에 공유 | **{check-circle}** 가능 | **{dotted-circle}** 불가능 | **{dotted-circle}** 불가능 |  **{dotted-circle}** 불가능 |
| 다른 프로젝트로 가져 오기 | **{check-circle}** 가능 | **{dotted-circle}** 불가능 | **{dotted-circle}** 불가능 | **{dotted-circle}** 불가능 |
| 프로젝트를 다른 멤버와 공유 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 |

다음 표는 그룹 멤버의 멤버십 및 가시성 권한을 나열합니다.

| 작업 | 직접 그룹 멤버 | 상속된 그룹 멤버 | 직접 공유된 그룹 멤버 | 상속된 공유된 그룹 멤버 |
| --- | ------------------- | ---------------------- | -------------------------- | ----------------------------- |
| 보드 생성 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 |
| 상위 그룹의 이슈 보기 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 |
| 상위 그룹의 라벨 보기 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 |
| 상위 그룹의 마일스톤 보기 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 |
| 보드 생성 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 |
| 상위 그룹의 이슈 보기 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 |
| 상위 그룹의 라벨 보기 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 |
| 상위 그룹의 마일스톤 보기 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 | **{check-circle}** 가능 |

<html>
소각:
  <ol>
    <li>사용자는 액세스할 수있는 프로젝트의 이슈 만 볼 수 있습니다.</li>
  </ol>
</html>

다음 예에서 `사용자`는 다음과 같습니다:

- `subgroup`의 직접 멤버.
- `subsubgroup`의 상속된 멤버.
- `subgroup-2``subgroup-3`의 간접 멤버.
- `subsubgroup-2``subsubgroup-3`의 간접 상속된 멤버.

```mermaid
graph TD
  classDef user stroke:green,color:green;

  root --> subgroup --> subsubgroup
  root-2 --> subgroup-2 --> subsubgroup-2
  root-3 --> subgroup-3 --> subsubgroup-3
  subgroup -. 공유 .-> subgroup-2 -. 공유 .-> subgroup-3

  사용자-. 멤버 .- subgroup

  class 사용자 user

```