> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/on-premises/ko/configuration/overleaf-toolkit/authentication/ldap-authentication.md).

# LDAP 인증

이 기능은 [yu-i-i/overleaf-cep](https://github.com/yu-i-i/overleaf-cep). 여기서는 구성에 필요한 몇 가지 문서를 제공합니다.

{% hint style="warning" %}
Overleaf는 다음을 사용합니다 **passport-ldapauth** 라이브러리를 사용하며, 이는 비교적 오래되어 LDAP 호환성을 완전히 보장할 수 없습니다. 일부 LDAP ID 공급자(예: <https://goauthentik.io/>), 로그인 실패가 발생할 수 있습니다. 따라서 가능하면 먼저 OAuth/SAML 방법을 사용하는 것이 권장됩니다.
{% endhint %}

### LDAP란 무엇인가

LDAP는 외부 ID 검증에 사용되는 인증 프로토콜입니다. Overleaf Server Pro는 표준 인증 방식과 별도로 웹 인터페이스에 전용 LDAP 로그인 양식을 제공합니다. 사용자가 LDAP 사용자 이름과 비밀번호를 제출하면 Overleaf 백엔드가 구성된 LDAP 서버와 대조하여 자격 증명을 확인합니다. 예를 들어 `ldap://ldap:10389`.

<figure><img src="/files/8f72359fd42c61cfca844985b0350fa37aa12067" alt=""><figcaption><p>LDAP용 Server Pro 예시</p></figcaption></figure>

### 구성

내부적으로 Overleaf LDAP는 다음을 사용합니다 [passport-ldapauth](https://github.com/vesse/passport-ldapauth) 라이브러리. 이러한 구성 옵션 대부분은 다음에 전달됩니다 `서버` 를 구성하는 데 사용되는 config 객체 `passport-ldapauth`입니다. LDAP 구성에 문제가 있다면 다음의 README를 읽어보는 것이 좋습니다 `passport-ldapauth` 이를 통해 예상되는 구성을 파악할 수 있습니다.

환경 변수 `EXTERNAL_AUTH` 는 LDAP 인증 모듈을 활성화하는 데 필요합니다. 이 환경 변수는 어떤 외부 인증 방식이 활성화되는지를 지정합니다. 이 변수의 값은 목록입니다. 목록에 `ldap` 가 포함되어 있으면 LDAP 인증이 활성화됩니다.

예: `EXTERNAL_AUTH=ldap saml`

Overleaf CEP와 달리, 저희 ayaka-notes 버전에서는 LDAP 인증을 순수한 인증 방식으로 제한하며, 다음에서 사용할 수 있습니다 `http://your-overleaf.com/ldap/login`.

LDAP 인증 방식을 사용할 때 사용자는 로그인 양식에 `사용자 이름` 그리고 `비밀번호` 를 입력하며, 다음이 시도됩니다:

1. 다음으로 정의된 필터를 사용하여 LDAP 디렉터리에서 LDAP 사용자를 검색합니다 `OVERLEAF_LDAP_SEARCH_FILTER` 를 통해 인증합니다.
2. 인증이 성공하면 Overleaf 사용자 데이터베이스에서 인증된 LDAP 사용자의 이메일 주소와 일치하는 기본 이메일 주소를 가진 사용자를 확인합니다:
   * 일치하는 사용자가 있으면, `hashedPassword` 필드가 삭제됩니다(존재하는 경우). 이렇게 하면 해당 사용자는 앞으로 LDAP 인증으로만 로그인할 수 있습니다.
   * 일치하는 사용자가 없으면 LDAP 서버에서 가져온 이메일, 이름, 성을 사용하여 새 Overleaf 사용자가 생성됩니다.

{% hint style="danger" %}
LDAP로 로그인하는 사용자에 대해서는 Overleaf mongo 데이터베이스에 해시된 비밀번호를 저장하지 않으며(기존 값도 제거합니다).
{% endhint %}

#### 환경 변수

* `OVERLEAF_LDAP_URL` **(필수)**
  * LDAP 서버의 URL.
    * 예: `ldaps://ldap.example.com:636` (SSL을 통한 LDAP)
    * 예: `ldap://ldap.example.com:389` (암호화되지 않음 또는 STARTTLS, 구성된 경우).
* `OVERLEAF_LDAP_IDENTITY_SERVICE_NAME`
  * 로그인 페이지에서 사용되는 LDAP ID 서비스의 표시 이름.
  * 기본값: `LDAP 공급자로 로그인`.
* `OVERLEAF_LDAP_EMAIL_ATT`
  * LDAP 서버가 반환하는 이메일 속성, 기본값 `mail`. 각 LDAP 사용자는 최소 하나의 이메일 주소를 가져야 합니다. 여러 주소가 제공되면 첫 번째 주소만 사용됩니다.
* `OVERLEAF_LDAP_FIRST_NAME_ATT`
  * 애플리케이션에서 사용되는 사용자의 이름을 담는 속성 이름이며, 일반적으로 `givenName`.
* `OVERLEAF_LDAP_LAST_NAME_ATT`
  * 애플리케이션에서 사용되는 사용자의 성을 담는 속성 이름이며, 일반적으로 `sn`.
* `OVERLEAF_LDAP_NAME_ATT`
  * 사용자의 전체 이름을 담는 속성 이름이며, 일반적으로 `cn`. 이전의 두 변수 중 하나라도 정의되지 않으면 이 변수에서 사용자의 이름 및/또는 성을 추출합니다. 그렇지 않으면 사용되지 않습니다.
* `OVERLEAF_LDAP_PLACEHOLDER`
  * 로그인 양식의 자리표시자, 기본값은 `Username`.
* `OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN`
  * 다음으로 설정하면 `true`, LDAP 사용자를 업데이트하고 `first_name` 그리고 `last_name` 로그인 시 필드를 업데이트하며, LDAP 사용자의 `/user/settings` 페이지의 사용자 상세 정보 양식을 비활성화합니다. 그렇지 않으면 상세 정보는 첫 로그인 시에만 가져옵니다.
* `OVERLEAF_LDAP_BIND_DN`
  * LDAP 연결에 사용되어야 하는 LDAP 사용자의 구별 이름입니다(이 사용자는 LDAP 서버에서 계정을 검색/목록화할 수 있어야 합니다). 예: `cn=ldap_reader,dc=example,dc=com`. 정의되지 않은 경우 익명 바인딩이 사용됩니다.
* `OVERLEAF_LDAP_BIND_CREDENTIALS`
  * 비밀번호 `OVERLEAF_LDAP_BIND_DN`.
* `OVERLEAF_LDAP_BIND_PROPERTY`
  * 클라이언트에 바인딩할 사용자 속성, 기본값은 `dn`.
* `OVERLEAF_LDAP_SEARCH_BASE` **(필수)**
  * 사용자를 검색할 기준 DN입니다. 예: `ou=people,dc=example,dc=com`.
* `OVERLEAF_LDAP_SEARCH_FILTER`
  * 사용자를 찾기 위한 LDAP 검색 필터입니다. '{{username}}' 리터럴을 사용하면 제공된 사용자 이름이 LDAP 검색에 삽입됩니다.
    * 예: `(|(uid={{username}})(mail={{username}}))` (사용자는 이메일 또는 로그인 이름으로 로그인할 수 있습니다).
    * 예: `(sAMAccountName={{username}})` (Active Directory).
* `OVERLEAF_LDAP_SEARCH_SCOPE`
  * 검색 범위는 다음일 수 있습니다 `base`, `one`, 또는 `sub` (기본값).
* `OVERLEAF_LDAP_SEARCH_ATTRIBUTES`
  * LDAP 서버에서 가져올 속성의 JSON 배열, 예: `["uid", "mail", "givenName", "sn"]`. 기본적으로 모든 속성이 가져와집니다.
* `OVERLEAF_LDAP_STARTTLS`
  * 만약 `true`, TLS를 통한 LDAP가 사용됩니다.
* `OVERLEAF_LDAP_TLS_OPTS_CA_PATH`
  * LDAP 서버의 SSL/TLS 인증서를 검증하는 데 사용되는 CA 인증서가 들어 있는 파일의 경로입니다. 인증서가 여러 개라면 인증서 경로의 JSON 배열일 수 있습니다. 파일은 도커 컨테이너에서 접근 가능해야 합니다.
    * 예시(인증서 1개): `/var/lib/overleaf/certs/ldap_ca_cert.pem`
    * 예시(인증서 여러 개): `["/var/lib/overleaf/certs/ldap_ca_cert1.pem", "/var/lib/overleaf/certs/ldap_ca_cert2.pem"]`
* `OVERLEAF_LDAP_TLS_OPTS_REJECT_UNAUTH`
  * 만약 `true`, 서버 인증서는 제공된 CA 목록을 기준으로 검증됩니다.
* `OVERLEAF_LDAP_CACHE`
  * 만약 `true`, 그러면 한 번에 최대 100개의 자격 증명이 5분 동안 캐시됩니다.
* `OVERLEAF_LDAP_TIMEOUT`
  * 클라이언트가 작업을 타임아웃되기 전까지 얼마나 오래 유지할지, ms(기본값: Infinity).
* `OVERLEAF_LDAP_CONNECT_TIMEOUT`
  * TCP 연결에서 타임아웃되기 전까지 클라이언트가 얼마나 오래 기다릴지, ms(기본값: OS 기본값).
* `OVERLEAF_LDAP_IS_ADMIN_ATT` 그리고 `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE`
  * 두 환경 변수가 모두 설정되면 로그인 과정에서 `user.isAdmin = true` 로 업데이트되며, LDAP 프로필에 `OVERLEAF_LDAP_IS_ADMIN_ATT` 로 지정된 속성이 포함되어 있고 그 값이 `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE` 와 일치하거나 `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE`, 또는 `user.isAdmin` 이 `false`로 설정됩니다. 이 변수들 중 어느 하나라도 설정되지 않으면 관리자 상태는 `true` Launchpad에서 관리자 사용자 생성 시에만 설정됩니다.

다음 다섯 변수는 LDAP 서버에서 사용자 연락처를 가져오는 방식을 구성하는 데 사용됩니다.

* `OVERLEAF_LDAP_CONTACTS_FILTER`
  * 연락처로 불러올 사용자를 LDAP 서버에서 검색할 때 사용하는 필터입니다. 필터 내의 '{{userProperty}}' 자리표시자는 다음으로 지정된 속성의 값으로 대체됩니다 `OVERLEAF_LDAP_CONTACTS_PROPERTY` LDAP 검색을 시작하는 사용자의 LDAP 속성 값입니다. 정의되지 않으면 LDAP 서버에서 연락처로 가져오는 사용자는 없습니다.
* `OVERLEAF_LDAP_CONTACTS_SEARCH_BASE`
  * 연락처 검색을 시작할 기준 DN을 지정합니다. 기본값은 `OVERLEAF_LDAP_SEARCH_BASE`.
* `OVERLEAF_LDAP_CONTACTS_SEARCH_SCOPE`
  * 검색 범위는 다음일 수 있습니다 `base`, `one`, 또는 `sub` (기본값).
* `OVERLEAF_LDAP_CONTACTS_PROPERTY`
  * '{{userProperty}}' 자리표시자를 대체할 사용자 객체의 속성을 지정합니다. `OVERLEAF_LDAP_CONTACTS_FILTER`.
* `OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE`
  * 다음 값의 `OVERLEAF_LDAP_CONTACTS_PROPERTY` 비 LDAP 사용자가 검색을 시작하는 경우 지정합니다. 이 변수가 정의되지 않으면 결과 필터는 아무것도 일치하지 않습니다. 값 `*` 는 와일드카드로 사용할 수 있습니다.

<details>

<summary><strong>예시</strong></summary>

```
OVERLEAF_LDAP_CONTACTS_FILTER=(gidNumber={{userProperty}})
OVERLEAF_LDAP_CONTACTS_PROPERTY=gidNumber
OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE=1000
```

위 예시는 현재 LDAP 사용자의 연락처에 같은 UNIX `gid`를 가진 모든 LDAP 사용자를 불러옵니다. 비 LDAP 사용자의 연락처에는 UNIX `gid=1000` 를 가진 모든 LDAP 사용자가 표시됩니다.

</details>

<details>

<summary><strong>샘플 variables.env 파일</strong></summary>

```
OVERLEAF_APP_NAME="Our Overleaf Instance"

ENABLED_LINKED_FILE_TYPES=project_file,project_output_file,url

# ImageMagick을 사용한 썸네일 생성을 활성화
ENABLE_CONVERSIONS=true

# 이메일 확인 요구를 비활성화
EMAIL_CONFIRMATION_DISABLED=true

## Nginx
# NGINX_WORKER_PROCESSES=4
# NGINX_WORKER_CONNECTIONS=768

## nginx-proxy를 통한 TLS 설정
# OVERLEAF_BEHIND_PROXY=true
# OVERLEAF_SECURE_COOKIE=true

OVERLEAF_SITE_URL=http://my-overleaf-instance.com
OVERLEAF_NAV_TITLE=우리 Overleaf 인스턴스
# OVERLEAF_HEADER_IMAGE_URL=http://somewhere.com/mylogo.png
OVERLEAF_ADMIN_EMAIL=support@example.com

OVERLEAF_LEFT_FOOTER=[{"text": "지원팀에 문의하세요", "url": "mailto:support@example.com"}]
OVERLEAF_RIGHT_FOOTER=[{"text":"안녕하세요, 오른쪽에 있습니다", "url":"https://github.com/yu-i-i/overleaf-cep"}]

OVERLEAF_EMAIL_FROM_ADDRESS=team@example.com
OVERLEAF_EMAIL_SMTP_HOST=smtp.example.com
OVERLEAF_EMAIL_SMTP_PORT=587
OVERLEAF_EMAIL_SMTP_SECURE=false
# OVERLEAF_EMAIL_SMTP_USER=
# OVERLEAF_EMAIL_SMTP_PASS=
# OVERLEAF_EMAIL_SMTP_NAME=
OVERLEAF_EMAIL_SMTP_LOGGER=false
OVERLEAF_EMAIL_SMTP_TLS_REJECT_UNAUTH=true
OVERLEAF_EMAIL_SMTP_IGNORE_TLS=false
OVERLEAF_CUSTOM_EMAIL_FOOTER=이 시스템은 x 부서에서 운영합니다

OVERLEAF_PROXY_LEARN=true
NAV_HIDE_POWERED_BY=true

#################
## CE용 LDAP ##
#################

EXTERNAL_AUTH=ldap
OVERLEAF_LDAP_URL=ldap://ldap.example.com:389
OVERLEAF_LDAP_STARTTLS=true
OVERLEAF_LDAP_TLS_OPTS_CA_PATH=/var/lib/overleaf/certs/ldap_ca_cert.pem
OVERLEAF_LDAP_SEARCH_BASE=ou=people,dc=example,dc=com
OVERLEAF_LDAP_SEARCH_FILTER=(|(uid={{username}})(mail={{username}}))
OVERLEAF_LDAP_BIND_DN=cn=ldap_reader,dc=example,dc=com
OVERLEAF_LDAP_BIND_CREDENTIALS=GoodNewsEveryone
OVERLEAF_LDAP_EMAIL_ATT=mail
OVERLEAF_LDAP_FIRST_NAME_ATT=givenName
OVERLEAF_LDAP_LAST_NAME_ATT=sn
# OVERLEAF_LDAP_NAME_ATT=cn
OVERLEAF_LDAP_SEARCH_ATTRIBUTES=["uid", "sn", "givenName", "mail"]

OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN=true

OVERLEAF_LDAP_PLACEHOLDER='사용자 이름 또는 이메일 주소'

OVERLEAF_LDAP_IS_ADMIN_ATT=mail
OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE=admin@example.com

OVERLEAF_LDAP_CONTACTS_FILTER=(gidNumber={{userProperty}})
OVERLEAF_LDAP_CONTACTS_PROPERTY=gidNumber
OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE='*'
```

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/on-premises/ko/configuration/overleaf-toolkit/authentication/ldap-authentication.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
