> 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/saml-authentication.md).

# SAML 인증

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

### 구성

내부적으로 Overleaf SAML 모듈은 [passport-saml](https://github.com/node-saml/passport-saml) 라이브러리를 사용하며, 다음 구성 옵션의 대부분은 다음으로 전달됩니다. `passport-saml`. SAML 구성에 문제가 있다면, 다음의 README를 읽어보는 것이 좋습니다. `passport-saml` 이를 통해 예상되는 구성을 파악할 수 있습니다.

환경 변수 `EXTERNAL_AUTH` SAML 인증 모듈을 활성화하려면 필요합니다. 이 환경 변수는 활성화되는 외부 인증 방법을 지정합니다. 이 변수의 값은 목록입니다. 목록에 `saml` 이 포함되어 있으면 SAML 인증이 활성화됩니다.

예: `EXTERNAL_AUTH=ldap saml`

SAML 인증 방법을 사용할 때 사용자는 Identity Provider(IdP) 인증 사이트로 리디렉션됩니다. IdP가 사용자를 성공적으로 인증하면, Overleaf 사용자 데이터베이스에서 다음을 포함하는 레코드를 확인합니다. `samlIdentifiers` 필드가 다음과 같이 구성된 항목을 찾습니다:

```json
samlIdentifiers: [
  {
    externalUserId: "...",
    providerId: "1",
    userIdAttribute: "..."
  }
]
```

해당 `externalUserId` 은(는) 다음에 지정된 속성의 값과 일치해야 합니다. `userIdAttribute` IdP 서버가 반환한 사용자 프로필에서.

를 참조하세요). 일치하는 레코드가 없으면, 데이터베이스에서 IdP 사용자 프로필의 이메일과 기본 이메일 주소가 일치하는 사용자를 검색합니다:

* 이러한 사용자가 발견되면, `hashedPassword` 필드를 삭제하여 로컬 인증을 비활성화하고, `samlIdentifiers` 필드를 추가합니다.
* 일치하는 사용자를 찾지 못하면, 이메일 주소와 다음을 사용하여 새 사용자가 생성됩니다. `samlIdentifiers` 를 사용하여 새 사용자가 IdP 프로필에서 생성됩니다.

**참고:** 현재는 SAML IdP 하나만 지원됩니다. The `providerId` 필드 `samlIdentifiers` 다음으로 고정되어 있습니다. `'1'`.

#### 환경 변수

* `OVERLEAF_SAML_IDENTITY_SERVICE_NAME`
  * 로그인 페이지에서 사용되는 신원 서비스의 표시 이름(기본값: `SAML IdP로 로그인`).
* `OVERLEAF_SAML_USER_ID_FIELD`
  * 이 속성의 값은 Overleaf에서 외부 사용자 ID로 사용되며, 기본값: `nameID`.
* `OVERLEAF_SAML_EMAIL_FIELD`
  * 사용자 프로필에서 이메일 필드의 이름, 기본값: `nameID`.
* `OVERLEAF_SAML_FIRST_NAME_FIELD`
  * 사용자 프로필에서 firstName 필드의 이름, 기본값: `givenName`.
* `OVERLEAF_SAML_LAST_NAME_FIELD`
  * 사용자 프로필에서 lastName 필드의 이름, 기본값: `lastName`
* `OVERLEAF_SAML_UPDATE_USER_DETAILS_ON_LOGIN`
  * 다음으로 설정하면 `true`, 사용자 `first_name` 그리고 `last_name` 로그인 시 필드를 업데이트하고, 사용자 세부정보 양식을 `/user/settings` 페이지.
* `OVERLEAF_SAML_ENTRYPOINT` **(필수)**
  * SAML identity service의 엔드포인트 URL.
    * 예: `https://idp.example.com/simplesaml/saml2/idp/SSOService.php`
    * Azure 예시: `https://login.microsoftonline.com/8b26b46a-6dd3-45c7-a104-f883f4db1f6b/saml2`
