JNDI/LDAP 서비스 프로바이더 - xrath.com 에서 번역됨

#

# LDAP 네임 서비스 프로바이더
Java Naming and Directory InterfaceTM (JNDI)

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

목차

1. 처음에
2. 적합성
3. 환경 프로퍼티
4. 이름
5. 속성
6. URL
7. Java 객체
8. schema
9. 예외
10. API 매핑
11. 연합
12. 이벤트의 통지
13. SASL 인증
14. SSL 및 Start TLS
15. 접속 풀
16. 시큐리티에 대해

## 1. 처음에

Lightweight Directory Access Protocol (LDAP)는, 디렉토리 서비스에 액세스 할 때의 인터넷 표준입니다. JNDI/LDAP 서비스 프로바이더를 사용해, LDAP 의 프로토콜이 구현되고 있는 서버에 액세스 할 수가 있습니다.

이 문서에서는, LDAP 서비스 프로바이더의 기능에 대해 설명합니다. 주로, LDAP 서비스 프로바이더의 동작을 중심으로 설명합니다. 자세한 것은,「LDAP 서비스 프로바이더에 대한 JNDI 구현측의 가이드 라인」을 참조해 주세요. 예 및 사용 방법에 대해서는,JNDI 튜토리얼을 참조해 주세요.

LDAP 서비스 프로바이더에는, LDAP 액세스의 기본 기능이 구현됩니다. 다수의 일반적인 LDAP 컨트롤의 지원, RMI 객체와 CORBA 객체의 포함 및 read에 대한 지원등을 기본 프로바이더에 추가하려면 , 「부스터 팩」을 인스톨 합니다. 「부스터 팩」은,JNDI 의 Web 사이트로부터 다운로드할 수 있습니다.

## 2. 적합성

LDAP 서비스 프로바이더는, 다음의 표준에 준거하고 있습니다.

표준 | 지원 | 비고
--- | --- | ---
LDAPv3 (RFC 2251 ) | 네 |
LDAPv3 속성 (RFC 2252 ) | 네 |
LDAPv3 식별명 (RFC 2253 ) | 네 |
LDAP 검색 필터 (RFC 2254 ) | 네 |
LDAP URL 형식 (RFC 2255 ) | 네 |
LDAPv3 schema (RFC 2256 ) | 네 |
LDAPv2 (RFC 1777 ) | 네 |
LDAP 인증 (RFC 2829 ) | 네 |
Start TLS 확장 기능 (RFC 2830 ) | 네 |
DIGEST-MD5 (RFC 2831 ) | 네 |
Manage Referral Control (참조 컨트롤) (RFC 3296 ) | 네 |
Paged Results Control (페이징 결과 컨트롤) (RFC 2696 ) | 네 |
Sort Control (소트 컨트롤) (RFC 2891 ) | 네 |

## 3. 환경 프로퍼티

JNDI, LDAP 고유, 및 SASL 고유의 프로퍼티에 대한 자세한 것은,「LDAP 서비스 프로바이더에 대한 JNDI 구현측의 가이드 라인」을 참조해 주세요.

### 3.1 JNDI 프로퍼티

LDAP 서비스 프로바이더에서는, 다음의 JNDI 환경 프로퍼티이 지원됩니다.

프로퍼티 | 지원 | 비고
--- | --- | ---
`java.naming.batchsize` | 네 | 디폴트 값는 `1`
`java.naming.factory.control` | 네 | ``
`java.naming.factory.initial` | 네 | LDAP 서비스 프로바이더를 초기 문맥으로서 사용할 때는,`com.sun.jndi.ldap.LdapCtxFactory` 를 지정한다
`java.naming.factory.object` | 네 |
`java.naming.factory.state` | 네 |
`java.naming.language` | 아니오 | 무시된다
`java.naming.provider.url` | 네 | Java 2 SDK, v 1.4. 1 이전의 시스템에서는, 단일의 URL 마셔 포함된다. Java 2 SDK, v 1.4. 2 는 LDAPS URL 를 포함할 수 없다
`java.naming.referral` | 네 |
`java.naming.security.authentication` | 네 | `simple`,`none`, SASL 기구의 리스트
`java.naming.security.credentials` | 네 |
`java.naming.security.principal` | 네 |
`java.naming.security.protocol` | 네 | `ssl`

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

LDAP 서비스 프로바이더에서는, 다음의 LDAP 고유의 환경 프로퍼티이 지원됩니다.

프로퍼티 | 지원 | 비고
--- | --- | ---
`java.naming.ldap.attributes.binary` | 네 |
`java.naming.ldap.control.connect` | 네 |
`java.naming.ldap.deleteRDN` | 네 |
`java.naming.ldap.derefAliases` | 네 |
`java.naming.ldap.factory.socket` | 네 | `java.naming.security.protocol` 프로퍼티에 `ssl` 가 설정되어 있을 때의 디폴트 값는 `javax.net.ssl.SSLSocketFactory`. 자세한 것은,「SSL」를 참조
`java.naming.ldap.ref.separator` | 네 |
`java.naming.ldap.referral.limit` | 네 |
`java.naming.ldap.typesOnly` | 네 |
`java.naming.ldap.version` | 네 |

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

이 서비스 프로바이더에서는, 다음의 SASL 고유의 환경 프로퍼티이 지원됩니다.

프로퍼티 | 지원 | 비고
--- | --- | ---
`java.naming.security.sasl.authorizationId` | 네 |
`java.naming.security.sasl.callback` | 네 |
`java.naming.security.sasl.realm` | 네 |
`javax.security.sasl.qop` | 네 |
`javax.security.sasl.strength` | 네 | Java 플랫폼의 Java 암호화 확장 기능 (JCE) 서비스 프로바이더로 이용 가능한 암호에 근거해 선택된 암호
`javax.security.sasl.maxbuffer` | 네 |
`javax.security.sasl.server.authentication` | 네 |
`javax.security.sasl.policy.forward` | 네 |
`javax.security.sasl.policy.credentials` | 네 |
`javax.security.sasl.policy.noplaintext` | 네 |
`javax.security.sasl.policy.noactive` | 네 |
`javax.security.sasl.policy.nodictionary` | 네 |
`javax.security.sasl.policy.noanonymous` | 네 |

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

