JNDI/LDAP 보유 :LDAP 서비스 프로바이더의 가이드 라인 - xrath.com 에서 번역됨

#

# LDAP 서비스 프로바이더에 대한 JNDI 구현측의 가이드 라인

# Draft 0.4. 2

코멘트의 송부처: jndi@java.sun.com

목차
1. 처음에
2. 적합성
3. 환경 프로퍼티
4. 이름
5. 속성
6. URL
7. Java 객체
8. schema
9. 예외
10. API 매핑
11. 연합
12. SASL
13. 확장 기능 및 컨트롤
14. 이벤트의 통지
15. SSL

## 1. 처음에

이 문서는, LDAP 서비스 프로바이더를 작성하는 개발자, 및 LDAP 와 유사한 기능을 지원하는 프로바이더가 따를 필요가 있는 가이드 라인에 대해 설명합니다. 이러한 가이드 라인에 따르는 것으로, 개발자는, JNDI API 사용자가 지금까지의 조작이나 기술과의 차이를 의식하는 것을 최소한으로 눌러 설정 및 사용 가능한 구현을 작성할 수 있습니다.

이 문서로 설명하는 모든 기능을, LDAP 서비스 프로바이더가 지원해야 하는 것은 아닙니다. 다만, 어느 기능을 지원하는 경우, 그 지원 방법은 이 문서에 설명된 방법에 따를 필요가 있습니다.

## 2. 적합성

LDAP 버젼 3 (LDAPv3)을 지원하는 LDAP 서비스 프로바이더는, 다음에 적합하고 있습니다.

- RFC 2251 및 관련하는 스펙

LDAP 버젼 2 (LDAPv2)를 지원하는 LDAP 서비스 프로바이더는, 다음에 적합하고 있습니다.

- RFC 1777 및 관련하는 스펙

## 3. 환경 프로퍼티

환경 프로퍼티은, JNDI 어플리케이션 사용자가 JNDI 서비스 프로바이더의 동작을 설정 및 변경하기 위한 수단입니다. 이 때문에, 각 서비스 프로바이더는 환경 프로퍼티을 같은 방법으로 해석 및 처리할 필요가 있습니다.

LDAP 서비스 프로바이더에 영향을 미치는 환경 프로퍼티에는 4 개의 타입이 있습니다.

- 표준 JNDI 환경 프로퍼티
- LDAP 고유의 환경 프로퍼티
- 프로바이더 고유의 환경 프로퍼티
- 기능 고유의 환경 프로퍼티

### 3.1 개요

#### 3.1. 1 초기화

초기 문맥을 작성할 때에, 환경 프로퍼티은 생성자 에의 인수로서 건네주는지,JNDI 의 문서로 지정되고 있도록(듯이) 초기화할 수가 있습니다.

특히, 다음의 프로퍼티중 한쪽이 환경 프로퍼티내에서 제공되어 있지 않은 경우, 시스템 프로퍼티, 애플릿 파라미터, 및 프로바이더와 어플리케이션의 resource file의 양쪽 모두로부터, 다음에 나타내는 순서로 검색됩니다.

- `java.naming.factory.control`
- `java.naming.factory.initial`
- `java.naming.factory.object`
- `java.naming.factory.state`
- `java.naming.provider.url`

컨트롤, 객체 및 상태 팩토리 프로퍼티의 경우, 프로퍼티의 여러 차례의 출현이 배치되고 있으면(자), 그 값은 연결되어 단일의 리스트가 됩니다. url 프로퍼티 및 다른 모든 프로퍼티의 경우, 최초로 출현한 것만이 사용됩니다.

문맥의 환경 프로퍼티은,`Context.getEnvironment` 메소드를 사용해 검사할 수 있습니다.

#### 3.1. 2 변경

문맥의 환경 프로퍼티은,`Context.addToEnvironment` 메소드 및 `Context.removeFromEnvironment` 메소드를 사용해 검사할 수 있습니다.

#### 3.1. 3 스코프

`java.naming.provider.url` 및 `java.naming.factory.initial` 프로퍼티을 제외해,`Context.addToEnvironment` 또는 `Context.removeFromEnvironment` 메소드를 사용해 프로퍼티을 변경하면(자), 메소드의 호출처의 문맥 인스턴스가 영향을 받습니다. 예를 들어, 문맥으로 사용되는 새로운 자격을 지정했을 경우는, 그 문맥으로 불려 가는 후속의 메소드로 서버와의 통신을 할 때, 새로운 자격이 사용됩니다. 내부적으로는, 최초로 서버에 새로운 접속이 확립될 때 사용됩니다. 갱신된 환경 프로퍼티은, 갱신이 적용된 문맥 인스턴스로부터 파생한 문맥 인스턴스에 상속됩니다. 다만, 갱신 이전에 생성된 문맥 인스턴스에는 상속되지 않습니다.

#### 3.1. 4 변경 스케줄

환경 프로퍼티으로 변경이 더해졌을 경우는,`Context.addToEnvironment` 또는 `Context.removeFromEnvironment` 메소드의 호출시에, 변경을 확인하거나 유효하게 하거나 할 필요는 없습니다. 그 프로퍼티을 사용하는 조작이 다음에 불려 갔을 때에, 변경이 유효하게 됩니다.

#### 3.1. 5 디폴트

이 스펙으로, 환경 프로퍼티의 디폴트를 정의합니다. 디폴트가 서비스 프로바이더로 결정되는 경우도 있습니다. 문맥이 특정의 환경 프로퍼티을 보관 유지하지 않는 경우, 문맥은 디폴트 값의 환경 프로퍼티을 보관 유지하고 있는것 같이 동작합니다.

문맥의 환경 프로퍼티으로부터 있는 프로퍼티을 삭제하는 경우, 문맥은 그 프로퍼티에는 디폴트의 동작을 할당할 수 있고 있는 것으로 간주합니다. 다만, 프로퍼티의 값으로 해서 디폴트 값를 지정해야 한다고 하는 의미가 아닙니다. 삭제는, 문맥의 환경 프로퍼티에 그 프로퍼티이 존재하지 않는 것에 따라도 나타납니다.

#### 3.1. 6 설정 가능한 값

이 스펙은, 환경 프로퍼티으로 설정 가능한 값을 정의합니다. 환경 프로퍼티에는, 설정치가 고정되고 있는 것과 특정의 구문에 따라 값을 설정하는 것이 있습니다. 설정할 수 없는 값을 지정했을 경우는,`ConfigurationException` ,`IllegalArgumentException` ,`AuthenticationNotSupportedException` 등, 프로퍼티 고유의 예외가 throw 됩니다. 이 경우, 서비스 프로바이더로 설정할 수 있는 값에, 정의된 값 이외의 값을 추가하는 (분)편이 적절한 일이 있습니다. 추가하는 경우는, 그러한 값을 문서에 명기할 필요가 있습니다.

### 3.2 JNDI 프로퍼티

LDAP 서비스 프로바이더는, 다음의 스펙에 따라 JNDI 환경 프로퍼티을 처리할 필요가 있습니다. 예의 `env` 는, 초기 문맥의 작성에 사용되는 환경 프로퍼티을 보관 유지하는 `Hashtable` 의 인스턴스입니다.

`java.naming.batchsize`

> 프로퍼티의 값은, 서버로부터 반환되는 검색 결과의 배치 사이즈를 지정하는 10 진수의 캐릭터 라인입니다.

> 이 프로퍼티은,`Context.list`,`Context.listBindings`, 및 `DirContext.search` 메소드의 블록 동작 및 이러한 메소드가 돌려주는 `NamingEnumeration` 객체에 영향을 미칩니다. 이것은, 반환되는 열거내의 항목수에는 영향을 주지 않습니다. LDAP 프로토콜 레벨로 항목의 배치처리 또는 읽기를 하는 방법인 만큼 영향을 줍니다.

> 값을 제로로 설정하면(자), 그것은, 모든 결과가 수취될 때까지 프로바이더가 블록 하는 것을 의미합니다. 제로보다 큰 정수 n 를 설정하는 것은, 서버로부터 결과 n 를 받을 때까지, 또는 열거가 끝날 때까지, 프로바이더가 블록 하는 것을 의미합니다. 어느 쪽의 경우에도, 생성되는 결과의 수는 보다 작은 값이 됩니다. 어플리케이션이 결과 n 를 읽어낸 후 (`NamingEnumeration.next` 또는 `NamingEnumeration.nextElement` 를 사용해), 프로바이더는 서버로부터 한층 더 n 개의 결과를 읽어내는지, 열거가 끝날 때까지 결과를 읽어냅니다. 어느 쪽의 경우에도, 생성되는 결과의 수는 보다 작은 값이 됩니다.

> 이 프로퍼티이 설정되지 않는 경우, 디폴트 값는 구현 고유의 값이 됩니다.

> 다음에 예를 나타냅니다.

> >     env.put(Context.BATCHSIZE , "24");

> 이것은, 서버로부터 24 엔트리가 읽어내지는지, 열거가 종료할 때까지, 프로바이더가 블록 하는 것을 의미합니다. 어느 쪽의 경우에도, 생성되는 결과의 수는 보다 작은 값이 됩니다.

`java.naming.factory.control`

> 이 프로퍼티의 값은, 컨트롤 팩토리 클래스의 완전 수식된 클래스명을 구두점으로 단락지은 리스트입니다.

> 팩토리는, 응답 컨트롤을 실시하는 클래스의 「네로우 변환」변환을 실시합니다. 이러한 팩토리는, 프로바이더가 생성하는 총칭적인 응답 컨트롤로부터 고유의 응답 컨트롤을 작성합니다.

> 이 프로퍼티의 디폴트 값는 정의되고 있지 않습니다.

> 다음에 예를 나타냅니다.

> >     env.put(LdapContext.CONTROL_FACTORIES ,
> >             "com.sun.jndi.ldap.ctl.ResponseControlFactory");

> 이것은,`ResponseControlFactory` 클래스를, 시행 대상의 컨트롤 팩토리로서 설정합니다.

`java.naming.factory.initial`

> 이 프로퍼티의 값은, LDAP 서비스 프로바이더의 초기 문맥을 작성하는 팩토리 클래스의 완전 수식된 클래스명입니다.

> 이것은, 특정의 LDAP 서비스 프로바이더를 선택하기 위해서 사용합니다. 프로바이더 자신이 사용할 것은 없습니다. 초기 문맥 메소드에의 이름 인수가 URL 인 경우에는, 이 프로퍼티을 설정할 필요는 없습니다.

> 이 프로퍼티의 디폴트 값는 정의되고 있지 않습니다.

> 다음에 예를 나타냅니다.

> > `env.put(Context.INITIAL_CONTEXT_FACTORY ,`
> > `"com.sun.jndi.ldap.LdapCtxFactory");`

> 이것은, Sun 의 LDAP 프로바이더를 선택합니다.

`java.naming.factory.object`

> 이 프로퍼티의 값은, 객체 팩토리 클래스의 완전 수식된 클래스명을 구두점으로 단락지은 리스트입니다.

> 팩토리는, 프로바이더로부터 반환된 LDAP 엔트리로부터 특정의 객체를 작성합니다. 예를 들어, Person 객체 팩토리가, 객체 클래스 person 의 LDAP 엔트리로부터 `Person` 객체를 생성한다고 합니다. 객체 팩토리는, LDAP 속성으로부터 객체를 생성한다고 하는 점으로써,상태 팩토리와는 반대의 동작을 실행합니다.

> 이 프로퍼티의 디폴트 값는 정의되고 있지 않습니다.

> 다음에 예를 나타냅니다.

> >     env.put(Context.OBJECT_FACTORIES ,
> >             "com.sun.jndi.ldap.obj.PersonFromLDAP");

> 이것은,`PersonFromLDAP` 클래스를, 시행 대상의 객체 팩토리로서 설정합니다.

`java.naming.factory.state`

> 이 프로퍼티의 값은, 상태 팩토리 클래스의 완전 수식된 클래스명을 구두점으로 단락지은 리스트입니다.

> 이 팩토리는, 객체 자체로부터 객체 상태 (포함용)를 작성합니다. 예를 들어, Person 상태 팩토리는,`Person` 객체로부터 객체 클래스 person 의 LDAP 엔트리를 생성합니다. 상태 팩토리는, 객체로부터 LDAP 속성을 생성한다고 하는 점으로써,객체 팩토리와는 반대의 동작을 실행합니다.

> 이 프로퍼티의 디폴트 값는 정의되고 있지 않습니다.

> 다음에 예를 나타냅니다.

> >     env.put(Context.STATE_FACTORIES ,
> >             "com.sun.jndi.ldap.obj.PersonToLDAP");

> 이것은,`PersonToLDAP` 클래스를, 시행 대상 상태 팩토리로서 설정합니다.

`java.naming.language`

> 이 프로퍼티의 값은,RFC 1766 에 준거한 캐릭터 라인 언어 태그입니다.