* `OVERLEAF_SAML_ISSUER` **(필수)**
  * 발급자 이름.
* `OVERLEAF_SAML_AUDIENCE`
  * 예상되는 saml 응답 Audience, 기본값: `OVERLEAF_SAML_ISSUER`.
* `OVERLEAF_SAML_IDP_CERT` **(필수)**
  * Identity Provider의 공개 인증서가 들어 있는 파일 경로로, 들어오는 SAML 응답의 서명을 검증하는 데 사용됩니다. Identity Provider에 유효한 서명 인증서가 여러 개 있으면, 인증서 경로들의 JSON 배열일 수 있습니다.
    * 예시(인증서 1개): `/var/lib/overleaf/certs/idp_cert.pem`
    * 예시(인증서 여러 개): `["var/lib/overleaf/certs/idp_cert.pem", "/var/lib/overleaf/certs/idp_cert_old.pem"]`
* `OVERLEAF_SAML_PUBLIC_CERT`
  * 인증 요청에 포함하기 위해 사용되는 공개 서명 인증서가 들어 있는 파일 경로로, IdP가 들어오는 SAML 요청의 서명을 검증할 수 있도록 합니다. 다음을 설정할 때 필요합니다. [메타데이터 엔드포인트](https://github.com/yu-i-i/overleaf-cep/wiki/Extended-CE:-SAML-Authentication#metadata-for-the-identity-provider) 전략이 다음으로 구성될 때 `OVERLEAF_SAML_PRIVATE_KEY`. 인증서 순환을 지원하기 위해 인증서 경로들의 JSON 배열을 제공할 수 있습니다. 인증서 배열을 제공할 때, 배열의 첫 번째 항목은 현재 `OVERLEAF_SAML_PRIVATE_KEY`. 배열의 추가 항목은 다음을 변경하기 전에 향후 인증서를 IdP에 게시하는 데 사용할 수 있습니다. `OVERLEAF_SAML_PRIVATE_KEY`.
* `OVERLEAF_SAML_PRIVATE_KEY`
  * PEM 형식의 개인 키가 들어 있는 파일 경로로, 다음과 일치해야 합니다. `OVERLEAF_SAML_PUBLIC_CERT` passport-saml이 전송하는 인증 요청에 서명하는 데 사용됩니다.
* `OVERLEAF_SAML_DECRYPTION_CERT`
  * 공개 인증서가 들어 있는 파일 경로로, 다음에 사용됩니다. [메타데이터 엔드포인트](https://github.com/yu-i-i/overleaf-cep/wiki/Extended-CE:-SAML-Authentication#metadata-for-the-identity-provider).
* `OVERLEAF_SAML_DECRYPTION_PVK`
  * 다음과 일치하는 개인 키가 들어 있는 파일 경로로, `OVERLEAF_SAML_DECRYPTION_CERT` 수신된 암호화된 assertion을 복호화하려는 시도에 사용됩니다.
* `OVERLEAF_SAML_SIGNATURE_ALGORITHM`
  * 요청 서명에 사용할 서명 알고리즘을 선택적으로 설정할 수 있습니다. 유효한 값은 'sha1'(기본값), 'sha256'(권장), 'sha512'(가장 안전함, IdP가 지원하는지 확인하세요)입니다.
* `OVERLEAF_SAML_ADDITIONAL_PARAMS`
  * 모든 요청에 추가할 추가 쿼리 매개변수의 JSON 사전입니다.
* `OVERLEAF_SAML_ADDITIONAL_AUTHORIZE_PARAMS`
  * 'authorize' 요청에 추가할 추가 쿼리 매개변수의 JSON 사전입니다.
    * 예: `{"some_key": "some_value"}`
* `OVERLEAF_SAML_IDENTIFIER_FORMAT`
  * Identity Provider에 요청할 이름 식별자 형식(기본값: `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress`). 다음을 사용하는 경우 `urn:oasis:names:tc:SAML:2.0:nameid-format:persistent`, 다음을 확인하세요. `OVERLEAF_SAML_EMAIL_FIELD` 환경 변수가 정의되어 있습니다. 다음을 사용하는 경우 `urn:oasis:names:tc:SAML:2.0:nameid-format:transient` 이 필요합니다. 또한 다음을 정의해야 합니다. `OVERLEAF_SAML_ID_FIELD` 환경 변수로, 예를 들어 사용자의 이메일 주소로 설정할 수 있습니다.
* `OVERLEAF_SAML_ACCEPTED_CLOCK_SKEW_MS`
  * OnBefore 및 NotOnOrAfter assertion 조건 유효성 타임스탬프를 확인할 때 클라이언트와 서버 간에 허용되는 오차를 밀리초 단위로 지정합니다. -1로 설정하면 이러한 조건 검사를 완전히 비활성화합니다. 기본값은 0입니다.
* `OVERLEAF_SAML_ATTRIBUTE_CONSUMING_SERVICE_INDEX`
  * `AttributeConsumingServiceIndex` 속성을 AuthnRequest에 추가하여 IdP가 응답에 어떤 속성 집합을 첨부할지 지시하는 데 사용합니다 ([링크](http://blog.aniljohn.com/2014/01/data-minimization-front-channel-saml-attribute-requests.html)).
* `OVERLEAF_SAML_AUTHN_CONTEXT`
  * 인증 컨텍스트 요청을 위한 이름 식별자 형식 값의 JSON 배열. 기본값: `["urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"]`.
* `OVERLEAF_SAML_FORCE_AUTHN`
  * 만약 `true`, 서비스 제공자로부터의 초기 SAML 요청은 IdP가 사용자의 재인증을 강제로 수행해야 함을 지정합니다. 사용자가 유효한 세션을 보유하고 있더라도 마찬가지입니다.
* `OVERLEAF_SAML_DISABLE_REQUESTED_AUTHN_CONTEXT`
  * 만약 `true`, 특정 인증 컨텍스트를 요청하지 않습니다. 예를 들어, 이를 다음으로 설정할 수 있습니다. `true` 암호 없는 로그인과 같은 추가 컨텍스트를 허용하려면 (`urn:oasis:names:tc:SAML:2.0:ac:classes:X509`). 추가 컨텍스트에 대한 지원은 IdP에 따라 다릅니다.
* `OVERLEAF_SAML_AUTHN_REQUEST_BINDING`
  * 다음으로 설정하면 `HTTP-POST`, HTTP POST 바인딩을 통해 IdP에 인증을 요청하며, 그렇지 않으면 기본값은 HTTP-Redirect입니다.
* `OVERLEAF_SAML_VALIDATE_IN_RESPONSE_TO`
  * 만약 `always`, 그러면 InResponseTo가 들어오는 SAML 응답에서 검증됩니다.
  * 만약 `절대`, 그러면 InResponseTo는 검증되지 않습니다(기본값).
  * 만약 `ifPresent`, 그러면 InResponseTo는 들어오는 SAML 응답에 존재할 때만 검증됩니다.
* `OVERLEAF_SAML_WANT_ASSERTIONS_SIGNED` 그리고 `OVERLEAF_SAML_WANT_AUTHN_RESPONSE_SIGNED`
  * 다음으로 설정하면 `true` (기본값), Overleaf는 SAML Assertion, 즉 전체 SAML 인증 응답이 IdP에 의해 서명되기를 기대합니다. 두 옵션이 모두 `false`이면, 적어도 assertion 또는 응답 중 하나는 서명되어야 합니다.
* `OVERLEAF_SAML_REQUEST_ID_EXPIRATION_PERIOD_MS`
  * SAML 요청에 대해 생성된 Request ID가 SAML 응답의 다음 항목에서 보일 때 유효하지 않게 되는 만료 시간을 정의합니다. `InResponseTo` 필드. 기본값: 28800000(8시간).
* `OVERLEAF_SAML_LOGOUT_URL`
  * 로그아웃 요청에 사용할 기본 주소(기본값: `entryPoint`).
    * 예: `https://idp.example.com/simplesaml/saml2/idp/SingleLogoutService.php`
* `OVERLEAF_SAML_ADDITIONAL_LOGOUT_PARAMS`
  * 'logout' 요청에 추가할 추가 쿼리 매개변수의 JSON 사전입니다.
* `OVERLEAF_SAML_IS_ADMIN_FIELD` 그리고 `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE`
  * 두 환경 변수가 모두 설정되면 로그인 과정에서 `user.isAdmin = true` SAML IdP가 반환한 프로필에 다음으로 지정된 속성이 포함되어 있으면 `OVERLEAF_SAML_IS_ADMIN_FIELD` 로 지정된 속성이 포함되어 있고 그 값이 `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE` 와 일치하거나 `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE`, 또는 `user.isAdmin` 이 `false`로 설정됩니다. 이 변수들 중 어느 하나라도 설정되지 않으면 관리자 상태는 `true` Launchpad에서 관리자 사용자 생성 시에만 설정됩니다.

**Identity Provider용 메타데이터**

현재 버전의 Overleaf CE에는 Service Provider 메타데이터를 가져오기 위한 엔드포인트가 포함되어 있습니다: `http://my-overleaf-instance.com/saml/meta`

Identity Provider는 Overleaf 서버를 "Service Provider"로 인식하도록 구성해야 합니다. 이를 수행하는 방법은 SAML 서버 문서를 참조하세요.

아래는 적절한 Service Provider 메타데이터의 예입니다:

<details>

<summary><strong>ol-meta.xml</strong></summary>

```
<?xml version="1.0"?>
<EntityDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
                  xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
                  entityID="MyOverleaf"
                  ID="_b508c83b7dda452f5b269383fb391107116f8f57">
  <SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol" AuthnRequestsSigned="true" WantAssertionsSigned="true">
    <KeyDescriptor use="signing">
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate>MII...
[skipped]
</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </KeyDescriptor>
    <KeyDescriptor use="encryption">
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate>MII...
[skipped]
</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
      <EncryptionMethod Algorithm="http://www.w3.org/2009/xmlenc11#aes256-gcm"/>
      <EncryptionMethod Algorithm="http://www.w3.org/2009/xmlenc11#aes128-gcm"/>
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
    </KeyDescriptor>
    <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
                         Location="https://my-overleaf-instance.com/saml/logout/callback"/>
    <NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</NameIDFormat>
    <AssertionConsumerService index="1"
                              isDefault="true"
                              Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
                              Location="https://my-overleaf-instance.com/saml/login/callback"/>
  </SPSSODescriptor>
</EntityDescriptor>

```

</details>

인증서, `AssertionConsumerService.Location`, `SingleLogoutService.Location` 그리고 `EntityDescriptor.entityID` 를 확인하고 IdP 구성에 적절하게 설정하거나, 메타데이터 파일을 IdP 관리자에게 보내세요.

<details>

<summary><strong>샘플 variables.env 파일(최소)</strong></summary>

<pre><code>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

#################
##     SAML    ##
#################

EXTERNAL_AUTH=saml
OVERLEAF_SAML_ISSUER=MyOverleaf
OVERLEAF_SAML_IDENTITY_SERVICE_NAME='SAML 제공자로 로그인'
OVERLEAF_SAML_EMAIL_FIELD=이메일
OVERLEAF_SAML_FIRST_NAME_FIELD=표시이름
OVERLEAF_SAML_LAST_NAME_FIELD=표시이름
OVERLEAF_SAML_ENTRYPOINT=http://localhost:18000/login/saml/authorize/admin/SAML_Overleaf
<strong>OVERLEAF_SAML_IDP_CERT=/var/lib/overleaf/certs/idp_cert.pem
</strong>OVERLEAF_SAML_SIGNATURE_ALGORITHM=
</code></pre>

</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/saml-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.