LDAP 서비스 프로바이더는, 다음의 프로바이더 고유의 환경 프로퍼티을 정의하고 있습니다.
`com.sun.jndi.ldap.connect.pool`

> 이 프로퍼티을 사용해, 초기 문맥 인스턴스를 작성할 경우에, 풀 된 접속을 사용할 필요가 있는 것을 지정합니다. 이 값이 「true」의 경우, 접속을 작성하기 위한 파라미터 (connection request 로 불린다)가, 접속 풀 설정으로 규정되는 기준에 일치하면, 프로바이더는 풀 된 접속을 사용합니다. 이 프로퍼티이 설정되어 있지 않은 경우, 또는 다른 값으로 설정되어 있는 경우, 혹은 접속 요구가 기준에 일치하지 않는 경우, 프로바이더는 풀 된 접속을 사용하지 않습니다. 접속 풀의 자세한 것은,「접속 풀」을 참조해 주세요.

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

> > `env.put("com.sun.jndi.ldap.connect.pool", "true");`

> LDAP 프로바이더에, 초기 문맥의 작성시에 풀 된 접속을 사용하도록(듯이) 지시합니다.

> 주 - Java 2 SDK, v 1.4. 1 보다 전의 시스템에서는, 접속 풀은 지원되고 있지 않습니다. 그 때문에, 이 프로퍼티은 무시됩니다.

`com.sun.jndi.ldap.connect.timeout`

> 이 프로퍼티의 값은, 접속 타임 아웃의 밀리 세컨드수를 나타내는 정수를 캐릭터 라인으로 표현한 것입니다. LDAP 프로바이더가 이 값의 기간중에 접속을 확립할 수 없으면 접속의 시행은 중지됩니다. 정수는 0 보다 클 필요가 있습니다. 0 이하의 정수를 지정했을 경우는, TCP 등의 네트워크 프로토콜의 타임 아웃치가 사용됩니다.

> 이 프로퍼티이 지정되지 않는 경우는, 접속이 확립되는 것을 대기하는지, 또는 기본이 되는 네트워크의 타임 아웃까지 대기합니다.

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

> > `env.put("com.sun.jndi.ldap.connect.timeout", "500");`

> 0.5 초 이내에 접속이 확립되지 않는 경우, LDAP 서비스 프로바이더에 의한 접속 시행이 중지됩니다.

> 접속을 위해서(때문에) 접속 풀이 요구되고 있는 경우, 풀내의 모든 접속이 사용되어 한편 최대 풀 사이즈에 도달하고 있을 때의, 접속의 최대 대기 시간이 이 프로퍼티에 의해 결정됩니다. 이러한 상황하로, 이 프로퍼티의 값이 제로 이하로 설정되어 있는 경우, 프로바이더는 접속이 가능하게 될 때까지 무한하게 대기하게 됩니다. 그 이외의 값으로 설정되어 있는 경우는, 프로바이더는 최대 대기 시간을 넘은 시점에서, 대기를 중단합니다. 자세한 것은,「접속 풀」을 참조해 주세요.

> 주 - Java 2 SDK 의 v 1.4 보다 전의 시스템에서는, 접속 타임 아웃이 SDK 로 지원되지 않기 때문에, 이 프로퍼티은 무시됩니다.

    com.sun.jndi.ldap.read.timeout

> 이 프로퍼티의 값은, LDAP 조작을 위한 읽어내 타임 아웃의 밀리 세컨드수를 나타내는 정수를 캐릭터 라인으로 표현한 것입니다. LDAP 프로바이더가 이 값의 기간중에 LDAP 응답을 취득할 수 없으면 읽기의 시행은 중지됩니다. 정수는 0 보다 클 필요가 있습니다. 0 이하의 정수는, 읽기 타임 아웃이 지정되어 있지 않은 것을 나타내, 응답이 있을 때까지 무한하게 대기한다고 하는 것입니다.

> 이 프로퍼티을 지정하지 않으면 디폴트는 응답이 있을 때까지 기다린다고 하는 설정이 됩니다.

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

> > `env.put("com.sun.jndi.ldap.read.timeout", "5000");`

> 서버가 5 초 이내에 응답하지 않는 경우, LDAP 서비스 프로바이더에 의한 읽기 시행이 중지됩니다.

> 주 - Java 2 SDK 의 v 6.0 보다 전의 시스템에서는, 읽기 타임 아웃이 SDK 로 지원되지 않기 때문에, 이 프로퍼티은 무시됩니다.

`com.sun.jndi.ldap.netscape.schemaBugs`

> Netscape Directory Server 4.0 이전의 릴리스에서는, RFC 2252 에 준거하고 있는 schema 엔트리는 지원되고 있지 않습니다. 특히, Netscape 서버에서는 RFC 2252 와 달리, OID (SUP 및 SYNTAX 의 OID 등)는 단일 인용부호로 단락지어, MUST/MAY 리스트는 괄호로 둘러쌀 필요가 있습니다. Netscape Directory Server 4.0 의 schema를 갱신할 때는, 이 문제에 대처하기 위해서, 이 `com.sun.jndi.ldap.netscape.schemaBugs` 프로퍼티을 사용할 필요가 있습니다.

> 다음의 값은, 이 프로퍼티용으로 정의된 것입니다.

> `true`
> 회피책을 유효하게 한다
> `false`
> 회피책을 무효로 한다

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

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

> >     env.put("com.sun.jndi.ldap.netscape.schemaBugs", "true");

> 이 경우는, 회피책이 유효하게 됩니다.

> 주 1:이 프로퍼티은, 초기 문맥에만 건네받아 그 프로바이더로 고정됩니다. `addToEnvironment` 또는 `removeFromEnvironment` 메소드에는 영향을 받지 않습니다.

> 주 2:Netscape Directory Server 4.1 을 사용하고 있는 경우, 이 프로퍼티을 사용하지 말아 주세요. 4.1 서버에서는, 괄호가 붙지 않는 MUST/MAY 구를 포함한 객체 클래스 정의를 구문 분석 할 때에 문제가 발생합니다. 단일의 MUST/MAY 항목을 포함한 객체 클래스 정의를 작성 또는 변경하는 경우, MUST/MAY 리스트에 여분의 값 (objectClass 등)을 추가하는 것으로써, 이 버그를 회피해 주세요.