이 프로퍼티은, 특정의 자연 언어의 우선 순위를 나타냅니다. 프로바이더는, 그 LDAP 요구 및 응답을 이 프로퍼티의 값에 따라 조정할 수 있습니다.

이 프로퍼티이 주는 영향은, 구현 고유합니다. 디폴트 값는 정의되고 있지 않습니다.

예를 나타냅니다.

    env.put(Context.LANGUAGE , "ja-JP");

이것은, 일본어가 우선되는 것을 나타냅니다.

`java.naming.provider.url`

> 이 프로퍼티의 값은, LDAP 서버의 호스트명과 포트 번호, 및 사용하는 네이밍 문맥의 루트 식별명을 지정하는 스페이스 단락의 LDAP 또는 LDAPS URL 캐릭터 라인의 리스트입니다. LDAP URL 는 프레인 (즉 보호되어 있지 않다) 접속의 사용을 지정해, LDAPS URL 는 SSL 접속의 사용을 지정합니다. 이 리스트에 복수의 URL 가 포함되는 경우, 프로바이더는 정상적으로 접속을 작성할 수 있을 때까지 각 URL 를 차례로 사용해, 작성 후는 프로퍼티을 성공한 URL 로 설정합니다.

> 디폴트의 호스트명은 `localhost`, 디폴트의 포트는 프레인 접속의 경우는 `389`, SSL 접속의 경우는 `636` 입니다. 디폴트의 루트 식별명은, 공문자열입니다. 이 프로퍼티이 설정되어 있지 않은 경우, 또는 호스트명이나 포트 번호중 한쪽이 생략 되고 있는 경우, 미지정의 정보 대신에 디폴트 값가 사용됩니다. URL 에 호스트명도 포트도 결핍 해, 식별명이 나타나고 있는 경우, 프로바이더는「URL」로 설명했던 대로, 식별명을 사용해 LDAP 서버의 호스트명으로 포트를 판단할 필요가 있습니다. 접속의 확립에 성공했을 경우,`java.naming.provider.url` 프로퍼티을 접속에 성공한 호스트명, 포트, 식별명을 사용해 구축된 URL 로 설정합니다. URL 로 발견된 그 외의 정보를 프로바이더가 어떻게 처리할까에 대해서는,「URL」를 참조해 주세요. 다음에 예를 나타냅니다.

> 예를 나타냅니다.

> >     env.put(Context.PROVIDER_URL , "ldap://secserver:636");

> 이것은, LDAP 서버가 `secserver` 라는 이름의 호스트상의 포트 `636` 으로 가동중인 것을 나타냅니다.

> 주 - `Context.addToEnvironment` 메소드 또는 `Context.removeFromEnvironment` 메소드를 사용해 이 프로퍼티을 변경해도, 문맥에는 영향 없습니다. 이 프로퍼티을 사용하는 것은, 초기 문맥 생성자 뿐입니다.

`java.naming.referral`

> 이 프로퍼티의 값은, 프로바이더가 조회를 처리하는 방법을 지정하는 캐릭터 라인입니다. 다음의 값은, 이 프로퍼티용으로 정의된 것입니다.

`follow`
  자동적으로 모든 조회에 따릅니다.
`throw`
  각 조회에 대해서 `ReferralException` 를 throw 합니다.
`ignore`
  결과에 표시되는 조회를 무시합니다. 미완료의 결과를 나타내기 위해서(때문에) `PartialResultException` 가 throw 됩니다. 또, LDAPv3 서버의 경우, 프로바이더는, 조회가 엔트리내에 표시되면(자), 일반적으로의 속성으로서 조회를 처리하는 것을 요구합니다. 이것은 각 LDAP 요구와 함께, 위기가 아닌 ManageDsaIT (RFC 3296 ) LDAP 컨트롤을 송신하는 것으로써 실현됩니다. 이 LDAP 컨트롤을 지원하지 않는 LDAP 서버는, 단지 조회를 무시해 요구를 일반적으로에 처리합니다.

단일의 조회 엔트리내에서 검출되는 복수의 URL 의 처리 방법에 대해서는,「URL」 를 참조해 주세요.

이 프로퍼티이 설정되지 않는 경우, 디폴트 값는 `ignore` 가 됩니다.

예를 나타냅니다.

    env.put(Context.REFERRAL , "throw");

이것은, LDAP 조작중에 조우한 조회가 `ReferralException` 를 어플리케이션에 throw 하는 것을 나타냅니다.

`java.naming.security.authentication`

> 이 프로퍼티의 값은, 사용하는 프로바이더용의 인증 기구를 지정하는 캐릭터 라인입니다. 다음의 값은, 이 프로퍼티용으로 정의된 것입니다.

`none`
  인증을 사용하지 않습니다 (익명 바인드).
`simple`
  간단한 인증을 사용합니다 (clear text 패스워드).
공백 문자로 단락지어진 1 개(살) 이상의 SASL 기구명의 리스트:
  리스트내에서, 지정한 정책 요건에 준거하는 최초로 이용 가능한 SASL 기구를 사용합니다.

SASL 인증으로 이 프로퍼티을 사용하는 방법에 대해서는,SASL 를 참조해 주세요. LDAP 인증 기구의 상세한 것에 대하여는,RFC 2829 를 참조해 주세요.

이 프로퍼티이 설정되지 않는 경우,java.naming.security.credentials 프로퍼티이 설정되지 않는 이상 그 디폴트 값는 `none` 가 됩니다. java.naming.security.credentials 프로퍼티이 설정되었을 경우의 디폴트 값는 `simple` 입니다. 이 프로퍼티이, 프로바이더가 인식 또는 지원하지 않는 값으로 설정되는 경우,`AuthenticationNotSupportedException` 가 throw 됩니다.

예를 나타냅니다.

    env.put(Context.SECURITY_AUTHENTICATION , "simple");

이것은, LDAP 서버의 인증에 간단한 인증이 사용되는 것을 나타냅니다. 또는, 다음과 같이 기술합니다.

    env.put(Context.SECURITY_AUTHENTICATION , "DIGEST-MD5 CRAM-MD5");

이것은, DIGEST-MD5 인증을 사용하는지, 또는 SASL 기구가 이용 불가능한 경우에는 CRAM-MD5 인증을 사용하는 것을 나타냅니다. 어느쪽이나 이용 불가능한 경우에는,`AuthenticationNotSupportedException` 가 throw 됩니다.

`java.naming.security.credentials`

이 프로퍼티의 값은, 인증 대상의 법칙의 쿠레덴샤르를 지정하는 객체입니다. 그 형식 및 처리는,java.naming.security.authentication 프로퍼티의 값에 따라서 다릅니다.

익명 바인드의 경우, 이 프로퍼티은 무시되어 항상 공백 캐릭터 라인이 쿠레덴샤르로서 사용됩니다. 간단한 인증의 경우, 및 패스워드를 요구하는 SASL 인증의 경우, 이 프로퍼티의 값은 `java.lang.String`,`char[]`, 또는 `byte[]` 로서 제공됩니다. 이 프로퍼티의 값이 `String` 또는 `char[]` 의 경우, LDAPv3 에서는 UTF-8 를 사용해 바이트 배열에 encode 되어 LDAPv2 에서는 ISO-Latin-1 를 사용해 encode 됩니다. 이 프로퍼티의 값이 `byte[]` 의 경우에는, 그대로의 형식에서 사용됩니다.

SASL 인증으로 이 프로퍼티을 사용하는 방법에 대해서는,SASL 를 참조해 주세요.

이 프로퍼티의 디폴트 값는 정의되고 있지 않습니다.

예를 나타냅니다.

    env.put(Context.SECURITY_CREDENTIALS , "secret");

이것은, 쿠레덴샤르를 캐릭터 라인 「secret」로 설정합니다.

`java.naming.security.principal`

> 이 프로퍼티의 값은, 인증 대상의 법칙의 아이덴티티를 지정하는 캐릭터 라인입니다. 그 형식은 인증의 종류에 따라서 다릅니다. 상세한 것에 대하여는 RFC 2829 를 참조해 주세요. 그 값은, SASL 이외의 인증용의 LDAP ASN. 1 BindRequest 의 `name` 컴퍼넌트로서 사용됩니다. SASL 인증의 경우, 이 프로퍼티의 값은, 인증 ID 를 필요로 하는 SASL 기구의 인증 ID 로서 사용됩니다.

> 프로바이더가, 법칙명의 유효성을 검증할 필요는 없습니다. 프로바이더는, 예를 들어, 서버에 의해 검증되는 캐릭터 라인을 건네주는 등의 처리를 실시할 뿐입니다. 식별되는 법칙이 유효한 법칙이 아닌 경우, 프로바이더는 `AuthenticationException` 를 throw 합니다.

> 이 프로퍼티의 디폴트 값는 정의되고 있지 않습니다.

> 예를 나타냅니다.

> >     env.put(Context.SECURITY_PRINCIPAL , "cn=admin, o=sun, c=us");

> 이것은, 법칙명으로서 식별명 「cn=admin, o=sun, c=us」를 설정합니다.

`java.naming.security.protocol`

이 프로퍼티의 값은, 사용하는 프로바이더용의 시큐리티 프로토콜을 지정하는 캐릭터 라인입니다. 다음의 값이, 이 프로퍼티용으로 정의되고 있습니다.

`ssl`
  Secure Sockets Layer 버젼 3.0 을 사용합니다.

이 프로퍼티이 `ssl` 로 설정되어 있는 경우, 프로바이더는 SSL 소켓을 사용할 필요가 있습니다. SSL 소켓을 사용할 수 없는 경우는,`ConfigurationException` 를 throw 할 필요가 있습니다. 상기의 값리스트에 가세해 프로바이더는 다른 시큐리티 프로토콜을 지원할 수도 있습니다. 다만, 그러한 프로바이더 고유의 프로토콜을, 모든 프로바이더가 지원하는 것은 아닙니다. 이 프로퍼티이, 프로바이더가 인식 또는 지원하지 않는 시큐리티 프로토콜로 설정되는 경우,`ConfigurationException` 가 throw 됩니다.

java.naming.ldap.factory.socket 프로퍼티이 설정되어 있는 경우, 그 프로퍼티으로 식별되는 소켓 팩토리는, 이 프로토콜의 설정에 적절한 소켓을 작성할 필요가 있습니다. 예를 들어, 시큐리티 프로토콜이 `ssl` 로 설정되면(자), 소켓 팩토리는 SSL 에 준거한 소켓을 작성할 필요가 있습니다.

이 프로퍼티을 설정하지 않는 경우에는, 시큐리티 프로토콜을 사용하지 않는 것이 디폴트가 됩니다.

LDAP 프로바이더의 개발자는, SSL 접속을 대기하지 않는 포트상의 서버에의 접속에 SSL 를 사용한다면, 소켓이 행업 하는 것을 명기해 둘 필요가 있습니다. 같이 SSL 접속을 대기하는 서버에의 접속에 프레인인 소켓을 사용해도 행업이 일으켜집니다. 이것은, 구현에 따라서는 정정이 실행되는 것은 있지만, 다른 구현의 경우에는 정정을 실행할 필요는 없는, 이라고 하는 프로토콜의 특성입니다. 다만, 프로바이더의 문서내에서, 이 동작을 사용자에게 설명할 필요가 있습니다. SSL 의 사용 방법에 대해서는,SSL 를 참조해 주세요.

예를 나타냅니다.

    env.put(Context.SECURITY_PROTOCOL , "ssl");

이것은, 서버와의 통신에 SSL 준거의 소켓을 사용하는 것을 나타냅니다.

### 3.3 LDAP 고유의 프로퍼티

LDAP 고유의 프로퍼티은, LDAP 서비스 프로바이더 전반에 적용되는 환경 프로퍼티입니다. 이러한 프로퍼티명에는, 접두사 「`java.naming.ldap.` 」(이)가 붙습니다. 다음의 겉(표)는, 지금까지 정의된 LDAP 고유의 프로퍼티을 나타냅니다. 이 리스트에 속한다고 생각되는 프로퍼티이 있으면,jndi@java.sun.com 까지 알려주세요.

`java.naming.ldap.attributes.binary`

이 프로퍼티의 값은, 공백 문자로 단락지어진 속성명의 캐릭터 라인입니다. 이 값을 사용해, 비캐릭터 라인 구문을 보관 유지하는 속성이 지정됩니다. 이것은, 프로바이더의 비캐릭터 라인 속성의 「편입」리스트를 확장합니다 (이하를 참조). 비캐릭터 라인 구문을 보관 유지하는 속성치가,`String` 는 아니고 배열 (`byte[]`)로서 돌려주어집니다.

디폴트는 정의되고 있지 않습니다. 이 프로퍼티이 설정되지 않는 경우, 다음의 속성만이 비캐릭터 라인 구문을 보관 유지한다고 보입니다.

