본문 바로가기

AI Feed
Tech & Product/AI, 더 깊게

AI Pub 개발자가 소개하는: 가볍고 빠른 프로토콜 LDAP

안녕하세요, 에디터 TN입니다. 혹시, LDAP에 대해 알고 계시는가요? LDAP은 (Lightweight Directory Access Protocol)의 약자로, 디렉터리 서비스에 접근하기 위해 경량화한 프로토콜입니다. LDAP 중 LDAPv2가 1995년에 RFC(Request for Comments) 1777로 규정되었고, 1997년에 발표된 LDAPv3은 2006년에 RFC 4511로 업데이트되었습니다.

RFC는 미국의 국제 인터넷 표준화 기구인 IETF(Internet Engineering Task Force)에서 제공, 관리하는 문서로, 인터넷 개발에 있어 필요한 기술, 연구 결과, 절차 등을 기술해 놓은 메모입니다. 거의 모든 인터넷 표준은 RFC로 문서화되어 있기에, RFC로 제정되고 그 기간이 오래되었다는 것은 표준화의 측면에서 의의가 있습니다.

이처럼 LDAP은 90년대에 규정된 프로토콜이지만, 지금도 널리 사용하고 있는데요. TEN의 AI Pub에도 적용되어 있습니다. 이번[AI, 더 깊게]에서는 LDAP에 대해 좀 더 구체적으로 알아보고, LDAP을 꾸준히 사용하는 이유를 짚어 보겠습니다.

 

 

 

[ LDAP, 일단 ‘가볍습니다’ ]

LDAP이 기반으로 하는 DAP(Directory Access Protocol)은, 본래 ITU-T(International Telecommunication Union Telecommunication Standardization Sector)에서 권고하는 디렉터리 서비스 네트워크 표준인 X.500에 정의된 프로토콜 중 하나로, OSI(Open Systems Interconnection) 7계층 중 응용 계층을 기반으로 합니다. LDAP은 이를 TCP/IP에 구현하는 방식으로 경량화를 가능하게 만들었습니다. 그 내용을 이름에 담아, DAP 앞에 ‘L’, ‘Lightweight’를 붙였습니다.

LDAP이 DAP보다 가벼워진 비결은 프로토콜 요소에 있습니다. DAP에는 ROSE(Remote Operation Service Equipment)와 RTSE(Reliable Transfer Service Element) 같은 요소들이 필요합니다. OSI 계층에서 사용하는 ROSE는 분산 애플리케이션 간의 통신을 가능하게 하는, 원격 작업을 위한 서비스 요소입니다. RTSE는 신뢰할 수 있는 데이터 전송을 보장하는 서비스 요소입니다. TCP/IP에 구현한 LDAP에는 이 두 요소를 포함하여 몇 개 요소들이 빠져 있습니다. TCP/IP에는 이미 ROSE와 RTSE가 구현되어 있어, 굳이 LDAP에서 두 요소를 별도로 구현할 필요가 없기 때문입니다. ROSE와 RTSE를 대표적으로 말씀드렸으나, 그 외의 요소들도 비슷한 맥락으로 제외하게 되면서 그 결과 LDAP이 DAP보다 가벼워질 수 있었던 것입니다.

LDAP이 가벼울 수 있는 이유, 더 있습니다. 바로, ASN.1(Abstract Syntax Notation One)과 BER(Basic Encoding Rules)입니다. ASN.1은 데이터 구조를 정의하는 표준 표기법으로, LDAP 프로토콜 요소를 명세하는 데 사용됩니다. LDAP은 ASN.1을 사용하여 프로토콜 요소를 정의합니다. 이어, BER은 ASN.1로 정의된 데이터 구조를 바이너리 형식으로 인코딩하고 전송하는 규칙을 정의합니다. ‘BER’의 인코딩 방식이 컴팩트해서 JSON이나 XML 같은 텍스트 기반 인코딩에 비해 작은 크기로 인코딩할 수 있다는 특징이 있습니다. 그 결과 네트워크 대역폭을 절약할 수 있고 전송 속도를 높일 수 있는데요. 이 역시 LDAP이 ‘가벼운 프로토콜’일 수 있도록 합니다.

 

 

 

[ LDAP, 디렉터리 서비스에 최적화된 프로토콜 ]

LDAP은 가벼워서 좋은 동시에, 검색 속도도 빠릅니다. LDAP의 구조 덕분입니다. LDAP은 데이터베이스와 달리, ‘트리 구조’를 사용하여 엔트리 단위로 데이터를 저장합니다. 하위 부서가 상위 부서 엔트리의 자식으로 연결되는 계층적 구조입니다. 이 트리 구조를 DIT(Directory Information Tree)라고 하는데, 검색 속도를 높이는 데 유리합니다.