`com.sun.jndi.ldap.trace.ber`

> 이 프로퍼티의 값은,`java.io.OutputStream` 객체입니다. 이 객체에 대해서, LDAP ASN. 1 BER 의 송수신 패킷의 16 진덤프가 기입해집니다.

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

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

> > `env.put("com.sun.jndi.ldap.trace.ber", System.out);`

> 이 경우, LDAP 프로토콜 트레이스는 표준의 출력 스트림에 기입해집니다.

> 주 - 이 프로퍼티은, 초기 문맥에만 건네받아 그 프로바이더로 고정됩니다. `addToEnvironment` 또는 `removeFromEnvironment` 메소드에는 영향을 받지 않습니다.

## 4. 이름

LDAP 서비스 프로바이더의 이름에 대한 자세한 것은,「LDAP 서비스 프로바이더에 대한 JNDI 구현측의 가이드 라인」을 참조해 주세요. 다음의 형식의 LDAP 식별명이 지원되고 있습니다.

식별명의 형식 | 비고
--- | ---
`String` | 복합명으로 간주해진다. 복합명의 최초의 컴퍼넌트는, 식별명으로서 처리된다. 나머지의 컴퍼넌트는 연합 된다
`이름` | `CompositeName` 의 인스턴스의 경우는, 복합명으로 간주해진다. 즉, 최초의 복합명의 컴퍼넌트는, 식별명으로서 처리되어 나머지의 컴퍼넌트는 연합 된다. `CompositeName` 의 인스턴스가 아닌 경우는, 해석 끝난 LDAP 명으로 간주해진다. 이 경우,`Name` 의 각 컴퍼넌트는,RFC 2253 에 정의되고 있는 LDAP 명의 컴퍼넌트가 된다
LDAP URL 캐릭터 라인 | LDAP URL 캐릭터 라인이 초기 문맥에게 건네지면(자),RFC 2255 에 근거해 해석되어 그 식별명 컴퍼넌트는 RFC 2253 에 근거해 해석된다
LDAPS URL 캐릭터 라인 | LDAPS URL 캐릭터 라인은, 초기 문맥에게 건네지면(자), 서버와의 통신에 SSL 접속이 사용되는 점을 제외해, LDAP URL 와 같이 해석된다 주 - Java 2 SDK, v. 1.4. 2 보다 전의 시스템에서는, LDAP 서비스 프로바이더는 LDAPS URL 를 인식하지 않는다.

`getNameParser()` 호출로부터 반환된 이름 퍼서에 의해 퍼서가 돌려주어집니다. 이 퍼서는, 캐릭터 라인명을 받으면(자) RFC 2253 에 근거해 캐릭터 라인명을 해석해, 컴퍼넌트에 건네줍니다.

## 5. 속성

LDAP 서비스 프로바이더의 속성에 대해 자세한 것은,「LDAP 서비스 프로바이더에 대한 JNDI 구현측의 가이드 라인」을 참조해 주세요. LDAP 서비스 프로바이더에서는, 속성치를 지정할 경우에 다음의 형식이 사용됩니다.

속성치의 형식 | 지원 | 비고
--- | --- | ---
`String` 치 | 네 |
`byte[]` 치 | 네 |

일부의 LDAP 서버에서는, 속성치에 대해서 언어의 우선 순위를 지정할 경우에, 속성의 부분형, 속성명의 유어, 및 언어 코드를 사용할 수가 있습니다. 이 경우, LDAP 서버로부터 반환된 속성명은, 요구한 속성명과 다른 일이 있습니다.

LDAP 에서는, 속성명의 대문자 소문자가 구별됩니다. 이 때문에, 파라미터로서 JNDI 조작에 건네주는 속성의 정리를 작성할 때는, 대문자 소문자가 구별되는 속성 클래스를 사용하는 것을 추천합니다. 다음에 예를 나타냅니다.

`Attributes attrs = new BasicAttributes(true); // ignoreCase=true`

속성치를 사용할 때는,`String` 및 `byte[]` 의 어느 쪽의 경우도, 그 속성치의 구문과 형식의 정보가 필요합니다. 속성치의 구문과 형식은, 이러한 정보가 정의되고 있는 schema 문서로 확인할 수 있습니다.

속성을 JNDI 호출에 인수로서 건네줄 때는, 그 속성은 LDAP 디렉토리에 적용되어 모든 schema에 준거하고 있지 않으면 안됩니다. 특히, 새로운 LDAP 를 작성할 때는 (Context.bind ,Context.rebind , 또는 DirContext.createSubcontext 를 사용할 때 등), 일반적으로 `objectClass` 속성이 필요합니다.

## 6. URL

### 6.1 사용법

LDAP 서비스 프로바이더의 URL 에 대한 자세한 것은,「LDAP 서비스 프로바이더에 대한 JNDI 구현측의 가이드 라인」을 참조해 주세요. LDAP 와 LDAPS 의 양쪽 모두의 URL 를 사용할 수 있습니다.

URL 는, 다음의 방법으로 사용할 수 있습니다.

URL 의 사용법 | 지원 | 비고
--- | --- | ---
LDAP URL 와 LDAPS URL 를 사용해 LDAP 서비스 프로바이더를 설정한다 | 네 |
URL 를 `InitialDirContext` 메소드에 이름으로서 건네준다 | 네 |
LDAP 소개로 URL 를 사용한다 | 네 | LDAP/LDAPS URL 의 스코프 컴퍼넌트는 지원된다. 속성, 필터, 및 확장 컴퍼넌트는 무시된다
URL 가,`list`,`listBindings`, 및 `search` 열거의 이름으로서 반환된다 | 네 |
연합 된 이름 공간에 URL 를 링크한다 | 네 |

주 - Java 2 SDK, v. 1.4. 2 보다 전의 시스템에서는, LDAP 서비스 프로바이더는 LDAPS URL 를 인식하는 일도 돌려줄 것도 없다.

### 6.2 LDAP 서비스의 자동 검출

LDAP 서비스 프로바이더는, DNS 설정을 사용한 LDAP 서비스의 자동 검출을 지원합니다. 상기의 사용 예의 LDAP/LDAPS URL 로 호스트명과 포트가 결핍 해, 식별명이 지정되고 있는 경우,「서비스 프로바이더에 대한 JNDI 구현측의 가이드 라인」으로 설명했던 대로,LDAP 서비스 프로바이더는 사용하는 LDAP 서버의 검출을 시도합니다.