속성 ID | OID | 참조
--- | --- | ---
「`;binary`」옵션 첨부의 모든 속성 ID |  |
`photo` | 0.9. 2342.19200300. 100.1. 7 | RFC 1274
`personalSignature` | 0.9. 2342.19200300. 100.1. 53 | RFC 1274
`audio` | 0.9. 2342.19200300. 100.1. 55 | RFC 1274
`jpegPhoto` | 0.9. 2342.19200300. 100.1. 60 | RFC 2798
`javaSerializedData` | 1.3. 6.1. 4.1. 42.2. 27.4. 1.7 | RFC-2713
`thumbnailPhoto` | 2.16. 128.113533. 1.1400. 1 | NAC LIP Schema
`thumbnailLogo` | 2.16. 128.113533. 1.1400. 2 | NAC LIP Schema
`userPassword` | 2.5. 4.35 | RFC 2256
`userCertificate` | 2.5. 4.36 | RFC-2713
`cACertificate` | 2.5. 4.37 | RFC-2713
`authorityRevocationList` | 2.5. 4.38 | RFC-2713
`certificateRevocationList` | 2.5. 4.39 | RFC-2713
`crossCertificatePair` | 2.5. 4.40 | RFC-2713
`x500UniqueIdentifier` | 2.5. 4.45 | RFC-2713

예를 나타냅니다.

    env.put("java.naming.ldap.attributes.binary",
            "mpegVideo myspecialkey");

이것은, 프로바이더에 대해,`mpegVideo` 속성 및 `myspecialkey` 속성의 값을 `byte[]` 로서 돌려주는 것을 통지합니다.

`java.naming.ldap.control.connect`

이 프로퍼티의 값은,`Control[]` 객체입니다. 이것은, 접속시에 액티브한 접속 요구 컨트롤을 설정합니다. `LdapContext` 를 참조해 주세요.

이 프로퍼티의 디폴트 값는 정의되고 있지 않습니다.

예를 나타냅니다.

    env.put("java.naming.ldap.control.connect",
            new Control[]{ new ManageReferralControl(true) });

이것은, 위기인 ManageDsaIT LDAP 컨트롤을 접속 요구 컨트롤로서 설정합니다.

`java.naming.ldap.deleteRDN`

이 프로퍼티의 값은, 구래의 RDN 가 `Context.rename` 메소드에 의해 삭제될지 어떨지를 지정하는 캐릭터 라인입니다. 다음의 값은, 이 프로퍼티용으로 정의된 것입니다.

`true`
  이름의 변경 조작중에, 구래의 RDN 를 엔트리로부터 삭제합니다.
`false`
  구래의 RDN 를 엔트리의 속성치로서 보관 유지합니다.

이 프로퍼티이 설정되지 않는 경우, 디폴트 값는 `true` 가 됩니다.

예를 나타냅니다.

    env.put("java.naming.ldap.deleteRDN", "false");

이것은, 구래의 RDN 를, 이름의 변경된 엔트리의 속성으로서 보관 유지합니다.

`java.naming.ldap.derefAliases`

> 이 프로퍼티의 값은, 검색 조작중에 별명을 간접 참조하는 방법을 지정하는 캐릭터 라인입니다. 다음의 값은, 이 프로퍼티용으로 정의된 것입니다.

> > `always`
> >   항상 별명을 간접 참조합니다.
> > `never`
> >   별명을 간접 참조하지 않습니다.
> > `finding`
> >   이름 해석중 (즉, 타겟 엔트리의 위치의 검출중)만 별명을 간접 참조합니다.
> > `searching`
> >   이름 해석 완료 후 (즉, 타겟 엔트리의 위치 검출 후)에 별명을 간접 참조합니다.

> 이 프로퍼티이 설정되지 않는 경우, 디폴트 값는 `always` 가 됩니다.

> 예를 나타냅니다.

>     env.put("java.naming.ldap.derefAliases", "searching");

> 이것은, 타겟 엔트리의 검출 후에, 프로바이더가 한 번만 별명을 간접 참조하도록(듯이) 지정합니다.

> 주 - 이 프로퍼티은,`SearchControls` 객체의 간접 참조 링크 플래그와는 무관계합니다.

`java.naming.ldap.factory.socket`

이 프로퍼티의 값은, 소켓 팩토리의 클래스명을 식별하는 캐릭터 라인입니다.

이 프로퍼티은, 디폴트의 소켓 팩토리를 오버라이드(override) 하기 위해서 사용됩니다. 이 프로퍼티으로 지정된 클래스는,`javax.net.SocketFactory` 인터페이스를 구현할 필요가 있습니다. 상세한 것에 대하여는,http://java.sun.com/j2se/1. 4/ja/docs/ja/guide/security/jsse/JSSERefGuide.html 를 참조해 주세요. SSL 의 사용 방법에 대해서는,SSL 를 참조해 주세요.

또,java.naming.security.protocol 프로퍼티이 설정되어 있는 경우, 이 프로퍼티으로 식별되는 소켓 팩토리는, 이 프로토콜의 설정에 적절한 소켓을 작성할 필요가 있습니다. 예를 들어, 시큐리티 프로토콜이 `ssl` 로 설정되면(자), 소켓 팩토리는 SSL 에 준거한 소켓을 작성할 필요가 있습니다.

이 프로퍼티의 디폴트는 정의되고 있지 않습니다.

예를 나타냅니다.

    env.put("java.naming.ldap.factory.socket",
            "javax.net.ssl.SSLSocketFactory");

이것은, 프로바이더의 소켓 팩토리를 `javax.net.ssl.SSLSocketFactory` 로 설정합니다.

`java.naming.ldap.ref.separator`

이 프로퍼티의 값은,`javaReferenceAddress` 속성의 `RefAddr` 객체 (Java 객체를 참조)를 encode 할 때에 사용하는 문자를 포함한 캐릭터 라인입니다.

이 프로퍼티은, 디폴트의 단락 문자가 `RefAddr` 객체의 컴퍼넌트내에 나타나는 경우에, 충돌을 피하기 위해서(때문에) 사용합니다.

이 프로퍼티이 설정되지 않는 경우, 디폴트 값는 「`#`」(해시 문자)이 됩니다.

예를 나타냅니다.

    env.put("java.naming.ldap.ref.separator", ":");

이것은,`RefAddr` 인스턴스의 포함시에 사용하는 단락 문자를 「`:`」(구두점)로 지정합니다.

`java.naming.ldap.referral.limit`

이 프로퍼티의 값은, 조회의 연쇄내에서 계속되는 조회의 최대수를 지정하는 10 진수의 캐릭터 라인입니다. 값이 제로의 경우, 무제한한 것을 나타냅니다.

이 프로퍼티이 설정되지 않는 경우, 디폴트 값는 `10` 이 됩니다.

예를 나타냅니다.

    env.put("java.naming.ldap.referral.limit", "5");

이것은, 조회수를 5 에 제한합니다.

`java.naming.ldap.typesOnly`

이 프로퍼티의 값은, 결과내에 속성 ID 만이 반환되는 (속성치는 생략 된다) 화도인지를 지정하는 캐릭터 라인입니다. 이것은,`SearchResult.getAttributes` 메소드 및 `DirContext.getAttributes` 메소드에 영향을 줍니다. 다음의 값은, 이 프로퍼티용으로 정의된 것입니다.

`true`
  속성 ID 만을 돌려줍니다.
`false`
  속성 ID 와 속성치의 양쪽 모두를 돌려줍니다.

이 프로퍼티이 설정되지 않는 경우, 디폴트 값는 `false` 가 됩니다.

예를 나타냅니다.

    env.put("java.naming.ldap.typesOnly", "true");

이것은, 서버가 속성 ID 를 돌려주어, 속성치는 돌려주지 않는 것을 지정합니다.

`java.naming.ldap.version`

이 프로퍼티의 값은, 프로바이더의 프로토콜 버젼을 지정하는 캐릭터 라인입니다. 다음의 값은, 이 프로퍼티용으로 정의된 것입니다.

`2`
  LDAP 버젼 2 (LDAPv2)를 선택합니다.
`3`
  LDAP 버젼 3 (LDAPv3)을 선택합니다.

이 프로퍼티이 설정되지 않는 경우, 프로바이더는 우선 LDAP v3 를 사용해 바인드를 시도합니다. 서버로부터 프로토콜 에러를 수신하면(자) LDAP v2 를 사용해 처리를 계속합니다. `java.naming.security.authentication` 프로퍼티이 익명 바인드 또는 간단한 인증을 나타내는 경우에만, 이 페이르오바 기구가 사용됩니다.

예를 나타냅니다.

    env.put("java.naming.ldap.version", "2");

이것은, LDAP 프로바이더가 LDAPv2 를 사용해 서버와 통신하는 것을 요구합니다.

### 3.4 기능 고유의 프로퍼티

기능 고유의 프로퍼티은, 프로바이더가 지원하는 특정의 기능인 만큼 적용되는 환경 프로퍼티입니다.

#### 3.4. 1 SASL 프로퍼티

SASL 프로퍼티은 2 개의 그룹으로 나눌 수 있습니다. 최초의 그룹은, JNDI 서비스 프로바이더의 Java SASL API (JSR 28)와의 제휴 방법으로 관련하는 프로퍼티으로 구성됩니다. 이러한 프로퍼티명에는, 접두사 「`java.naming.security.sasl`」가 붙습니다. 2 번째의 그룹은, SASL 기구에 영향을 주는 프로퍼티으로 구성됩니다. 이러한 프로퍼티은 Java SASL API 로 지정되어`「javax.security.sasl」`라고 하는 접두사를 가지고 있습니다. 2 번째의 프로퍼티 그룹의 상세한 것에 대하여는,「SASL」 및「Java SASL API」를 참조해 주세요.

`java.naming.security.sasl.authorizationId`

> 이 프로퍼티의 값은, SASL 기구의 인증 ID 를 지정하는 캐릭터 라인입니다.

> 이 프로퍼티을 설정하지 않으면 SASL 기구에게 건네지는 인증 ID 는 빈 상태(empty)의 캐릭터 라인이 됩니다. SASL (RFC 2222 )의 규정에 따라, 인증 ID 에 빈 상태(empty)의 캐릭터 라인을 사용했을 경우는, 서버는 클라이언트의 인증 쿠레덴샤르로부터 인증 ID 를 꺼냅니다.

> 예를 나타냅니다.

>     env.put("java.naming.security.sasl.authorizationId",
>             "dn:cn=administrators, ou=groups, o=sun, c=us");

> 이것은, 인증의 성공시에 승인 (액세스 컨트롤)용으로 사용되는 식별 정보를 지정합니다.

`java.naming.security.sasl.realm`

> 이 프로퍼티의 값은, DIGEST-MD5 등 몇개의 SASL 기구로 필요한 범위 정보를 지정하는 캐릭터 라인입니다.

> 이 프로퍼티이 설정되어 있지 않은 경우는, 기구 고유의 디폴트로, 인증 교환이 사용되고 있는 동안에 클라이언트와 서버간에서의 협상등이 행해집니다.

> 예를 나타냅니다.

>     env.put("java.naming.security.sasl.realm", "webusers");

> 클라이언트가 인증에 「webusers」의 범위를 사용하도록(듯이) 지정합니다.

`java.naming.security.sasl.callback`

> 이 프로퍼티의 값은,`javax.security.auth.callback.CallbackHandler` 의 인스턴스입니다. 프로바이더가 콜백의 필요한 SASL 기구를 사용하는 경우, SASL 기구는 이 프로퍼티이 제공하는 객체를 사용합니다. 콜백 핸들러는, 인증 ID 를 제공하는 것으로써,`NameCallback` 의 요건을 채웁니다.

> 이 프로퍼티이 설정되지 않는 경우, 프로바이더는 디폴트의 콜백 핸들러를 사용합니다. 디폴트의 콜백 핸들러는,`java.naming.security.principal` 프로퍼티의 값을 사용해 `NameCallback` 의 요건을 채워,`java.naming.security.credentials` 프로퍼티의 값을 사용해 `PasswordCallback` 의 요건을 채웁니다. 또,`java.naming.security.sasl.realm` 프로퍼티의 값을 사용해,`RealmCallback` 및 `RealmChoiceCallback` (Java SASL API 를 참조)의 요건을 채웁니다.

> 예를 나타냅니다.

>     env.put("java.naming.security.sasl.callback",
>             new MyCallbackHandler());

> 이것은, 사용하는 SASL 기구의 콜백 핸들러의 인스턴스를 제공합니다.

`javax.security.sasl.qop`

> 이 프로퍼티의 값은, 보호의 품질 (qop)을 「`,`」그리고 단락지은 리스트로, 클라이언트의 qop 의 설정을 지정하기 위해서 사용됩니다. qop 치는, 다음의 머지않아인가입니다.
> - `auth` - 인증만
> - `auth-int` - 인증에 완전한 보호
> - `auth-conf` - 인증과 완전 및 기밀의 보호
> 리스트의 순서로, 우선 순위가 정해집니다. 이 프로퍼티이 설정되지 않는 경우, 디폴트의 qop 치는 「`auth`」가 됩니다.