LDAP의 DIT에서는 데이터가 계층적으로 저장되므로 특정 조건에 맞는 데이터를 찾을 때 검색 범위를 좁혀나가며 효율적으로 탐색할 수 있습니다. 예를 들어, 조직 구조를 반영한 트리에서 특정 부서에 속한 사용자를 찾는 경우 해당 부서의 상위 노드부터 시작하여 하위 노드로 검색 범위를 좁혀나가면 됩니다. 이는 모든 데이터를 처음부터 끝까지 순차적으로 검색하는 것보다 빠른 검색 성능을 보장합니다.

LDAP의 검색 속도에 영향을 주는 것이 더 있습니다. 바로, LDAP이 엔트리의 속성에 대해 생성하는 인덱스입니다. 인덱스를 사용하면 특정 속성값을 빠르게 찾을 수 있어 검색 속도가 향상됩니다. 검색 요청이 들어오면 인덱스를 활용하여 빠르게 결과를 반환합니다. 이는 대규모 데이터 구조에서도 검색 성능을 유지할 수 있게 해줍니다.

이렇게 LDAP의 트리 구조와 인덱싱은 빠른 읽기 작업을 가능하게 하므로 변동이 적은 대규모 사용자 정보를 관리하는 데 적합합니다. 이를테면 사내 계정 관리에 LDAP을 도입할 수 있습니다. LDAP의 계층적 구조는 조직 내의 부서, 팀, 직책 등을 반영하여 사용자 정보를 체계적으로 구성할 수 있으며, 빠른 검색 성능은 대규모 사용자 관리에 도움이 됩니다.

 

 

 

[ LDAP엔트리의 예시로 알아보는 구성요소 : DN과 RDN ]

아래는 LDAP 엔트리의 예시입니다. 이를 통해서 LDAP의 주요 구성요소에 대해 알아보겠습니다.

```
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: Example Company
dc: example

dn: cn=John Doe,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
cn: John Doe
sn: Doe
givenName: John
mail: johndoe@example.com
```

 

LDAP의 주요 구성 요소로 DN, RDN, 속성, 객체 클래스를 꼽을 수 있습니다.

DN(Distinguished Names)은 LDAP 디렉터리 내에서 엔트리를 고유하게 식별하는 이름입니다. DN은 RDN(Relative Distinguished Names)의 목록으로 구성되어 있습니다. 즉, RDN은 DN을 구성하는 각 부분인 것인데요. 속한 레벨에서 엔트리에 대한 고유 식별 기능을 수행합니다. 위의 예시에서 `dc=example`과 `cn=John Doe`가 RDN에 해당합니다.

일반적으로 DN의 가장 왼쪽 부분(즉, 첫 번째 RDN)을 해당 엔트리의 RDN으로 참조하며, 해당 RDN에 포함된 속성을 명명 속성으로 사용합니다. 즉, DN은 루트에서 해당 엔트리까지의 경로를 나타내게 됩니다. RDN이 여러 개 있는 DN의 경우, RDN의 순서에 따라 DIT(Directory Information Tree)에서 연결된 엔트리의 위치가 지정됩니다.

앞서, LDAP이 트리 구조를 가지고 있다고 말씀드렸는데요. DN의 각 RDN은 내림차순으로 계층 구조의 수준을 나타냅니다. 트리의 루트에 가까워지는 순서라고 생각하시면 됩니다. RDN은 쉼표로 구분됩니다. 예시를 통해 이를 확인할 수 있습니다. `dn: dc=example,dc=com`은 `example.com` 도메인을 나타내는 엔트리의 DN이고, `dn: cn=John Doe,dc=example,dc=com`은 `example.com` 도메인 아래의 `John Doe` 사용자를 나타내는 엔트리의 DN입니다. DN의 계층 구조를 보면, `cn=John Doe,dc=example,dc=com`이 `dc=example,dc=com` 아래에 속한다는 것을 알 수 있습니다.

 

 

 

[ LDAP엔트리의 예시로 알아보는 구성요소 : 속성과 객체 클래스 ]

```
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: Example Company
dc: example

dn: cn=John Doe,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
cn: John Doe
sn: Doe
givenName: John
mail: johndoe@example.com
```

 

다시 예시를 살펴보고, LDAP의 구성 요소 중 속성과 객체 클래스에 대해 알아보겠습니다.