예를 들어, URL `ldap:///dc=example, dc=com` 가 지정되고 있는 경우, 서비스 프로바이더는 DNS SRV 레코드로 `_ldap. _tcp.example.com` 를 찾으려고 시도합니다. 프로바이더가 이러한 레코드를 검출했을 경우, 이 레코드로부터 LDAP 서버의 호스트명과 포트를 추출해, 이것들을 사용합니다. 프로바이더가 이러한 레코드를 사용하는 순서는, 인터넷 문서 draft-ietf-ldapext-locate-08.txt 로 설명하는 알고리즘에 따릅니다.

LDAP 서비스의 DNS SRV 레코드를 검출하는 경우, LDAP 서비스 프로바이더는 기본 플랫폼으로 설정된 DNS 서비스를 사용합니다 (예를 들어, Solaris 또는 Linux 에서는, DNS 클라이언트 설정은 /etc/resolv.conf 파일로부터 읽힌다). 기본 플랫폼에 DNS 가 설정되어 있지 않은 경우, LDAP 서비스 프로바이더는 DNS 서버의 호스트명과 포트에 `localhost` 와 53 을 사용합니다. DNS 서비스를 사용할 수 없는 경우, 또는 DNS 서비스에 LDAP 서비스의 SRV 레코드가 없는 경우, LDAP 서비스 프로바이더는 호스트명에 `localhost` 를 사용해, 포트에는 프레인인 접속의 경우는 389 를, SSL 접속의 경우는 636 을 사용합니다.

주 1:Java 2 SDK, v 1.4. 1 보다 전의 시스템에서는, 호스트명과 포트가 지정되지 않는 경우, 항상 디폴트의 `localhost` 와 389 가 사용되어 DNS 를 사용하는 시도 하행 깨지지 않습니다.

주 2:Java 2 SDK, v 1.4. 2 보다 전의 시스템에서는, SSL 의 사용과는 관계없이, 디폴트의 포트는 항상 389 입니다.

## 7. Java 객체

LDAP 서비스 프로바이더에서는, 다음의 종류의 객체의 포함 및 read를 실시할 수가 있습니다. 자세한 것은,「LDAP 서비스 프로바이더에 대한 JNDI 구현측의 가이드 라인」을 참조해 주세요.

포함 및 read가 가능한 객체 | 지원 | 비고
--- | --- | ---
`Reference` 객체 | 네 |
`Referenceable` 객체 | 네 |
`Serializable` 객체 | 네 |
`DirContext` 객체 | 네 |

예에 대해서는,JNDI 튜토리얼을 참조해 주세요.

## 8. schema

LDAP 서비스 프로바이더의 schema 바인딩에 대한 자세한 것은,「LDAP 서비스 프로바이더에 대한 JNDI 구현측의 가이드 라인」을 참조해 주세요.

schema 트리 | 지원 | 비고
--- | --- | ---
AttributeDefinition | 네 |
ClassDefinition | 네 |
SyntaxDefinition | 네 |
MatchingRule | 네 |
ExtensionDefinition | 아니오 |
ControlDefinition | 아니오 |
SASLMechanism | 아니오 |

## 9. 예외

LDAP 서비스 프로바이더의, LDAP 에러 코드의 JNDI 예외에의 매핑에 대한 자세한 것은,「LDAP 서비스 프로바이더에 대한 JNDI 구현측의 가이드 라인」을 참조해 주세요.

## 10. API 매핑

LDAP 서비스 프로바이더에서는, 다음의 JNDI API 메소드가 LDAP 에 매핑 됩니다. 자세한 것은,「LDAP 서비스 프로바이더에 대한 JNDI 구현측의 가이드 라인」을 참조해 주세요.

`Context` 메소드의 매핑 | 지원 | 비고
--- | --- | ---
`addToEnvironment` | 네 |
`bind` | 네 |
`close` | 네 |
`composeName` | 네 |
`destroySubcontext` | 네 |
`getEnvironment` | 네 |
`getNameInNamespace` | 네 |
`getNameParser` | 네 |
`list` | 네 |
`listBindings` | 네 |
`lookup` | 네 | `LinkRef` 는 대상외
`lookupLink` | 네 |
`rebind` | 네 |
`removeFromEnvironment` | 네 |
`rename` | 네 |
`unbind` | 네 |

`DirContext` 메소드의 매핑 | 지원 | 비고
--- | --- | ---
`bind` | 네 |
`createSubcontext` | 네 |
`destroySubcontext` | 네 |
`getAttributes` | 네 |
`getSchema` | 네 |
`getSchemaClassDefinition` | 네 |
`modifyAttributes` | 네 |
`rebind` | 네 |
`search` | 네 |

`LdapContext` 메소드의 매핑 | 지원 | 비고
--- | --- | ---
`extendedOperation` | 네 |
`getRequestControls` | 네 |
`getResponseControls` | 네 |
`newInstance` | 네 |
`reconnect` | 네 |
`setRequestControls` | 네 |

`EventDirContext` 메소드의 매핑 | 지원 | 비고
--- | --- | ---
`addNamingListener` | 네 |
`removeNamingListener` | 네 |
`targetMustExist` | 네 |

## 11. 연합

LDAP 서비스 프로바이더의 연합에 대한 자세한 것은,「LDAP 서비스 프로바이더에 대한 JNDI 구현측의 가이드 라인」을 참조해 주세요. 다음의 연합 방법이 지원됩니다.

연합 방법 | 지원 | 비고
--- | --- | ---
연결 | 네 | 하위의 네임 시스템이 다른 LDAP 시스템의 경우는 제외하다
암묵적인 다음의 네임 시스템 포인터 | 네 |

LDAP 서비스 프로바이더에서는, 복합명은 「강하게 구분되고 있다」라고 보입니다. 즉, 복합명의 최초의 컴퍼넌트가 식별명으로서 처리되어 나머지의 컴퍼넌트는 다음의 네임 시스템의 이름으로서 처리됩니다. 예를 들어, 다음의 예에서는, 다음의 네임 시스템의 루트의 리스트를 출력하고 있습니다. 이 네임 시스템은, LDAP 문맥을 넘어 연합 되고 있습니다. 다음에, 멀티 컴퍼넌트의 복합명을 사용해 이름이 참조됩니다.