`javax.security.sasl.strength`

> 이 프로퍼티의 값은 암호의 강함을 나타내는 값을 「`,`」그리고 단락지은 리스트로, 클라이언트의 설정을 지정하기 위해서 사용됩니다. 강함을 나타내는 값은, 다음의 머지않아인가입니다.
> - `low`
> - `medium`
> - `high`
> 리스트의 순서로, 우선 순위가 정해집니다. 이 프로퍼티이 설정되지 않는 경우, 디폴트의 강함은 「`high, medium, low`」가 됩니다.

> DIGEST-MD5 내에서의 기밀성에 대해서는,`high` 가 `3des` 에,`medium` 가 `rc4` 또는 `des` 에,`low` 가 `rc4-56` 또는 `rc4-40` 에 매핑 됩니다.

`javax.security.sasl.maxbuffer`

> 이 프로퍼티의 값은, 클라이언트가 수신하는 수신 버퍼의 최대 사이즈를 바이트수로 지정한 정수의, 캐릭터 라인 표현입니다. 이 프로퍼티이 설정되지 않는 경우, 디폴트의 사이즈는 SASL 기구로 정의됩니다.

`javax.security.sasl.server.authentication`

> 이 프로퍼티의 값은 「true」또는 「false」의 어느 쪽인지입니다. 각각, 서버가 클라이언트에 대해서 인증할 필요의 유무를 지정합니다. 이 프로퍼티이 설정되지 않는 경우, 디폴트는 「false」입니다.

`javax.security.sasl.policy.forward`

> 이 프로퍼티의 값은 「true」또는 「false」의 어느 쪽인지입니다. 각각, 선택한 SASL 기구가 세션간의 전송 기밀성을 지원할지 어떨지를 지정합니다. 이 프로퍼티이 설정되지 않는 경우, 디폴트는 「false」입니다.

`javax.security.sasl.policy.credentials`

> 이 프로퍼티의 값은 「true」또는 「false」의 어느 쪽인지입니다. 각각, 선택한 SASL 기구가 클라이언트의 쿠레덴샤르를 필요로 할지 어떨지를 지정합니다. 이 프로퍼티이 설정되지 않는 경우, 디폴트는 「false」입니다.

`javax.security.sasl.policy.noplaintext`

> 이 프로퍼티의 값은 「true」또는 「false」의 어느 쪽인지입니다. 각각, 선택한 SASL 기구를, 단순하고 수동적인 공격의 영향을 받기 어렵게 할지 어떨지를 지정합니다. 이 프로퍼티이 설정되지 않는 경우, 디폴트는 「false」입니다.

`javax.security.sasl.policy.noactive`

> 이 프로퍼티의 값은 「true」또는 「false」의 어느 쪽인지입니다. 각각, 선택한 SASL 기구를, 능동적인 (비사전) 공격의 영향을 받기 어렵게 할지 어떨지를 지정합니다. 이 프로퍼티이 설정되지 않는 경우, 디폴트는 「false」입니다.

`javax.security.sasl.policy.nodictionary`

> 이 프로퍼티의 값은 「true」또는 「false」의 어느 쪽인지입니다. 각각, 선택한 SASL 기구를, 사전 공격의 영향을 받기 어렵게 할지 어떨지를 지정합니다. 이 프로퍼티이 설정되지 않는 경우, 디폴트는 「false」입니다.

`javax.security.sasl.policy.noanonymous`

> 이 프로퍼티의 값은 「true」또는 「false」의 어느 쪽인지입니다. 각각, 선택한 SASL 기구가 익명의 로그인을 허가할지 어떨지를 지정합니다. 이 프로퍼티이 설정되지 않는 경우, 디폴트는 「false」입니다.

### 3.5 프로바이더 고유의 프로퍼티

프로바이더 고유의 프로퍼티은, 특정의 프로바이더 구현인 만큼 적용되는 환경 프로퍼티입니다. 이러한 프로퍼티명은, 프로바이더의 구현자에 의해 선택됩니다. 이러한 프로퍼티의 추천 되는 명명 정책는, 구현자의 반대로 한 DNS 도메인명을 프로바이더의 패키지명의 접두사로서 사용해, 그 패키지명을 프로퍼티명의 접두사로서 사용합니다. 예를 들어, Sun 는, 프로바이더 고유의 LDAP 프로퍼티의 접두사를 「`com.sun.jndi.ldap`」라고 합니다.

## 4. 이름

이름은, 프로바이더의 문맥 메소드에 의해, 다음의 규칙에 따라 처리됩니다.

1. 파라미터로서 문맥 메소드에 제공되는 `String` 명은,복합명 구문내에 있습니다.
복합명의 최초의 컴퍼넌트는 LDAP 식별명인데 대해, 다른 컴퍼넌트는 연합에서 사용됩니다.
2. `Name` 인수가 `CompositeName` 객체인 경우, 그 최초의 컴퍼넌트가 LDAP 식별명이다고 보여 나머지의 컴퍼넌트 (존재하는 경우)가 연합에서 사용됩니다.
3. `Name` 인수가 `CompositeName` 객체가 아닌 경우, 그 컴퍼넌트 모든 것이 LDAP 식별명의 구문 분석 된 형식이다고 보입니다. 즉, 각 `Name` 컴퍼넌트는 LDAP 관련의 식별명 (RDN)입니다.
4. 이름은,`Context.getNameParser` 메소드가 돌려주는 이름 퍼서를 사용해 구문 분석 됩니다. 이름 퍼서는, LDAP 식별명을 `String` 객체로서 받아, LDAP 식별명을 `Name` 객체로서 생성합니다.
5. 문맥 조작에 의해 반환되는 이름은, 캐릭터 라인 복합명 또는 캐릭터 라인 URL 입니다.

캐릭터 라인 LDAP 식별명의 구문은,RFC 2253 에 준거하고 있습니다. 예를 나타냅니다.

> - `CN=Steve Kille, O=Isode Limited, C=GB`
> - `OU=Sales+CN=J. Smith, O=Widget Inc., C=US`
> - `CN=L. Eagle, O=Sue\, Grabbit and Runn, C=GB`

LDAP 문맥에 제공되는 이름은, 항상 그 문맥에 대한 상대적인 것입니다. 예를 들어, 「`dc=widget, dc=com`」에 대해서 LDAP 문맥 (`lctx`)이 지정되었을 경우, 그 서브 트리내의 LDAP 엔트리의 명명에는 「`dc=widget, dc=com`」에 대한 상대명을 사용할 필요가 있습니다. 예를 들어, 다음의 호출은, 「`cn=John Smith, dc=widget, dc=com`」엔트리의 속성을 가져옵니다.

`Attributes attrs = lctx.getAttributes("cn=John Smith");`

같이 열거 메소드 (`Context.list`,`Context.listBindings`,`DirContext.search`)의 어느쪽이든을 사용해 문맥을 열거하면(자), 타겟 문맥 (열거 대상의 문맥)에 대한 상대명이 돌려주어집니다. 리페랄이 불려 가면(자), 상대명 대신에, 완전 수식명을 포함한 LDAP 또는 LDAP URL 캐릭터 라인이 돌려주어집니다. SSL 접속을 사용해 열거가 실행되었을 경우는, LDAPS URL 캐릭터 라인이 반환된다). LDAP URL 의 형식은,RFC 2255 로 정의되고 있습니다.

RFC 2255 에 준거하는 LDAP URL 와　LDAPS URL 는, 임의의 문맥 메소드에 제공 가능합니다. 호스트명과 포트 번호는 URL 로부터 추출되어 LDAP 서버에 접속하는 경우에 사용됩니다. URL 의 schema ( 「ldap」또는 「ldaps」)는, 프레인 접속과 SSL 접속의 어느 쪽이 사용될까를 판단하기 위해서(때문에) 사용됩니다. `java.naming.factory.initial` 프로퍼티과 `java.naming.provider.url` 프로퍼티은 무시됩니다. 다음에 예를 나타냅니다.

`DirContext ictx = new InitialDirContext();`
`Attributes attrs = ictx.getAttributes(`
`"ldap://wserver:389/cn=John Smith, dc=widget, dc=com");`

이 코드는, 프레인 접속을 사용해 머신 `wserver`, 포트 `389` 의 LDAP 서버와 통신합니다.

##

## 5. 속성

LDAP 프로바이더는, 모든 속성치가 `String` 또는 `byte[]` 객체로서 입력되는 것으로 간주해, 모든 속성치를 `String` 또는 `byte[]` 객체로서 돌려줍니다. 어느 속성치가 `byte[]` 로 간주해지는지, 및 그 리스트의 확장 방법에 대해서는,`java.naming.ldap.attributes.binary` 환경 프로퍼티을 참조해 주세요.

## 6. URL

LDAP URL 의 구문 형식에 대해서는,RFC 2255 를 참조해 주세요. 이 형식은, LDAP 검색 조작의 지정에 필요한 모든 요소를 포함해, 확장 기능을 지원합니다.

>     ldap://host:port/dn? attributes? scope? filter? extensions

인증 정보는, URL 의 `extensions` 부에서 지정 가능합니다. 이 형식의 상세한 것에 대하여는, RFC 를 참조해 주세요.

LDAP URL 외에, 프로바이더는 표준이 아닙니다만, 넓게 사용되고 있는 LDAPS URL 도 지원합니다. LDAPS URL 는 프레인 (즉 보호되어 있지 않다) 접속 대신에 SSL 접속을 사용합니다. LDAPS URL 의 구문은 LDAP URL 와 닮아 있습니다만, schema는 달라, LDAPS URL 의 디폴트의 포트는 389 는 아니고 636 입니다.

>     ldaps://host:port/dn? attributes? scope? filter? extensions

URL 는, JNDI 의 다양한 곳으로 다음과 같은 역할을 완수합니다.

1. 서비스 프로바이더의 구성
LDAP 서비스 프로바이더를 구성하려면 , 일반적으로,`java.naming.provider.url` 프로퍼티내에서 LDAP URL 또는 LDAPS URL 를 지정합니다. 복수의 URL 를 지정하는 경우는 스페이스에서 단락짓습니다. 이것은, LDAP 서비스 프로바이더가 디렉토리 서버에의 접속 설정을 실시할 때에 사용됩니다. 이 설정과 관계가 있는 것은, URL 의 `host`,`port`, 및 `dn` 부 뿐입니다. URL 외 부분을 지정하면(자),`ConfigurationException` 가 throw 됩니다.
2. 초기 문맥 메소드에의 인수
URL 캐릭터 라인 (scheme_id:rest_of_name 구문)이 `InitialContext` 내의 메소드에 `String` 인수 또는 `Name` 의 최초의 컴퍼넌트로서 건네받으면(자), schema를 처리하는 문맥 팩토리의 검출이 URL 의 schema ID 를 사용해 행해집니다. 아무것도 검출되지 않는 경우, URL 캐릭터 라인은 일반적으로명으로서 처리되어`java.naming.factory.initial` 프로퍼티에 의해 지정된 초기 문맥에게 건네집니다. URL 문맥 팩토리의 검출 방법에 대한 자세한 것은,`java.naming.spi.NamingManager.getURLContext` 메소드를 참조해 주세요. URL 를 이름으로서 지원하는 것이 가능한 것은, 초기 문맥내 뿐인 것에 유의해 주세요.

검색 메소드를 제외해, LDAP URL 또는 LDAPS URL 를 이름으로서 초기 문맥에 건네주는 경우, URL 에는 어떠한 쿼리 ( 「`?` 」) 컴퍼넌트도 포함하지 않습니다. 쿼리컴퍼넌트를 포함하면(자), 서비스 프로바이더에 의해 `InvalidNameException` 가 throw 됩니다. 검색 메소드의 경우, URL 의 쿼리컴퍼넌트는 인수로서 제공된 대응하는 컴퍼넌트 모든 것을 오버라이드(override) 합니다. 예를 들어, 스코프 컴퍼넌트를 포함한 LDAP URL 가 지정되면(자), 그 스코프는 `SearchControls` 인수내에서 건네받는 모든 스코프 설정을 오버라이드(override) 합니다.