속성(Attributes)은 엔트리의 특정 정보를 저장하는 요소입니다. 예시를 기준으로 하면, `o: Example Company`, `cn: John Doe`, `sn: Doe`, `givenName: John`, `mail: johndoe@example.com` 등이 속성입니다. 각 속성은 속성 유형과 해당 유형의 값으로 구성되는데, 예시에서 cn, sn, mail 등이 속성 유형이 되고, 콜론(:) 옆의 값이 해당 유형의 값이 됩니다.

예시를 살펴보면, 속성에 있는 ‘dc’, ‘cn'이 앞서 설명한 구성요소인 DN에서 이미 사용된 것을 볼 수 있습니다. DN에서 사용된 속성이 속성 부분에서 다시 나타나는 이유는 둘의 용도가 다르기 때문입니다. DN에서는 엔트리를 식별하는 데 사용되고, 속성 부분에서는 해당 엔트리에 대한 구체적인 정보를 제공합니다.

 

이어서, 객체 클래스(Object Classes)는 LDAP에 미리 정의된 클래스로, 엔트리가 포함할 수 있는 속성을 정의하는 템플릿입니다. 객체 클래스는 필수 속성과 선택적 속성을 지정하는데, 각 엔트리는 하나 이상의 객체 클래스에 속해야 합니다.

설명으로만 이해하기에는 와 닿지 않으실 수 있으니, 예시에서 다시 살펴보겠습니다. 예시에서 사용된 객체 클래스는 `top`, `dcObject`, `organization`, `person`, `organizationalPerson`가 있습니다. `top`은 모든 엔트리가 가져야 하는 기본 객체 클래스이고, `dcObject`는 도메인 컴포넌트(dc) 속성을 가진 엔트리를 위한 객체 클래스입니다. `organization`은 조직을 나타내는 엔트리를 위한 객체 클래스이고, `person`과 `organizationalPerson`은 사람을 나타내는 엔트리를 위한 객체 클래스입니다.

객체 클래스는 필수 속성과 선택적 속성을 지정한다고 말씀드렸는데, 이는 정의에 따라 구분됩니다. 예를 들어, `person` 객체 클래스는 `sn`과 `cn`을 필수 속성으로 정의하고, `telephoneNumber`를 선택적 속성으로 정의할 수 있습니다. 예제에서 `John Doe` 엔트리는 `person` 객체 클래스에 속하므로 `sn`과 `cn` 속성을 가지고 있습니다.

 

 

 

지금까지 LDAP에 대한 기본적인 정의와 특징, 구성 요소에 대하여 설명해 드렸습니다. LDAP의 가벼움과 속도는 검색에 최적화되어 있기 때문에, 보유하고 있는 적정량의 데이터 내에서 조건에 맞는 것을 검색하고 처리하는 기능을 제공하는 데 주로 쓰입니다. 가장 일상에서 체감하기 좋은 예를 들자면, 솔루션이나 플랫폼 등에서의 로그인 등이 있겠습니다. TEN의 AI 인프라 전용 MLOps 솔루션인 AI Pub에서도 LDAP을 활용한 사용자 로그인 기능을 제공하고 있습니다.

OpenLDAP을 사용하여 LDAP 서버와 클라이언트를 실행하고, 간단한 테스트를 진행하는 과정을 보여드리면 LDAP을 이해하시는 데 도움이 되실 겁니다. 추후 [AI, 더 깊게]에서 OpenLDAP의 사용과 테스트 과정에 대해 다뤄보겠습니다. 더불어 TEN의 AI Pub에서 제공하는 LDAP 사용자 로그인 기능도 함께 소개해 보겠습니다. 그럼, 다음 달 [AI, 더 깊게]에서 뵙겠습니다. 지금까지 에디터 TN이었습니다.



 

- 5월의 [AI, 더 깊게] 콘텐츠는 TEN의 인공지능 플랫폼 개발팀 이용준 주임연구원의 도움으로 작성되었습니다.-

 

* 참고자료

1. RFC 4511 - Lightweight Directory Access Protocol (LDAP) The Protocol datatracker.ietf.org
   : https://datatracker.ietf.org/doc/html/rfc4511

2. Basic LDAP Concepts - LDAP.com: https://ldap.com/basic-ldap-concepts/
3. Why Choose LDAP - LDAP.com: https://ldap.com/why-choose-ldap/
4. OpenLDAP Software 2.6 Administrator's Guide: A Quick-Start Guide
   : https://www.openldap.org/doc/admin26/quickstart.html