>     // List the root of the nns,
>     // Note use of the trailing slash to indicate traversal into the nns
>     NamingEnumeration enum = ctx.list("cn=objects, ou=Sales/");

>     // A composite name lookup
>     Object obj = ctx.lookup("cn=objects, ou=Sales/some/x/y/z");

## 12. 이벤트의 통지

LDAP 서비스 프로바이더의 이벤트의 통지에 대한 자세한 것은,「LDAP 서비스 프로바이더에 대한 JNDI 구현측의 가이드 라인」을 참조해 주세요. 다음의 이벤트가 지원됩니다.

이벤트 | 지원 | 비고
--- | --- | ---
이름 공간의 변경의 통지 | 네 | 지속적 검색 컨트롤을 사용 (*)
객체의 변경의 통지 | 네 | 지속적 검색 컨트롤을 사용 (*)
임의의 통지 | 네 |

* 지속적 검색 컨트롤은, 「IETF 인터넷 드래프트 `draft-ietf-ldapext-psearch-03.txt` 로 정의되고 있습니다.

## 13. SASL 인증

LDAP 서비스 프로바이더의 SSL 인증에 대한 자세한 것은,「LDAP 서비스 프로바이더에 대한 JNDI 구현측의 가이드 라인」을 참조해 주세요.

LDAP 서비스 프로바이더에서는, 다음의 SASL 기구가 지원됩니다.

- EXTERNAL (RFC 2222 ). 이 기구는, SSL/TSL 나 IPsec 등의 외부 소스로부터 인증 정보를 취득한다.
- DIGEST-MD5 (RFC 2831 )는, 다이제스트 인증용.
- GSSAPI (RFC 2222 )는, Kerberos V5 인증용.

이 프로바이더에서는, 상기의 기구에 가세해, Java SASL API (JSR 28 Public Review Draft )에 정의된 시스템 경유로 이용할 수 있는 SASL 기구가 지원됩니다. 다만 예외로서 패키지의 이름은 `javax.security.sasl` 가 아니고 `com.sun.security.sasl.preview` 가 됩니다.

## 14. SSL 및 Start TLS

### 14.1 SSL

LDAP 서비스 프로바이더의 SSL 에 대한 자세한 것은,「LDAP 서비스 프로바이더에 대한 JNDI 구현측의 가이드 라인」을 참조해 주세요. java.naming.ldap.factory.socket 프로퍼티이 다른 소켓 팩토리의 클래스명으로 설정되어 있지 않은 경우는, 디폴트의 `javax.net.ssl.SSLSocketFactory` 소켓 팩토리가 사용됩니다.

SSL 가 사용되어 포트가 지정되어 있지 않은 경우, 디폴트 포트로서 636 이 사용됩니다.

주 - Java 2 SDK, v 1.4. 1 보다 전의 시스템에서는, SSL 의 사용과는 관계없이, 디폴트의 포트는 항상 389 입니다.

### 14.2 TLS 의 기동

LDAP 프로바이더에서는,`StartTlsResponse` 추상 클래스의 고정 구현에 의해,「Start TLS」확장 기능 ( 「1.3. 6.1. 4.1. 1466.20037」)이 지원됩니다. 호스트명의 검증은,「LDAP 서비스 프로바이더에 대한 JNDI 구현측의 가이드 라인」에 따라 실행됩니다.

## 15. 접속 풀

주 - 접속 풀은, Java 2 SDK, v 1.4. 1 이후의 릴리스에서만 지원됩니다.

### 15.1 개요

LDAP 서비스 프로바이더는, 이전에 사용된 접속의 풀을 유지하는 것으로 접속 풀을 지원합니다. LDAP 프로바이더가 접속을 필요로 하는 경우는 항상 ( 및 어플리케이션으로부터 풀이 요구되고 있는 경우), 풀로부터 접속을 가져옵니다. 기존의 접속을 사용할 수 있는 경우는, 이것이 사용됩니다. 기존의 접속을 사용할 수 없는 경우, 새로운 접속이 작성되어 사용됩니다. 프로바이더가 접속을 종료하면(자), 접속은 아이돌의 마크를 붙일 수 있어 재사용할 수 있습니다.

어플리케이션은, 초기 문맥 생성자 에게 건네지는 환경 프로퍼티에 프로퍼티 `com.sun.jndi.ldap.connect.pool` 를 추가해, 접속 풀을 요구합니다. 어플리케이션은,「문맥별」로 풀을 사용하는지 아닌지를, 환경 프로퍼티에 이 프로퍼티을 사용할지 어떨지에 의해 지정할 수가 있습니다. 초기 문맥에게 건네지는 LDAP/LDAPS 의 양 URL 의 참조 처리에, 풀 된 접속을 사용할지 어떨지도, 같은 기구를 사용해 제어됩니다. 예를 들어, 프로바이더가 참조를 처리하는 경우에, 환경 프로퍼티에 이 프로퍼티이 포함되어 있을 때, 프로바이더는 참조에 풀 된 접속을 사용합니다.

다음의 코드예에서는, 새로운 초기 문맥과 여기로부터 도출되는 모든 문맥에 접속 풀을 사용하도록(듯이) 요구하고 있습니다.

>     Hashtable env = new Hashtable();
>     env.put("com.sun.jndi.ldap.connect.pool", "true");
>     env.put(Context.PROVIDER_URL, url);
>     env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
>     DirContext ctx = new InitialDirContext(env);
>     ...

프로퍼티 `com.sun.jndi.ldap.connect.pool` 의 추가만이 필요합니다. 이외의 어플리케이션의 변경은 필요 없습니다.

LDAP 프로바이더는, 어플리케이션으로부터의 정보를 바탕으로 접속이 사용되고 있는지 어떤지를 추적합니다. 어플리케이션의 문맥 핸들이 열려 있는 경우, 그 어플리케이션이 접속을 사용하고 있는 것이라고 봅니다. 따라서, LDAP 프로바이더가 풀 된 접속을 올바르게 관리하기 위해서는, 문맥이 불필요하게 되면 반드시 어플리케이션으로 `Context.close()` 를 호출하도록(듯이) 할 필요가 있습니다.