3. 조회
LDAP 조회에는, 1 개(살) 이상의 URL 의 리스트가 포함됩니다. LDAP 조회를 (`java.naming.referral` 프로퍼티을 설정하는 것으로써 명시적 또는 암묵적으로) 처리하려면 , 서비스 프로바이더가 이러한 URL 내의 정보를 사용해 참조처의 LDAP 서버에의 접속을 작성할 필요가 있습니다. 단일의 조회내에 복수의 URL 가 존재하는 경우, 이것들은 대체로서 다루어져 그 어느쪽이든가 성공할 때까지 각 URL 가 처리됩니다. 완전한 URL (즉, 모든 쿼리컴퍼넌트를 포함한다)가 사용됩니다.
4. 리스트 및 검색 열거내에 이름으로서 반환된다
반환되는 엔트리명이 타겟 문맥에 대한 상대명이 아닌 (즉, 리스트 또는 검색의 기점이 되는 문맥이다) 경우, 이름은 URL 로서 돌려주어집니다. 자세한 것은,`NameClassPair.isRelative` 를 참조해 주세요.
5. `NamingManager` 또는 `DirectoryManager` 의 `getObjectInstance` 메소드에의 인수
LDAP 이름 공간이 다른 이름 공간하 (DNS 등)에서 연합 하는 경우, 상위의 이름 공간내에 포함되는 정보는 LDAP URL 또는 LDAPS URL 가 됩니다. 이러한 경우, 상위의 이름 공간내에서의 룩 업/리스트/검색 조작은, LDAP 이름 공간에 LDAP URL 또는 LDAPS URL 를 포함한 `Reference` 를 돌려줍니다. 상위의 이름 공간의 서비스 프로바이더는,`Reference` 를 `getObjectInstance` 메소드에 건네주어 LDAP 문맥의 인스턴스를 생성합니다.

항목 (1), (2), (3), 및 (5)의 경우, URL 에 호스트명과 포트 번호가 결핍 해, 식별명이 지정되고 있는 경우, 프로바이더는 인터넷 문서 draft-ietf-ldapext-locate-08.txt 의 설명대로, DNS 를 사용해 LDAP 서비스를 검출하는 알고리즘을 사용할 필요가 있습니다. 프로바이더가 이 알고리즘을 사용하지 않는 경우, 또는 DNS 설정을 사용할 수 없는 경우, 프로바이더는 호스트명에 `localhost` 를 사용해, 포트에는 프레인 접속의 경우는 389 를, SSL 접속의 경우는 636 을 사용할 필요가 있습니다.

## 7. Java 객체

### 7.1 포함

LDAP 프로바이더는, Java 객체의 디렉토리내에의 포함을 지원할 필요가 있습니다. 이것은, 다음의 메소드내에서 구현되고 있습니다.

- `Context.bind()`
- `Context.rebind()`
- `DirContext.bind()`
- `DirContext.rebind()`

프로바이더는, 적어도 다음의 타입의 Java 객체의 포함을 지원할 필요가 있습니다.

1. `Reference` 의 인스턴스
2. `Referenceable` 인터페이스를 구현하는 객체
3. `Serializable` 인터페이스를 구현하는 객체
4. `DirContext` 인터페이스를 구현하는 객체

클라이언트의 의도를 가장 정확하게 파악하기 위해서, 객체가 이것들 4 개의 카테고리에 속할지 어떨지를 리스트 된 순서로 체크할 필요가 있습니다. 예를 들어,`Reference` 는 `Serializable` 입니다. 이 때문에,`Serializable` 검사를 최초로 실행하면(자), 어느 `Reference` 도 참조 형식에서 포함될 것은 없습니다 (즉, 모두 직렬화 됩니다).

`Reference`,`Referenceable`, 및 `Serializable` 객체는,RFC 2713 에 따라 포함할 필요가 있습니다. `DirContext` 객체는, 그 속성을 포함하는 것으로써 포함됩니다.

`RefAddr` 의 참조 리스트를 `javaReferenceAddress` 속성에 포함할 때에, 주소의 위치, 형태, 및 내용의 단락 문자는, 환경 프로퍼티 java.naming.ldap.ref.separator 를 사용해 제어합니다. 이 환경 프로퍼티이 지정되지 않는 경우, 단락 문자로서 해시 문자 「#」이 사용됩니다.

객체를 디렉토리내에 포함할 때, 프로바이더는 `DirectoryManager.getStateToBind` 메소드를 사용합니다. 이것에 의해, 어떤 형태의 객체에서도 상기의 4 개의 카테고리의 1 개로 변환해, 디렉토리내에 포함할 수 있게 됩니다.

### 7.2 read

객체는, 다음의 오퍼레이션을 사용해 디렉토리로부터의 read를 실행합니다.

- `Context.lookup()`
- `Context.lookupLink()`
- `Binding.getObject()`

프로바이더는, 디렉토리로부터의 엔트리의 read시에, LDAP 속성, 및 RFC 2713 에 정의된 속성 (엔트리를 관련지을 수 있었던 Java 객체를 보관 유지하는 경우)을 가져옵니다. 엔트리에 Java 객체에 관련한 속성이 포함되는 경우, 프로바이더는 이러한 속성을 사용해 객체를 재작성합니다. 그 이외의 경우, 프로바이더는 엔트리의 속성을 포함한 `DirContext` 의 인스턴스를 돌려줄 필요가 있습니다. `DirContext` 와 Java 객체의 어느 쪽의 경우에도, 프로바이더는 `DirectoryManager.getObjectInstance()` 를 호출해, 결과를 호출해 측에 돌려줍니다.

## 8. schema

JNDI 는, schema 트리의 구조나 내용, schema 트리의 내용을 변경하는 권한등의 schema 관련의 상세를 지정하지 않습니다. schema 트리에의 변경에 의해 받는 영향은, 기반이 되는 디렉토리에 의존합니다. JNDI 가 지정하는 것은, 루트 schema 문맥 (`DirContext.getSchema()` 에 의해 반환된다)에 다음의 바인딩이 포함되는 것 뿐입니다.

- AttributeDefinition
- ClassDefinition
- SyntaxDefinition

이 문서에서는, LDAP 베이스의 schema로부터 파생하는 schema 트리의 구조 및 내용의 스펙을 정합니다. 또, schema 트리의 배치 방법, 및 이 schema 트리의 다양한 부분의 엔트리와의 관련짓고를 기대할 수 있는 필수 및 옵션의 속성에 대해 설명합니다.

schema 트리의 내용을 변경하는 권한은, 디렉토리 관리자에 의해 결정됩니다. schema 트리가 변경되면(자), 변경은 디렉토리 서버에 포함된 schema에 적용됩니다.

### 8.1 schema 트리의 구조

전술의 루트 schema 문맥내의 3 개의 바인딩에 가세해 루트 schema 문맥에 다음의 4 개의 바인딩을 포함할 수도 있습니다.

- MatchingRule
- ExtensionDefinition
- ControlDefinition
- SASLDefinition

바인딩명 | 바인딩의 설명
--- | ---
AttributeDefinition | 속성 정의 트리의 루트:이름 또는 OID 로 식별되는 속성을 가지는, 플랫인 이름 공간
ClassDefinition | 「objectclass」정의 트리의 루트:이름 또는 OID 로 식별되는 객체 클래스를 가지는, 플랫인 이름 공간
SyntaxDefinition | 구문 정의 트리의 루트 :OID 로 식별되는 구문을 가지는, 플랫인 이름 공간
MatchingRule | 일치 규칙 트리의 루트:이름 또는 OID 로 식별되는 일치 규칙을 가지는, 플랫인 이름 공간
ExtensionDefinition | 확장 기능 트리의 루트 :OID 로 식별되는 확장 기능을 가지는, 플랫인 이름 공간
ControlDefinition | 컨트롤 트리의 루트 :OID 로 식별되는 컨트롤을 가지는, 플랫인 이름 공간
SASLMechanism | SASL 트리의 루트:캐릭터 라인명으로 식별되는 SASL 인증 기구를 가지는, 플랫인 이름 공간

기반이 되는 디렉토리가 이런 종류의 schema 정보를 공개하지 않는 경우, 또는 서비스 프로바이더가 그 취득을 지원하지 않는 경우에는, 이러한 바인딩의 언젠가 또는 모든 것이 존재하지 않는 것이 있을 수 있습니다. 다만, 이러한 이름이 루트 schema 문맥내에 존재하는 경우에는, 상기의 겉(표)에 나타낸 바인딩을 보관 유지할 필요가 있습니다.

속성명 및 이러한 엔트리의 속성의 값은, 대문자 소문자로 구별되지 않습니다.

### 8.2 속성 정의

이름 「AttributeDefinition」는, schema내의 속성 정의를 나타내는 `DirContext` 객체를 포함한 문맥에 바인드 됩니다. 예를 들어, 디렉토리가 「commonName」속성을 지원하는 경우, 「AttributeDefinition」문맥은,`DirContext` 객체에 바인드 되는 이름 「commonName」라는 바인드를 보관 유지합니다.

「AttributeDefinition」문맥내의 각 객체에는, 다음과 같이 필수 속성과 옵션 속성이 있습니다.

속성 식별자 | 속성치의 설명
--- | ---
NUMERICOID (필수) | 일의의 식별자 (OID)
NAME | 속성의 이름
DESC | 속성의 설명
OBSOLETE | 현재 사용되어 있지 않은 경우는 「true」, 그 외의 경우는 「false」또는 값없음
SUP | 이 속성형의 파생원인, 상위의 속성형의 이름
EQUALITY | 등가의 일치가 허가되는 경우에는 일치 규칙의 이름 또는 OID, 등가의 일치가 허가되지 않는 경우에는 값없음
ORDERING | 순서 붙이고 된 일치가 허가되는 경우에는 일치 규칙의 이름 또는 OID, 허가되지 않는 경우에는 값없음
SUBSTRING | 부분 캐릭터 라인의 일치가 허가되는 경우에는 일치 규칙의 이름 또는 OID, 허가되지 않는 경우에는 값없음
SYNTAX | 이 형태의 값의 구문의 수치 OID
SINGLE-VALUE | 속성이 복수의 값을 보관 유지하지 않는 경우는 「true」, 그 외의 경우는 「false」또는 값없음
COLLECTIVE | 속성이 취득 가능한 경우는 「true」, 그 외의 경우는 「false」또는 값없음
NO-USER-MODIFICATION | 사용자에 의한 변경이 불가능한 경우는 「true」, 그 외의 경우는 값없음
USAGE | 속성의 사용 방법의 설명

이러한 속성은, 「AttributeTypeDescription」에 대해서 RFC 2252 로 정의된 이름과 일대일로 대응합니다. 속성치 모든 것은,`java.lang.String` 클래스에 의해 표현됩니다.

예를 들어, 다음의 코드를 사용해 「cn」속성을 나타내는 객체를 취득할 수 있습니다.

>     DirContext schema = ctx.getSchema(""); // get schema tree
>     DirContext cnSchema = schema.lookup("AttributeDefinition/cn");

그 후, 「cnSchema」`DirContext` 객체의 속성을 취득하면(자), 다음과 같이 표시됩니다.

>     NUMERICOID      2.5. 4.3
>     NAME            cn
>     SYNTAX          1.3. 6.1. 4.1. 1466.115. 121.1. 15
>     DESC            Standard Attribute, alias for commonName

「cn」속성을 벌써 보관 유지하고 있는 경우에는, 「cnSchema」를 취득하는 이제(벌써) 1 개의 방법이 있습니다. 다음의 코드로, 그방법을 나타냅니다.

>     Attributes attrs = ctx.getAttributes("cn=John", new String[]{"cn"});
>     Attribute cnAttr = attrs.get("cn");
>     DirContext cnSchema = cnAttr.getAttributeDefinition();

### 8.3 객체 클래스 정의

이름 「ClassDefinition」는, schema내의 객체 클래스 정의를 나타내는 `DirContext` 객체를 포함한 문맥에 바인드 됩니다. 예를 들어, 디렉토리가 「country」객체 클래스를 지원하는 경우, 「ClassDefinition」문맥은,`DirContext` 객체에 바인드 되는 이름 「country」에의 바인드를 보관 유지합니다.

「ClassDefinition」문맥내의 각 객체에는, 다음과 같이 필수 속성과 옵션 속성이 있습니다.

속성 식별자 | 속성치의 설명
--- | ---
NUMERICOID (필수) | 일의의 식별자 (OID)
NAME | 객체 클래스의 이름
DESC | 객체 클래스의 설명
OBSOLETE | 현재 사용되어 있지 않은 경우는 「true」, 그 외의 경우는 「false」또는 값없음
SUP | 이 객체 클래스의 파생원인, 상위의 객체 클래스의 이름
ABSTRACT | 객체 클래스가 추상 클래스인 경우는 「true」, 그 외의 경우는 「false」또는 값없음
STRUCTURAL | 객체 클래스가 구조화 클래스인 경우는 「true」, 그 외의 경우는 「false」또는 값없음
AUXILIARY | 객체 클래스가 보조 클래스인 경우는 「true」, 그 외의 경우는 「false」또는 값없음
MUST | 존재할 필요가 있는 속성의 형명의 리스트
MAY | 존재할 가능성이 있는 속성의 형명의 리스트

이러한 속성은, 「ObjectClassDescription」에 대해서 RFC 2252 로 정의된 이름과 일대일로 대응합니다. 속성치 모든 것은,`java.lang.String` 클래스에 의해 표현됩니다.

예를 들어, 다음의 코드를 사용해 「country」객체 클래스를 나타내는 객체를 취득할 수 있습니다.

>     DirContext schema = ctx.getSchema(""); // get schema tree
>     DirContext countrySchema = schema.lookup("ClassDefinition/country");

그 후, 「countrySchema」 `DirContext` 객체의 속성을 취득하면(자), 다음과 같이 표시됩니다.