무효인 접속은 자동적으로 검출되어 풀로부터 삭제됩니다. 문맥이 무효인 접속에 의해 종료하는 확률은, 접속 풀을 사용하고 있을지 어떨지에 관계없이 같습니다.

### 15.2 풀을 사용하지 않는 경우

풀 된 접속은 재사용을 목적으로 하고 있습니다. 따라서, 문맥으로 기본 접속 상태를 바꾸는 것 같은 조작을 실행하는 것이 예정되는 어플리케이션에서는, 문맥에 접속 풀을 사용해야 하지는 않습니다. 특히, 문맥에 대해서 Start TLS 확장 기능 조작을 사용할 예정이 있는 어플리케이션의 경우, 또는 초기 문맥의 작성 후에 시큐리티 관련의 프로퍼티 (`java.naming.security.principal` 나 `java.naming.security.protocol` 등)을 변경할 예정이 있는 어플리케이션의 경우, 그 문맥에 접속 풀을 사용해야 하지는 않습니다. 이러한 상황으로 접속 풀을 사용했을 경우, 어플리케이션의 시큐리티가 손상되거나 예기치 않은 동작이 일어나는 경우가 있습니다.

### 15.3 글로벌 설정

접속 풀은, Java 런타임 마다 설정 및 관리됩니다. 접속은 다른 런타임간에 공유되지 않습니다. 접속 풀을 사용하는 경우, 설정을 변경할 필요는 없습니다. 설정이 필요하게 되는 것은, 풀의 사이즈의 제어, 및 풀 되는 접속의 지정 등, 풀의 설정을 커스터마이즈 하는 경우만입니다.

접속 풀은, 런타임 기동시에 몇개의 시스템 프로퍼티에 의해 설정됩니다. 설정에 사용되는 것은 환경 프로퍼티은 아니고「시스템」프로퍼티이며, 시스템 프로퍼티은 모든 접속 풀 요구에 적용되는 것에 주의해 주세요.

다음에 시스템 프로퍼티의 개요를 나타냅니다. 이후에서는 시스템 프로퍼티에 대해 상세하게 설명합니다.

시스템 프로퍼티명 | 설명 | 디폴트 설정
--- | --- | ---
`com.sun.jndi.ldap.connect.pool.authentication` | 풀 할 수 있는 접속의, 스페이스 단락의 인증 타입의 리스트. 「none」, 「simple」, 「DIGEST-MD5」의 몇개의 타입을 사용할 수 있다 | `「none simple」`
`com.sun.jndi.ldap.connect.pool.debug` | 생성되는 디버그 출력의 레벨을 나타내는 캐릭터 라인. 값에는 `「fine」` (접속의 작성과 삭제를 트레이스)과 「all」 (모든 디버그 정보)을 사용할 수 있다 |
`com.sun.jndi.ldap.connect.pool.initsize` | ID 에 대해서 접속을 최초로 작성할 때의 접속수를, 접속 ID 별로 나타내는 정수를 캐릭터 라인으로 표현한 것 | 1
`com.sun.jndi.ldap.connect.pool.maxsize` | 동시에 유지할 수 있는 접속 ID 별의 최대 접속수를 나타내는 정수를, 캐릭터 라인으로 표현한 것 | 없음
`com.sun.jndi.ldap.connect.pool.prefsize` | 동시에 유지해야 하는 접속 ID 별의 우선적 접속수를 나타내는 정수를, 캐릭터 라인으로 표현한 것 | 없음
`com.sun.jndi.ldap.connect.pool.protocol` | 풀 할 수 있는 접속의, 스페이스 단락의 프로토콜 타입의 리스트. 「plain」와「ssl」의 타입이 유효 | `「plain」`
`com.sun.jndi.ldap.connect.pool.timeout` | IDLE 상태의 접속이 절단 되지 않고, 풀로부터 제외되는 일 없이 풀내에 존재할 수 있는 기간 (밀리 세컨드)을 나타내는 정수를, 캐릭터 라인으로 표현한 것 | 없음

다음의 풀 된 접속의 예에서는, 최대 풀 사이즈를 20, 우선적인 풀 사이즈를 10, 아이들타임 아웃을 5 분으로 설정해 있습니다.

>     # java -Dcom.sun.jndi.ldap.connect.pool.maxsize=20 \
>            -Dcom.sun.jndi.ldap.connect.pool.prefsize=10 \
>            -Dcom.sun.jndi.ldap.connect.pool.timeout=300000 \
>         YourProgram

#### 15.3. 1 풀의 결과

LDAP 프로바이더는, 어플리케이션으로부터 요구되어 접속의 요구가 「풀 기준」에 적합하는 경우에게만 풀 된 접속을 사용합니다. 어플리케이션은,`com.sun.jndi.ldap.connect.pool` 환경 프로퍼티을 사용한 접속의 풀을 요구합니다. 디폴트의 풀 기준에서는, 간단한 인증을 사용하는지, 전혀 인증을 이용하지 않는 프레인인 (비 SSL) 접속의 풀이 허가되고 있습니다. 시스템 프로퍼티을 사용해 풀 기준을 변경해, SSL 접속 및 DIGEST-MD5 인증 타입을 추가하는 일도 가능합니다. 프로토콜 트레이스가 유효하게 되어 있는 접속 (`com.sun.jndi.ldap.trace.ber` 환경 프로퍼티에 의해)은 풀 할 수 없습니다. 커스텀 소켓 팩토리의 풀 접속에 대해서는,「풀 커스텀 소켓 팩토리 접속」을 참조해 주세요.

SSL 접속을 풀 하는 경우,`com.sun.jndi.ldap.connect.pool.protocol` 시스템 프로퍼티에 캐릭터 라인 「`ssl`」를 추가합니다. 예를 들어, 프레인 접속과 SSL 접속을 풀 하는 경우는, 시스템 프로퍼티을 캐릭터 라인 「`plain ssl`」로 설정합니다.

DIGEST-MD5 접속을 풀 하는 경우,`com.sun.jndi.ldap.connect.pool.authentication` 시스템 프로퍼티에 캐릭터 라인 「`DIGEST-MD5`」를 추가합니다. 예를 들어, 인증 타입이 anonymous, simple, 및 DIGEST-MD5 의 접속을 풀 하는 경우는, 이 시스템 프로퍼티을 캐릭터 라인 「`none simple DIGEST-MD5`」로 설정합니다.

#### 15.3. 2 접속의 풀 방법

LDAP 프로바이더는, 재사용할 수 있도록(듯이) 풀 된 접속을 관리합니다. 어플리케이션으로부터 풀 된 접속의 사용이 요구되었을 경우, LDAP 프로바이더는 기존의 풀 된 접속으로 요구를 채우는 것이 가능한가 어떤가를 판단할 필요가 있습니다. 이 경우, 풀 된 각 접속에 「접속 ID」를 할당해 도착한 요구의 접속 ID 가 풀 된 접속의 언젠가와 같은가 어떤가를 체크합니다.

접속 ID 는 인증이 예측되는 LDAP 접속을 작성하는데 필요한 파라미터 세트입니다. 그 구성은, 다음의 겉(표)에 나타내도록(듯이) 요구의 인증 타입에 의해 다릅니다.

인증 타입 | 접속 ID 의 내용
--- | ---

none

- 접속 컨트롤
- 호스트명, 포트 번호, schema는, 초기 문맥으로 지정된 `java.naming.provider.url` 프로퍼티, 참조, 또는 URL 에 따른다
- 다음의 프로퍼티의 내용:

  >     java.naming.security.protocol
  >     java.naming.ldap.version

simple

- anonymous 에 리스트 된 모든 정보
- 다음의 프로퍼티의 내용:

  >     java.naming.security.principal
  >     java.naming.security.credentials

DIGEST-MD5

- simple 에 리스트 된 모든 정보
- 다음의 프로퍼티의 내용:

  >     java.naming.security.sasl.authorizationId
  >     java.naming.security.sasl.realm
  >     javax.security.sasl.qop
  >     javax.security.sasl.strength
  >     javax.security.sasl.server.authentication
  >     javax.security.sasl.maxbuffer
  >     javax.security.sasl.policy.noplaintext
  >     javax.security.sasl.policy.noactive
  >     javax.security.sasl.policy.nodictionary
  >     javax.security.sasl.policy.noanonymous
  >     javax.security.sasl.policy.forward
  >     javax.security.sasl.policy.credentials

#### 15.3. 3 풀 커스텀 소켓 팩토리 접속

`java.naming.ldap.factory.socket` 환경 프로퍼티이 설정되어 있는 경우, 커스텀 소켓 팩토리로부터의 접속의 풀은 인정됩니다. 커스텀 소켓 팩토리를 풀 하는 경우, 소켓 팩토리 클래스는 `Comparator` 인터페이스를 구현할 필요가 있습니다. LDAP 서비스 프로바이더는, 소켓 팩토리의 동등성을 비교하기 위해(때문에) `Comparator.compare()` 메소드를 호출합니다. 소켓 팩토리의 접속의 동등성은 풀 기구에 의해 체크됩니다. 소켓 팩토리의 비교에서는 반드시, 접속의 동등성에 영향을 미치는 소켓 팩토리의 파라미터가 비교되도록(듯이) 합니다. 이 비교는,「접속의 풀 방법」으로 설명한 접속의 동일성 비교와 합해 행해집니다. 커스텀 소켓 팩토리 클래스는, 그 접속이 풀 되는 경우, 반드시 다음과 같은 구조가 됩니다.

        public class CustomSocketFactory extends SocketFactory
                    implements Comparator<SocketFactory> {
           :
           :
           public int compare(SocketFactory sf1, SocketFactory sf2) {
    	   :
    	   :
    	   // do whatever comparison that's required
           }
        }

소켓 팩토리 클래스가 Comparator 인터페이스를 구현하지 않는 경우, 소켓 팩토리 클래스의 접속은 풀 할 수 없습니다. 이 Comparator 인터페이스의 구현 요건은, LDAP 서비스 프로바이더가 구현을 인식하고 있지 않는 다른 소켓 팩토리의 접속을 비교하는 경우, 반드시 LDAP 서비스 프로바이더가 필요한 체크를 실시하는 것입니다.

#### 15.3. 4 풀의 사이즈

LDAP 프로바이더는 접속의 풀을 관리합니다. 각 풀에는 같은 접속 ID 를 가지는 (사용중이나 아이돌중의) 접속이 포함됩니다. 각 풀의 3 개의 사이즈에 의해, 관리 방식이 다릅니다. 이러한 사이즈는 글로벌이며, 모든 풀에 영향을 줍니다.

「초기 사이즈」는, LDAP 서비스 프로바이더가 최초로 풀을 작성할 경우에 작성하는, 접속 ID 별의 접속수입니다 (어플리케이션으로부터, 해당의 접속 ID 에 대해서 풀 된 접속을 최초로 요구되었을 때의 접속수와 같다). 풀내의 각 접속의 인증은, 접속이 사용되는 시점에서 실행됩니다. 디폴트에서는, 초기 풀 사이즈는 1 입니다만, 시스템 프로퍼티 `com.sun.jndi.ldap.connect.pool.initsize` 를 사용해 변경할 수가 있습니다. 일반적으로, 이 사이즈는 어플리케이션의 기동시에, 일정한 수의 서버 접속을 풀에 확보하기 위해서 사용됩니다.

「최대 풀 사이즈」는, LDAP 서비스 프로바이더를 동시에 유지할 수 있는 접속 ID 별의 최대 접속수입니다. 이 사이즈에는, 사용중의 접속과 IDLE 상태의 접속이 관계합니다. 풀 사이즈가 이 수에 이르렀을 경우, 풀내의 접속이 삭제될 때까지 (즉 물리적인 접속이 절단 될 때까지), 대응하는 접속 ID 의 접속이 신규에 작성될 것은 없습니다. 풀 사이즈가 최대에 이르러, 풀내의 모든 접속이 사용중의 경우, 풀내의 접속이 IDLE 상태가 될까 삭제될 때까지, 그 풀의 접속에 대한 어플리케이션의 요구는 거절됩니다. 최대 풀 사이즈를 0 으로 하면(자), 최대 사이즈가 없어집니다. 풀 된 접속에의 요구가 있으면, 풀 된 기존의 IDLE 상태의 접속인가, 신규에 작성되고 풀 된 접속이 사용됩니다.