>     NUMERICOID      2.5. 6.2
>     NAME            country
>     MAY             aci, searchguide, description
>     MUST            objectclass, c
>     DESC            Standard ObjectClass
>     SUP             top

「country」객체를 이미 보관 유지하고 있는 경우, 「countrySchema」를 취득하는 이제(벌써) 1 개의 방법이 있습니다. 다음의 코드로, 그방법을 나타냅니다.

>     // Read object from directory
>     DirContext countryObj = (DirContext) ctx.lookup("c=us", new String[]{"country"});

>     // Get all of object's object class definitions
>     DirContext objClasses = countryAttr.getSchemaClassDefinition();

>     // Pick out "country" object class in particular
>     DirContext countryClass = (DirContext) objClasses.lookup("country");

주 - JNDI 1.1 으로 규정된 `getSchemaClassDefinition()` 의 스펙에 의하면, 서비스 프로바이더가 객체의 객체 클래스 정의의 어느쪽이든을 돌려주게 되어 있습니다. 객체는 일반적으로 복수의 객체 클래스를 보관 유지하는 것, 및 어플리케이션은 실행중의 동작에 근거해, 이러한 객체 클래스의 어느 쪽인가에 관한 지식을 필요로 하기 (위해)때문에, 이 스펙은 부적절합니다. 위의 예에서는, 객체 클래스 정의를 모두 포함한 문맥이 돌려주어집니다.

### 8.4 구문 정의

이름 「SyntaxDefinition」는, schema내의 구문 정의를 나타내는 `DirContext` 객체를 포함한 문맥에 바인드 됩니다. 예를 들어, 디렉토리가 「1.3. 6.1. 4.1. 1466.115. 121.1. 15」구문 (디렉토리 캐릭터 라인) 구문을 지원하는 경우, 「SyntaxDefinition」문맥은,`DirContext` 객체에 바인드 된 이름 「1.3. 6.1. 4.1. 1466.115. 121.1. 15」에의 바인딩을 보관 유지합니다.

「SyntaxDefinition」문맥내의 각 객체에는, 다음과 같이 필수 속성과 옵션 속성이 있습니다.

속성 식별자 | 속성치의 설명
--- | ---
NUMERICOID (필수) | 일의의 식별자 (OID)
DESC | 구문의 설명

이러한 속성은, 「SyntaxDescription」에 대해서 RFC 2252 로 정의된 이름과 일대일로 대응합니다. 속성치 모든 것은,`java.lang.String` 클래스에 의해 표현됩니다.

예를 들어, 다음의 코드를 사용해, 「1.3. 6.1. 4.1. 1466.115. 121.1. 15」구문을 나타내는 객체를 취득할 수 있습니다.

>     DirContext schema = ctx.getSchema(""); // get schema tree
>     DirContext dirStringSchema =
>         schema.lookup("SyntaxDefinition/1. 3.6. 1.4. 1.1466. 115.121. 1.15");

그 후, 「dirStringSchema」 `DirContext` 객체의 속성을 취득하면(자), 다음과 같이 표시됩니다.

>     NUMERICOID      1.3. 6.1. 4.1. 1466.115. 121.1. 15
>     DESC            Directory String

그 구문을 보관 유지하는 속성 ( 「country」속성등)을 이미 취득하고 있다면, 「dirStringSchema」를 취득하는 등가인 방법이 존재합니다. 다음의 코드로, 그방법을 나타냅니다.

>     Attributes attrs = ctx.getAttributes("c=us", new String[]{"country"});
>     Attribute countryAttr = attrs.get("country");
>     DirContext dirStringSchema = countryAttr.getSyntaxAttributeDefinition();

### 8.5 일치 규칙

이름 「MatchingRule」는, schema내의 일치 규칙을 나타내는 `DirContext` 객체를 포함한 문맥에 바인드 됩니다. 「일치 규칙」은, 속성치의 비교로 사용하는 알고리즘을 일의에 식별합니다. 예를 들어, 디렉토리는 캐릭터 라인의 발음시의 들리는 방법에 근거하는 일치 규칙을 지원해, 그것을 일치 규칙 「soundAlikeMatch」로서 정의하는 경우가 있습니다. 그 후, 「MatchingRule」문맥은,`DirContext` 객체에 바인드 되는 이름 「soundAlikeMatch」에의 바인딩을 보관 유지합니다.

일치 규칙이 확장 가능한 규칙의 경우, 「APPLIES」속성도 포함하고 있을 필요가 있습니다. 이 속성은, 이 확장 가능한 일치 규칙에 적용 가능한 속성을 일람표 가리킵니다.

「MatchingRule」문맥내의 각 객체에는, 다음과 같이 필수 속성과 옵션 속성이 있습니다.

속성 식별자 | 속성치의 설명
--- | ---
NUMERICOID (필수) | 일의의 식별자 (OID)
NAME | 일치 규칙의 이름
DESC | 일치 규칙의 설명
OBSOLETE | 현재 사용되어 있지 않은 경우는 「true」, 그 외의 경우는 「false」또는 값없음
SYNTAX | 이 규칙의 적용 대상의 구문의 수치 OID
APPLIES | 이 확장 가능한 일치 규칙의 적용 대상 속성의 형명의 리스트

이러한 속성은, 「MatchingRuleDescription」 및 「MatchingRuleUseDescription」에 대해서 RFC2252 로 정의된 이름과 일대일로 대응합니다. 속성치 모든 것은,`java.lang.String` 클래스에 의해 표현됩니다.

예를 들어, 다음의 코드를 사용해 「soundAlikeMatch」구문을 나타내는 객체를 취득할 수 있습니다.

>     DirContext schema = ctx.getSchema(""); // get schema tree
>     DirContext soundMatchSchema =
>         schema.lookup("MatchingRule/soundAlikeMatch");

그 후, 「soundMatchSchema」 `DirContext` 객체의 속성을 취득하면(자), 다음과 같이 표시됩니다.

>     NUMERICOID      1.2. 3.4. 5
>     NAME            soundAlikeMatch
>     SYNTAX          1.3. 6.1. 4.1. 1466.115. 121.1. 15 (for directory string)
>     APPLIES         2.5. 4.41, 2.5. 4.15
>     DESC            Home-grown Phonetic match

### 8.6 확장 기능 정의

이름 「ExtensionDefinition」는, 서버에 의해 지원되는 확장 기능을 나타내는 `DirContext` 객체를 포함한 문맥에 바인드 됩니다. 예를 들어, 어느 디렉토리가「Start TLS」확장 기능 ( 「1.3. 6.1. 4.1. 1466.20037」)을 지원한다고 합니다. 그렇다면, 「ExtensionDefinition」문맥은,`DirContext` 객체에 바인드 되는 이름 「1.3. 6.1. 4.1. 1466.20037」에의 바인딩을 보관 유지합니다.

「ExtensionDefinition」문맥내의 각 객체에는, 다음과 같이 필수 속성과 옵션 속성이 있습니다.

속성 식별자 | 속성치의 설명
--- | ---
NUMERICOID (필수) | 일의의 식별자 (OID)
DESC | 확장 기능의 설명

속성치 모든 것은,`java.lang.String` 클래스에 의해 표현됩니다.

예를 들어, 다음의 코드를 사용해, Start TLS 확장 기능 ( 「1.3. 6.1. 4.1. 1466.20037」)을 나타내는 객체를 취득할 수 있습니다.

>     DirContext schema = ctx.getSchema(""); // get schema tree
>     DirContext startTLSSchema =
>         schema.lookup("ExtensionDefinition/1. 3.6. 1.4. 1.1466. 20037");

그 후, 「startTLSSchema」 `DirContext` 객체의 속성을 취득하면(자), 다음과 같이 표시됩니다.

>     NUMERICOID      1.3. 6.1. 4.1. 1466.20037
>     DESC            Start TLS (see RFC 2830)

### 8.7 컨트롤 정의

이름 「ControlDefinition」는, 서버가 지원하는 컨트롤을 나타내는 `DirContext` 객체를 포함한 문맥에 바인드 됩니다. 예를 들어, 디렉토리는, 서버가 돌려주는 검색 결과를 소트 하도록(듯이) 서버에 의뢰하기 위한 컨트롤을 지원하는 경우가 있습니다.

「ControlDefinition」문맥내의 각 객체에는, 다음과 같이 필수 속성과 옵션 속성이 있습니다.

속성 식별자 | 속성치의 설명
--- | ---
NUMERICOID (필수) | 일의의 식별자 (캐릭터 라인)
DESC | 컨트롤의 설명

속성치 모든 것은,`java.lang.String` 클래스에 의해 표현됩니다.

예를 들어, 다음의 코드를 사용해,서버측 소트 컨트롤 ( 「1.2. 840.113556. 1.4. 473」)을 나타내는 객체를 취득할 수 있습니다.

>     DirContext schema = ctx.getSchema(""); // get schema tree
>     DirContext svrSortSchema =
>         schema.lookup("ControlDefinition/1. 2.840. 113556.1. 4.473");

그 후, 「svrSortSchema」 `DirContext` 객체의 속성을 취득하면(자), 다음과 같이 표시됩니다.

>     NUMERICOID      1.2. 840.113556. 1.4. 473
>     DESC            server-side sorting of search results

### 8.8 SASL 기구

이름 「SASLMechanism」는, 서버가 지원하는 SASL 인증 기구를 나타내는 `DirContext` 객체를 포함한 문맥에 바인드 됩니다. 예를 들어, 디렉토리는, 저위층에 의해 교환되는 시큐리티의 쿠레덴샤르를 서버가 이용하는 것을 요구하는 EXTERNAL SASL 기구 (RFC 2222 )를 지원하는 경우가 있습니다.

「SASLMechanism」문맥내의 각 객체에는, 다음과 같이 필수 속성과 옵션 속성이 있습니다.

속성 식별자 | 속성치의 설명
--- | ---
NAME (필수) | SASL 기구의 이름
DESC | SASL 기구의 설명

속성치 모든 것은,`java.lang.String` 클래스에 의해 표현됩니다.

예를 들어, 다음의 코드를 사용해 EXTERNAL SASL 기구를 나타내는 객체를 취득할 수 있습니다.

>     DirContext schema = ctx.getSchema(""); // get schema tree
>     DirContext saslExternalSchema =
>         schema.lookup("SASLMechanism/EXTERNAL");

그 후, 「saslExternalSchema」 `DirContext` 객체의 속성을 취득하면(자), 다음과 같이 표시됩니다.

> `NAME EXTERNAL`
> `DESC EXTERNAL SASL mechanism (RFC 2222)`

## 9. 예외

LDAP 프로바이더를 구축할 때, LDAP 에러 코드 (RFC 2251 을 참조)를 JNDI 예외로 번역할 필요가 있습니다. 번역의 실행시에는, 다음의 겉(표)를 사용해 주세요. 또, 에러에 관한 가능한 한 많은 정보를, 예외의 상세한 메세지, 「근본 원인」예외, 해결 지음의 이름 및 나머지의 이름내에 encode 해 넣어 주세요. 해결 지음의 이름과 해결 지음의 객체는, 상호의 설정치에 대응하고 있지 않으면 안됩니다.

LDAP 에러 코드 | 예외 또는 액션
--- | ---
success (0) | 성공을 보고한다
operationsError (1) | `NamingException`
protocolError (2) | `CommunicationException`
timeLimitExceeded (3) | `TimeLimitExceededException`
sizeLimitExceeded (4) | `SizeLimitExceededException`
compareFalse (5) | `DirContext.search()` 에 의해 사용되어 예외를 생성하지 않는다
compareTrue (6) | `DirContext.search()` 에 의해 사용되어 예외를 생성하지 않는다
authMethodNotSupported (7) | `AuthenticationNotSupportedException`
strongAuthRequired (8) | `AuthenticationNotSupportedException`
partialResults (9) | `java.naming.referral` 가 `ignore` 로 설정되는 경우, 또는 에러 내용에 조회가 포함되지 않는 경우,`PartialResultException` 를 throw 한다. 그 이외의 경우, 그 내용을 사용해 조회를 구축한다
referral (10) | `java.naming.referral` 가 `ignore` 로 설정되었을 경우,`PartialResultException` 가 throw 된다. 이것이 `throw` 로 설정되었을 경우에는,`ReferralException` 를 throw 된다. 이것이,`follow` 로 설정되었을 경우, 프로바이더는 조회에 따른다. 조회에 따라 처리를 실행중에 `java.naming.ldap.referral.limit` 의 값이 초과하면(자),`LimitExceededException` 가 throw 된다
adminLimitExceeded (11) | `LimitExceededException`
unavailableCriticalExtension (12) | `OperationNotSupportedException`
confidentialityRequired (13) | `AuthenticationNotSupportedException`
saslBindInProgress (14) | 멀티 스테이지의 SASL 인증중에, LDAP 프로바이더에 의해 내부에서 사용된다
noSuchAttribute (16) | `NoSuchAttributeException`
undefinedAttributeType (17) | `InvalidAttributeIdentifierException`
inappropriateMatching (18) | `InvalidSearchFilterException`
constraintViolation (19) | `InvalidAttributeValueException`
attributeOrValueExists (20) | `AttributeInUseException`
invalidAttributeSyntax (21) | `InvalidAttributeValueException`
noSuchObject (32) | `NameNotFoundException`
aliasProblem (33) | `NamingException`
invalidDNSyntax (34) | `InvalidNameException`
isLeaf (35) | 프로바이더가 사용. 일반적으로 예외를 생성하지 않는다
aliasDereferencingProblem (36) | `NamingException`
inappropriateAuthentication (48) | `AuthenticationNotSupportedException`
invalidCredentials (49) | `AuthenticationException`
insufficientAccessRights (50) | `NoPermissionException`
busy (51) | `ServiceUnavailableException`
unavailable (52) | `ServiceUnavailableException`
unwillingToPerform (53) | `OperationNotSupportedException`
loopDetect (54) | `NamingException`
namingViolation (64) | `InvalidNameException`
objectClassViolation (65) | `SchemaViolationException`
notAllowedOnNonLeaf (66) | `ContextNotEmptyException`
notAllowedOnRDN (67) | `SchemaViolationException`
entryAlreadyExists (68) | `NameAlreadyBoundException`
objectClassModsProhibited (69) | `SchemaViolationException`
affectsMultipleDSAs (71) | `NamingException`
other (80) | `NamingException`

## 10. API 매핑

JNDI API 문맥 인터페이스의 메소드는, 다음과 같이 LDAP 조작에 맵 됩니다.
`EventContext.addNamingListener`
`EventDirContext.addNamingListener`

> LDAP 엔트리의 지정된 서브 트리내에서 발생하는 명명 이벤트를 받는 청취자를 등록합니다. LDAP 서버는, LDAP 조작 응답에 접속된 LDAP 컨트롤, 또는 LDAP 임의 통지에 의해, 클라이언트에 대해서 이벤트를 통지합니다. 이런 종류의 응답은 LDAP 프로바이더에 의해 처리되고 나서,`NamingEvent` 또는 `UnsolicitedNotificationEvent` 의 형태로 어플리케이션에게 건네집니다.

`Context.addToEnvironment`

> 문맥의 환경 프로퍼티을 갱신합니다. 복수의 문맥이 같은 환경 프로퍼티세트를 공유하는 경우, 프로바이더는 목적의 문맥의 환경만을 수정하도록(듯이) 주의할 필요가 있습니다. 환경 프로퍼티을 변경하면(자), 문맥이 사용하고 있는 기존의 접속도 변경해야 하는 경우가 있습니다.

프로퍼티치에 null 를 지정해도, 프로퍼티을 삭제하는 것과 같은 결과를 얻을 수 있습니다.

어떤 환경 프로퍼티의 경우에서도, 새로운 프로퍼티은, 비록 그것이 문맥에 영향을 주지 않는 경우에서도, 기록됩니다. 자세한 것은,「환경 프로퍼티」을 참조해 주세요.

`Context.bind`
`DirContext.bind`

LDAP 추가 조작을 실행해, 디렉토리내에 엔트리를 신규 작성합니다. `DirContext.bind` 메소드에 비 null 속성 세트도 지정되는 경우, 이 메소드는 바인드 대상의 객체로서 null 를 받을 수가 있습니다. 그렇게 하지 않으면 메소드에 충분한 정보 (즉, 객체나 속성)가 지정되지 않는 경우에, 엔트리는 추가되지 않습니다. 인수내에 객체가 지정되고 있는 경우, 객체는 속성에 변환되어 제공된 모든 속성과 함께 엔트리내에 포함됩니다. 자세한 것은,「Java 객체」를 참조해 주세요. 프로바이더는,`DirectoryManager.getStateToBind` 메소드를 사용해, 입력 객체를 포함 가능한 형식으로 변환할 필요가 있습니다.

프로바이더는, 디렉토리내의 객체의 바인딩을 지원하지 않는 경우,`OperationNotSupportedException` 를 throw 할 필요가 있습니다. 그렇게 하지 않으면 프로바이더가 객체의 바인딩을 지원해도 제공된 객체를 지원하지 않는 경우, 프로바이더는 `IllegalArgumentException` 를 throw 할 필요가 있습니다.

`Context.close`

문맥에 할당할 수 있었던 자원을 해제합니다. 예를 들어, 이 문맥에 사용되는 접속이 다른 문맥에 공유되어 있지 않은 경우는, 프로바이더는 미처리의 요구를 파기해 서버에의 네트워크 접속을 닫을 수가 있습니다. 어느 자원이 해제될까는, 엄밀하게는 구현에 의존하고 있습니다.

`Context.composeName`

친문맥이 동일한 LDAP 이름 공간에 유래하고 있는 경우,`Context.getNameParser()` 로 설명한 LDAP 이름 구문에 따라 이름을 연결합니다. 그 이외의 경우, 이름을 복합명으로서 연결합니다.

`Context.createSubcontext`
`DirContext.createSubcontext`

LDAP 추가 조작을 실행해, 이름 첨부 엔트리 및 그 관련지을 수 있었던 속성을 작성합니다. 속성이 제공되지 않는 경우, objectClass 속성이 값 `top` 및 `javaContainer` (`javaContainer` 는 schema 위반 에러의 회피에 필요한 구조화 클래스)를 사용해 생성됩니다.

`Context.destroySubcontext`

LDAP 삭제 조작을 실행해, 이름 첨부 엔트리 및 그 관련지을 수 있었던 속성을 삭제합니다. 이름 첨부 엔트리는, 리프 엔트리가 아니면 안됩니다. 서브 트리는 삭제되지 않습니다. 리프 엔트리가 존재하지 않는 (다만 부모는 존재한다) 경우에는, 조작은 성공합니다.

`LdapContext.extendedOperation`

> LDAP 확장 조작을 실행합니다.

`DirContext.getAttributes`

LDAP 기저 객체의 검색 조작을 실행해, LDAP 엔트리의 속성을 가져옵니다. 필터로서 「(objectclass=*)」를 사용해 주세요.

요구된 속성의 리스트가 null 인지, 또는 특별한 속성 식별자 「*」을 포함한 경우, LDAP 엔트리의 사용자 속성 모든 것이 돌려주어집니다. 조작 속성이 필요한 경우, 요구되는 속성 리스트내에 이러한 속성 식별자가 존재하고 있지 않으면 안됩니다.

`LdapContext.getConnectControls`

이 문맥에 대해서 불려 가는 LDAP 바인드 조작용의, 유효한 접속 요구 컨트롤을 가져옵니다.

`Context.getEnvironment`

이 문맥으로 기록된 환경 프로퍼티을 돌려줍니다.

`Context.getNameInNamespace`

이 문맥의 LDAP 식별명을 돌려줍니다.

`Context.getNameParser`

RFC 2253 에 따라 LDAP 명을 구문 분석 하는 이름 퍼서를 돌려줍니다.

`LdapContext.getRequestControls`

이 문맥에 대해서 그 후 불려 가는 LDAP 조작용의, 유효한 요구 컨트롤을 가져옵니다.

`LdapContext.getResponseControls`

이 문맥에 대해서 불려 가는 마지막 LDAP 조작이 돌려주는 응답 컨트롤을 가져옵니다.

`DirContext.getSchema`

「schema」를 참조해 주세요.

`DirContext.getSchemaClassDefinition`

「schema」를 참조해 주세요.

`Context.list`

필터 「(objectclass=*)」를 사용해 이름 첨부 엔트리의 LDAP 단일 레벨 검색 조작을 실행해, 이름 첨부 엔트리 직하의 엔트리명을 가져옵니다.

적어도, 각 엔트리의 클래스명을 판별할 수 있도록(듯이),`javaClassName` 속성에의 문의를 실행합니다. 클래스명을 판별할 수 없는 경우, 클래스명으로서 `javax.naming.directory.DirContext` 를 돌려줍니다.

반환되는 이름은, 이름 첨부 문맥에 대한 상대적인 이름, 또는 LDAP URL 나 LDAPS URL 입니다.

`Context.listBindings`

필터 「(objectclass=*)」를 사용해 이름 첨부 엔트리의 LDAP 단일 레벨 검색 조작을 실행해, 객체 (또는 객체 참조)를 나타내는 속성을 가져옵니다. Java 객체를 재구축 하기 위해서 필요한 속성을 ( 및 많은 경우 그 외의 속성도) 요구합니다. 객체의 재구축 방법의 자세한 것은,「Java 객체」를 참조해 주세요. 객체를 RFC 2713 에 따라 재구축 할 수 없는 경우, LDAP 엔트리를 나타내는 `DirContext` 객체를 돌려줍니다. 프로바이더는,`DirectoryManager.getObjectInstance` 메소드를 사용해,`Binding.getObject` 메소드에의 호출해 요건을 채울 필요가 있습니다.

반환되는 이름은, 이름 첨부 문맥에 대한 상대적인 이름, 또는 LDAP URL 나 LDAPS URL 입니다.

`Context.lookup`
`Context.lookupLink`

필터 「(objectclass=*)」를 사용해, 이름 첨부 엔트리의 LDAP 기저 객체 검색 조작을 실행합니다. Java 객체를 재구축 하기 위해서 필요한 속성 (아마 모든 것)을 요구합니다. 객체의 재구축 방법의 자세한 것은,「Java 객체」를 참조해 주세요. 프로바이더는,`DirectoryManager.getObjectInstance` 메소드를 사용해,`Binding.getObject` 메소드에의 호출해 요건을 채울 필요가 있습니다.

`DirContext.modifyAttributes`

제공된 변경을 사용해, 이름 첨부 엔트리로 LDAP 변경 조작을 실행합니다. `Attributes` 를 받는 overload 된 메소드의 경우, 우선 `Attributes.getAll()` 를 사용해 내용을 열거해, 다음으로 변경 조작의 인수 (`mod_op`)를 재사용하는 것으로써,`Attributes` 인수를 순서 붙일 수 있었던 변경 리스트로 변환합니다.

`LdapContext.newInstance`

이 문맥의 신규 인스턴스를, 지정된 요구 컨트롤을 사용해 초기화합니다.

`Context.rebind`
`DirContext.rebind`

이 메소드에는, 몇개의 다른 LDAP 조작을 포함할 수가 있습니다. 우선, 기존의 엔트리의 속성을 가져옵니다. 기존의 엔트리가 존재하지 않는 경우, 이 메소드는 `bind()` 와 같은 동작을 실시합니다. 그 이외의 경우, 속성이 제공되지 않고, 바인드 되는 객체가 `DirContext` 이라고,`DirContext.getAttributes()` 를 호출해, 그 결과를 속성 인수 (`attrs`)로서 사용합니다. 그런데도 속성이 존재하지 않는 경우에는, 원의 엔트리의 속성을 `attrs` 로서 사용합니다. LDAP 삭제 조작을 실행해, 기존의 엔트리를 삭제합니다. 인수내에서 제공된 객체를 속성으로 변환해 (「Java 객체」로 설명했던 대로),LDAP 추가 조작을 실행해 엔트리내에 `attrs` 와 함께 포함합니다. 프로바이더는,`DirectoryManager.getStateToBind` 메소드를 사용해, 입력 객체를 포함 가능한 형식으로 변환할 필요가 있습니다.

`LdapContext.reconnect`

제공된 접속 요구 컨트롤 및 현재의 환경 프로퍼티을 사용해 LDAP 서버에 재접속합니다.

`Context.removeFromEnvironment`

> 문맥의 환경 프로퍼티을 삭제합니다. 복수의 문맥이 같은 환경 프로퍼티세트를 공유하는 경우, 프로바이더는 목적의 문맥의 환경만을 수정하도록(듯이) 주의할 필요가 있습니다. 환경 프로퍼티을 변경하면(자), 문맥이 사용하고 있는 기존의 접속도 변경해야 하는 경우가 있습니다.

어떤 환경 프로퍼티의 경우에서도, 새로운 프로퍼티은, 비록 그것이 문맥에 영향을 주지 않는 경우에서도, 기록됩니다. 프로퍼티을 삭제하면(자), 문맥은 프로퍼티의 디폴트가 설정되어 있으면(자) 간주합니다.

`EventContext.removeNamingListener`

> 명명 이벤트 청취자의 등록 해제를 실시해, 그 청취자를 대상으로 하는 이벤트가 그 후 송신되지 않게 합니다.

`Context.rename`

LDAP 변경 DN 조작을 실행해, 엔트리의 이름을 변경합니다. LDAPv2 가 사용되는 경우, 새로운 이름 및 이전의 이름은 같은 직계의 부모의 이름을 공유할 필요가 있습니다. 부모가 동일하지 않은 경우에는,`InvalidNameException` 가 throw 됩니다.