「우선적 풀 사이즈」는, LDAP 서비스 프로바이더가 유지할 필요가 있는 접속 ID 별의 우선적 접속수입니다. 이 사이즈에는, 사용중의 접속과 IDLE 상태의 접속이 관계합니다. 어플리케이션이 풀 된 접속의 사용을 요구해, 풀 사이즈가 우선적 사이즈보다 작은 경우, LDAP 프로바이더는 IDLE 상태의 접속을 이용할 수 있을지 어떨지에 관계없이, 새롭게 접속을 작성해, 새롭고 풀 된 접속을 사용합니다. 어플리케이션이 접속을 공유하는 모든 문맥으로 `Context.close()` 를 호출해 풀 된 접속의 사용을 종료한 시점에서, 풀의 사이즈가 우선적 사이즈보다 큰 경우, LDAP 프로바이더는 풀 된 접속을 절단 해, 풀로부터 삭제합니다. 우선적 풀 사이즈를 0 으로 하면(자), 우선적 사이즈가 없어집니다. 풀 된 접속에의 요구가 있으면, IDLE 상태의 접속을 사용할 수 없는 경우에 한정해, 접속이 신규에 작성됩니다.

최대 풀 사이즈는 초기 풀 사이즈 및 우선적 풀 사이즈보다 우선되는 것에 주의해 주세요. 예를 들어, 우선적 풀 사이즈를 최대 풀 사이즈보다 크게 설정해도, 실제로는 최대 풀 사이즈로 설정됩니다.

#### 15.3. 5 아이돌 접속

어플리케이션이 접속을 공유하는 모든 문맥으로 `Context.close()` 를 호출해 풀 된 접속의 사용을 종료하면(자), 기본으로 되는 풀 접속에 아이돌의 마크를 붙일 수 있어 재사용을 대기합니다. 디폴트에서는, 아이돌 접속은 쓰레기 컬렉트될 때까지 풀내에 무한하게 계속 존재합니다. `com.sun.jndi.ldap.connect.pool.timeout`」시스템 프로퍼티이 설정되어 있는 경우, LDAP 프로바이더는 지정된 기간을 지나도 IDLE 상태가 되어 있는 풀 접속을, 자동적으로 절단 해, 삭제합니다.

### 15.4 문맥별 설정

#### 15.4. 1 풀의 유효화

풀을 사용하는 경우, 초기 문맥 생성자 에게 건네지는 환경 프로퍼티으로,`com.sun.jndi.ldap.connect.pool` 프로퍼티을 「`true`」로 설정합니다. 프로바이더는 설정된 환경 프로퍼티에 풀 기준을 적용해, 그 문맥에 풀을 사용할지 어떨지를 판단합니다. 프로바이더가 접속을 풀 할 수 없다고 판단했을 경우, 그 문맥에 대해서, 풀되어 있지 않은 접속을 작성해, 사용합니다.

이 프로퍼티을 생략 했을 경우, 문맥으로 접속 풀이 사용되지 않습니다.

#### 15.4. 2 접속 타임 아웃

`com.sun.jndi.ldap.connect.timeout` 환경 프로퍼티은, LDAP 접속을 확립할 때의 타임 아웃 기간의 지정에 사용됩니다. 이 프로퍼티은, LDAP 서버에의 접속을 개시하는 경우에는 TCP 타임 아웃에 영향을 줍니다. 접속 풀이 요구되고 있는 경우, 풀내의 모든 접속이 사용되어 최대 풀 사이즈에 도달하고 있을 때의 최대 대기 시간도 이 프로퍼티에 의해 결정됩니다.

이 프로퍼티이 지정되어 있지 않은 경우, LDAP 프로바이더는 풀 된 접속을 이용할 수 있을 때까지 무한하게 대기합니다. 또 새로운 접속을 작성할 경우에는 디폴트의 TCP 타임 아웃이 유효하게 되는 것을 대기합니다.

이 프로퍼티은, IDLE 상태의 풀 접속의 삭제에 관련하는 시스템 프로퍼티 `com.sun.jndi.ldap.connect.pool.timeout` 와는 다른 것에 주의해 주세요.

## 16. 시큐리티에 대해

시큐리티 매니저가 인스톨 되고 있는 경우는, JNDI 를 사용하는 어플리케이션 및 LDAP 서비스 프로바이더에 대해서, 다음의 액세스권을 할당할 필요가 있습니다.

    permission java.net.SocketPermission "host[:port]", "connect";

> 문맥 메소드에게 건네진 `java.naming.factory.initial` 프로퍼티 및 URL 캐릭터 라인명으로 지정되고 있는 각 호스트 또는 포트에 대해서, 할당할 수 있습니다.

    permission java.net.SocketPermission "host[:port]", "connect, accept";

> `Serializable` 객체를 사용해 포함된 `References` 및 `javaCodebase` 속성의 URL 캐릭터 라인으로 지정되고 있는 각 호스트 또는 포트에 대해서, 할당할 수 있습니다.

SASL 인증을 사용중에 SASL 클라이언트 팩토리를 프로그램에 의해 설정하는 경우는, 어플리케이션에 다음의 액세스권을 할당해 주세요.

    permission java.lang.RuntimePermission "setFactory"

게다가 「GSSAPI」 SASL 기구를 사용하는 경우는, 다음의 액세스권도 필요하게 됩니다.

    permission javax.security.auth.AuthPermission "createLoginContext. appClassName";
    permission javax.security.auth.AuthPermission "doAsPrivileged";

> 로그인해 `doAsPrivileged` 메소드를 호출하려 하고 있는 어플리케이션 클래스용의 액세스권입니다.

    permission java.net.SocketPermission "host[:port]", "connect";

> Kerberos Key Distribution Center (KDC)의 호스트/포트용의 액세스권입니다.

    permission javax.security.auth.kerberos.ServicePermission "krbtgt/realm@realm", "initiate";
    permission javax.security.auth.kerberos.ServicePermission "ldap/fully-qualified-hostname@realm", "initiate";

> LDAP 서비스와 KDC 의 범위와 호스트용의 액세스권입니다.

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