이 메소드의 동작에 java.naming.ldap.deleteRDN 프로퍼티이 주는 영향에 유의해 주세요.

`DirContext.search`

지정된 검색 컨트롤에 따라, LDAP 검색 조작을 실행합니다.

요구된 속성의 리스트가 null 인지, 또는 특별한 속성 식별자 「*」을 포함한 경우, LDAP 엔트리의 사용자 속성 모든 것이 돌려주어집니다. 조작 속성이 필요한 경우, 요구되는 속성 리스트내에 이러한 속성 식별자가 존재하고 있지 않으면 안됩니다.

객체를 돌려주도록(듯이) 요구되고 있는 경우, API 사용자로부터의 요구 사항에 가세해, Java 객체 관련의 속성 (RFC 2713 )도 요구됩니다. 이러한 속성이 존재하는 경우, 그 속성을 사용해 원의 객체를 조립할 수 있습니다 (「Java 객체」를 참조). 객체를 RFC 2713 에 따라 재구축 할 수 없는 경우, LDAP 엔트리를 나타내는 `DirContext` 객체를 돌려줍니다. 프로바이더는,`DirectoryManager.getObjectInstance` 메소드를 사용해,`Binding.getObject` 메소드에의 호출해 요건을 채울 필요가 있습니다.

반환되는 이름은, 이름 첨부 문맥에 대한 상대적인 이름, 또는 LDAP URL 나 LDAPS URL 입니다.

제공하는 검색 필터가 적절히 제한되고 있는 경우, 프로바이더는 LDAP 검색 조작 대신에 LDAP 비교 조작을 사용할 수 있습니다.

- 필터의 형식은 「`(<attributeID>=<value>)`」가 아니면 안됩니다.
- 스코프는, 객체 스코프일 필요가 있습니다.
- 제로 속성 (빈 상태(empty)의 귀가 속성 리스트)을 요구할 필요가 있습니다.

캐릭터 라인 필터를 인수로서 받는 검색 형식에서는, 필터의 구문은, Unicode 문자도 허가된다고 하는 예외를 제외해,RFC 2254 에 준거합니다. encode 된 UTF-8 8중창보다 Unicode 문자를 사용하는 것이 추천 되고 있습니다. 서비스 프로바이더는, 서버에 전송 하기 위해서 Unicode 문자를, 대응하는 UTF-8 표현으로 번역하는 역할을 담당합니다. 예를 들어, 그리스 문자의 알파는, 캐릭터 라인 필터내에서 「`\u03B1`」또는 「`\\CE\\B1`」로서 지정할 수 있습니다.

`search(Name, Attributes)` 및 관련 메소드 형식내에서,`Attributes` 인수는, 그 요소로부터 논리적을 작성하는 것으로써, 캐릭터 라인 필터에 변환됩니다. 각 속성치는 리터럴로서 처리되기 (위해)때문에, 속성치내에 나타나는 「*」 및 RFC 2254 로 정의된 것 외의 특수 문자는,RFC 2254 의 규칙에 따라 이스케이프 할 필요가 있습니다. 예를 들어, 「*」의 속성치는 캐릭터 라인 「`\\2a`」로서 encode 할 필요가 있습니다.

`search(Name, String filterExpr, Object[] filterArgs)` 및 그 `String` 로 overload 된 메소드 형식에서는,`filterArgs` 로부터 취득한 값을 입력하는 것으로써, 필터내에서 「{num}」전개가 실행됩니다. 각 「{num}」컴퍼넌트는,RFC 2254 섹션 4 의 「attr」또는 「value」대신에 사용됩니다.

`filterArgs` 내의 객체는, 다음의 방법으로 encode 할 필요가 있습니다.

- 바이트 배열 (`byte[]`)의 encode는, 각 바이트를 RFC 2254 에 준거한 캐릭터 라인으로서 encode 하는 것으로써 행해집니다. 예를 들어, 배열 {0, 1, 10, 100} 은, 캐릭터 라인 「`\\00\\01\\0a\\64`」로서 encode 됩니다.
- 캐릭터 라인은 리터럴로서 처리됩니다. 즉,RFC 2254 로 정의된 asterisk ( 「*」)나 그 외의 특수한 문자가 캐릭터 라인내에서 사용되고 있는 경우, RFC 2254 의 규칙에 따라 이스케이프 됩니다. 예를 들어, 「*」이라고 하는 캐릭터 라인은, 「`\\2a`」라고 하는 캐릭터 라인에 encode 됩니다.
- `String` 도 `byte[]` 도 아닌 객체는,`Object.toString()` 를 사용해 캐릭터 라인 형식에 변환되어 그 후 `String` 용의 규칙이 적용됩니다.

`LdapContext.setRequestControls`

이 문맥에 대해서 그 후 불려 가는 LDAP 조작용의 요구 컨트롤을 설정합니다.

`EventContext.targetMustExist`

청취자가, 존재하지 않는 LDAP 엔트리에의 관계를 등록할 수 있을지 어떨지를 판단합니다.

`Context.unbind`

LDAP 삭제 조작을 실행해, 이름 첨부 엔트리를 삭제합니다. 이름 첨부 엔트리는, 리프 엔트리가 아니면 안됩니다. 서브 트리는 삭제되지 않습니다. 리프 엔트리가 존재하지 않는 (다만 부모는 존재한다) 경우에는, 조작은 성공합니다.

## 11. 연합

LDAP 서비스 프로바이더는, 강분류, 및 접속과 암묵의 다음의 네임 시스템 포인터의 어느 쪽인지 또는 양쪽 모두를 사용해 연합을 지원할 필요가 있습니다.

## 12. SASL

프로바이더는 Java SASL API (JSR 28 )에 의한 SASL 기구를 지원합니다. 이것에 의해, 다른 벤더로부터 제공되는 SASL 기구 드라이버를 LDAP 프로바이더로 사용할 수 있게 됩니다. 또, SASL 기구 드라이버를 다양한 LDAP 프로바이더 및 비 LDAP 프로토콜 라이브러리에서 사용할 수도 있습니다.

Java SASL API 는 Java Authentication and Authorization Service (JAAS)에 의존하고 있습니다. JAAS 는, 사용자/어플리케이션 정보를 직접 취득 또는 제공할 필요가 있는 SASL 기구의 콜백 지원를 제공합니다.

### 12.1 SASL 구성

사용하는 SASL 인증을 지정하려면 , IANA 에 등록된 공식의 SASL 기구명을 `java.naming.security.authentication` 프로퍼티으로 지정합니다. 이용 가능한 동시에 옵션으로 지정된 정책를 채우는 리스트상의 최초의 SASL 기구가 사용됩니다. 즉, 접두사 「`javax.security.sasl.policy`」가 붙은 프로퍼티을, 선택한 SASL 기구의 시큐리티의 특징을 제어하기 위해서 사용할 수 있습니다.

SASL 기구안에는, 인증되는 엔티티의 식별 정보를 요구하는 것도 있습니다. 이것은, 「인증 ID」로서 알려져 있습니다. SASL 기구에 따라서는, CRAM-MD5 나 DIGEST-MD5 와 같이, 패스워드나 범위의 사용이 요건이 되고 있는 것도 있습니다. 디폴트에서는, 프로바이더는 `java.naming.security.principal` 프로퍼티의 값을, 인증 ID 를 필요로 하는 SASL 기구에 인증 ID 로서 제공해,`java.naming.security.credentials` 프로퍼티의 값을 패스워드로서`java.naming.security.sasl.realm` 프로퍼티의 값을 범위로서 제공합니다. 이러한 디폴트를 오버라이드(override) 하는 경우는,`java.naming.security.sasl.callback` 프로퍼티을 사용합니다.

SASL 기구는, 인증 식별 정보 즉 「인증 ID」라고 하는 개념을 지원하고 있습니다. 인증 ID 는, 인증의 성공시에 서버가 액세스를 허가하는 대상이 되는 엔티티입니다. `java.naming.security.sasl.authorizationId` 프로퍼티이 설정되어 있는 경우에는, 이 값이 인증 ID 로서 사용됩니다. 설정되어 있지 않은 경우는 빈 상태(empty)의 캐릭터 라인이 인증 ID 로서 사용됩니다. 이것에 의해, 서버는 클라이언트의 인증 자격으로부터 인증 ID 를 작성합니다.

LDAP 서비스 프로바이더가 SASL 의 지원로 사용하는 프로퍼티의 상세한 것에 대하여는,「SASL 프로퍼티」을 참조해 주세요.

이러한 프로퍼티에 가세해 특정의 SASL 기구로 필요하게 되는 프로퍼티도 존재합니다. 예를 들어, 기밀성과 완전성을 지원하는 SASL 기구는, 클라이언트가 요구하는 보호의 품질을 인식하고 있을 필요가 있습니다. 이러한 프로퍼티은, 환경 프로퍼티 경유로 SASL 기구에게 건네집니다. 환경 프로퍼티의 설정 방법법에 대해서는,「JNDI 의 문서」를 참조해 주세요.

예를 들어, 어플리케이션으로 기밀성이 필요한 경우는 다음과 같은 호출을 사용합니다.

`env.put("javax.security.sasl.qop", "auth-conf");`

이 코드는, 초기 문맥 생성자 에 `env` 를 건네주기 전에 실행합니다. 이러한 프로퍼티의 상세한 것에 대하여는, 「Java SASL API」를 참조해 주세요.

### 12.2 SASL 기구의 드라이버

Java SASL API 는, SASL 기구 드라이버에의 동적인 플러그 인을 실현하는 시스템를 제공하고 있습니다. LDAP 프로바이더는, 몇개의 디폴트 드라이버를 제공 가능합니다. 자세한 것은, 「Java SASL API」를 참조해 주세요.

## 13. 확장 기능 및 컨트롤

프로바이더는,`javax.naming.ldap` 패키지를 사용해 LDAP 확장 기능 및 컨트롤을 지원합니다. 또, 프로바이더는,`javax.naming.event` 패키지의 서비스를 사용해, LDAP 임의 통지 (LDAP 확장 조작 응답내에서 전송 된다)도 지원합니다.

IETF LDAPEXT 워킹 그룹에 의해, 몇개의 LDAP 확장 기능 및 컨트롤이 정의되고 있습니다.

「Start TLS」확장 기능 ( 「1.3. 6.1. 4.1. 1466.20037」)은,`StartTlsRequest` 및 `StartTlsResponse` 클래스에서 지원됩니다. LDAP 프로바이더에서는, 추상 `StartTlsResponse` 클래스를 고정 구현해, LDAP 프로바이더로 그것을 이용할 수 있도록(듯이) 할 필요가 있습니다. StartTlsRequest.createExtendedResponse 의 설명을 참조해 주세요. `StartTlsResponse` 의 구현에서는 일반적으로, LDAP 프로바이더의 데이터 구조에의 액세스가 필요하게 됩니다.

LDAP 서비스 프로바이더는, RFC 2830 에 규정되는 Start TLS 협상의 다음에, 호스트명의 검증을 실행할 필요가 있습니다. 「URL」내에서 설명한다) DNS 의 정보를 사용해 자동적으로 LDAP 서버가 검출되었을 경우,draft-ietf-ldapext-locate-08.txt 의 추천에 따라, 프로바이더는 식별명으로부터 검증 대상의 호스트명으로서 추출된 도메인명을 사용할 필요가 있습니다.

## 14. 이벤트의 통지

프로바이더는,`javax.naming.event` 패키지를 사용해 이벤트 통지를 지원합니다.

JNDI 어플리케이션은, 디렉토리내에서 발생하는 이벤트 (엔트리의 추가 또는 삭제, 엔트리의 변경등)를 등록할 수 있습니다. 어플리케이션은, 임의 통지도 등록할 수 있습니다.

## 15. SSL

프로바이더는 Java Secure Socket Extension (JSSE) 스펙에 따라 SSL 를 지원합니다. `java.naming.security.protocol` 환경 프로퍼티을 다음과 같이 설정하는 것으로써, SSL 가 기동합니다.

> `env.put(Context.SECURITY_PROTOCOL, "ssl");`

또, SSL 를 지원하는 LDAP 서버의 호스트명과 포트 번호를 선택해도, SSL 를 기동할 수 있습니다. SSL 접속이 일단 확립되면(자), 후속의 LDAP 프로토콜 교환은 그 보호 접속 경유로 행해집니다.

게다가 LDAP 인증도 필요한 경우에는,`java.naming.security.authentication` ,`java.naming.security.principal` , 및 `java.naming.security.credentials` 환경 프로퍼티을 적절히 설정할 필요가 있습니다. LDAP 인증이 필요해, 한편 SSL 쿠레덴샤르를 LDAP 인증으로 재사용할 필요가 있는 경우에는, 다음과 같이 `java.naming.security.authentication` 환경 프로퍼티을 설정해 SASL EXTERNAL 기구를 선택합니다.

`env.put(Context.SECURITY_AUTHENTICATION, "EXTERNAL");`

Copyright © 2002 Sun Microsystems, Inc. All rights reserved.