[Spring] Spring LDAP - 개념

Geunhyung Pyun·2022년 12월 16일

Spring

목록 보기
1/4

서론

이는 순전히 단순한 호기심에서 시작합니다.
Spring 프로젝트를 시작할 때 Security 구역에서 볼 수 있는 설정 중 하나로 Spring LDAP이 있다.
수많은 궁금한 설정들 중 이것에 갑자기 꽂혔고 이를 조사하기 시작합니다. 과연 LDAP 자체는 무엇이며 Spring LDAP은 어떤 것을 지원하는 것인지 알아보자.

Directory Service

먼저 Directory에 대해서 알아보자.

Directory

  • Directory 자체는 읽기, 검색, 조회에 최적화된 DB이다.
  • 그러나 보통 DB와는 달리 트랜잭션, 롤백과 같은 기능을 제공하지 않는다.
  • 업데이트는 All or Nothing 동작으로 이뤄진다. 즉, 전체가 바뀌거나 아예 안 바뀌거나 둘 중 하나이다.

Directory Service는 그렇다면 이 directory를 가지고 무엇을 할까?

Directory Service

  • 네트워크 서비스의 일종으로 X.400 전자 메일 교환과 이름 검색을 지원하기 위해 개발되었다.
  • Directory는 네트워크에서 사용되는 자원에 대한 정보, 네트워크 사용자를 저장한다.
  • 이 Directory에 대해 관리하는 프로그램을 direcotry service라 한다.
  • 사용자가 네트워크에 접근하거나 네트워크의 여러 자원을 편리하게 관리할 수 있도록 한다.
  • Directory Service는 하나 이상의 directory namespace 속에 포함된 자료에 접근할 수 있는 인터페이스를 제공한다.
  • 해당 인터페이스는 중심/공통 권한으로 동작해 directory data를 관리하는 시스템 자원을 안전하게 인증할 수 있게 한다.

즉, Directory에 네트워크 자원과 사용자를 저장하고 이것을 관리하는 SW라고 보면 된다. 근데 왜 Directory를 얘기하느냐.
LDAP 자체가 Directory에 관련한 프로토콜이라 알고 싶어서였다.

X.500

X.500은 디렉터리 서비스에 관한 네트워크 표준 중 하나이다. 아래의 사진은 X.500의 구조이다.

사용자나 응용 프로그램은 Directory를 사용하고자 할 때 먼저는 DUA(Directory User Agent)를 통한다. DUA는 X.500 통신 네트워크에서 X.500 directory와 SW 혹은 유저의 연결체 역할을 한다.

DUA는 Directory와 통신을 하는데 이 때 연결되는 곳은 DSA(Directory Server Agent)이다. DSA는 X.500 통신 네트워크에서 인증, 연결및 서비스에 대한 접근과 관리를 하는 SW agent이다.
Directory 안에는 여러 개의 DSA가 존재하고 이들 사이에는 DSP(Directory System Protocol)로 통신을 합니다. 이렇게 구성된 것은 분산 환경을 고려하였기 때문이다.

이런 구조로 되어있는 X.500의 흐름은 다음과 같다.

  1. 유저 혹은 애플리케이션(이하 클라이언트)이 DUA에 접근 요청을 보냄
  2. DUA는 DSA에게 클라이언트 정보를 보내고 서버는 해당 정보를 통해 인증을 처리한다.
  3. 서버는 요청을 처리하는데 이 때 DSP를 통해서 해당 서버에 없을 경우 다른 서버와 통신하여 데이터를 조회한다.
  4. 해당 데이터를 응답하고 연결을 종료한다.

X.500에서 정의한 프로토콜 중 DUA와 DSA간 통신에서 DAP(Direct Access Protocol)가 사용된다. 그러나 단점이 존재하였다.

  1. OSI 전체 계층에서 운용
  2. 네트워크 자원을 많이 소비
  3. 복잡하고 구현하기 어려움

이런 DAP의 단점을 해결하기 위해서 LDAP가 나왔다.

LDAP(Lightweight Directory Access Protocol)

특징

  • DAP의 기능을 거의 모두 지원
  • DAP와 달리 TCP/IP 계층에서만 운용하여 전송 속도를 개선
  • 복잡한 부분을 단순화하거나 잘 쓰이지 않은 부분의 삭제, 대부분 데이터 형식을 문자열로 사용하는 등 경량화를 통해 네트워크의 부담을 줄임
  • Referral 기능, UTF-8 지원
  • 스키마 확장 기능
  • SSL 보안 채널을 이용한 보안 기능
  • 검색 결과에 대한 정렬 및 캐싱 기능

흐름

  1. LDAP Application이 LDAP API에게 요청을 보낸다.
  2. LDAP API는 요청을 BER 인코딩 후 LDAP Server로 전송한다.
  3. LDAP Server는 받은 정보를 디코딩 후 backend에서 처리한다.
  4. 작업 완료 후 완료 정보 BER 인코딩 후 LDAP API로 보낸다.
  5. LDAP API는 디코딩한 후 LDAP Application에서 확인할 수 있도록 출력한다.

모델

  1. Information

    • 데이터에 대한 종류, Directory에 저장되는 정보에 대한 기본단위를 정의.

    • 3가지로 정의된다.

      Entry : Directory에서 정보를 표현하는 기본 단위. 다수의 Attribute로 이루어져 있다. 각각의 Entry에는 DN(Distinguish Name)으로 구분되고 DIT(Directory Information Tree) 구조로 형성된다.
      Attribute : Entry의 각 타입을 저장하는 공간. 1개의 Attribute에는 Type(Attribute가 포함하는 정보의 종류 명시)과 Value가 존재한다.
      Value : Attribute의 실질적인 데이터를 나타낸다. 데이터의 형식을 결정하는 Syntax와 값의 동일성을 검사하는 Matching Rules와 관련이 있다.

    • Type은 약어를 가지며 각 약어에 대한 내용은 다음과 같다.

      약어내용
      DNDistinguished Name
      OOrganization
      CNCommon Name
      CCountry
      RDNRelative DN
      OUOrganization Unit
      SNSurName

    • Tree에서 각 원이 Entry이고 가장 위에 있는 Entry를 Root Entry 혹은 Suffix라 한다.
    • 각 Entry에 할당된 문장들은 해당 Entry의 RDN이 되고 그 안에는 Type과 Value들이 존재한다.
  2. Naming

    • 데이터를 어떻게 구성하고 참조할 것인지에 대한 정의
    • Entry는 DN이라는 유일한 값을 가진다. DN은 해당 RDN과 부모 RDN을 나열한 문자열로 가장 좌측의 RDN 값이 자신의 RDN이다.
    • DN값에는 콤마로 구분자로 사용된다.
  3. Functional

    • 데이터에 접근하는 방법을 정의
    • 3가지 그룹으로 구성
      • 질문 작업 : Search(주어진 조건에 맞는 Entry), Compare(특정 Entry의 Attribute값 비교)
      • 갱신 작업 : Add(Entry 추가), Delete(Entry 삭제), Modify(Entry 수정)
      • 인증 및 제어 작업 : Bind(Directory Server 연결 시 인증), Unbind(Directory Server와의 연결 해제), Abandon(이전 요청 명령을 취소)
  4. Security

    • 사용자 인증과 데이터 접근 권한을 통해 서비스를 보호하는 방식에 대해 설명
    • SSL/TLS 인증 방식을 통해 서버-클라이언트 간 연결 구성
    • 데이터 전송 시 바이너리 암호화를 적용

Spring LDAP

LDAP 서버는 보통 사용자 인증 및 권한 부여에 필요한 사용자 관련 정보를 저장하는 데 사용한다. 대표적으로는 Apache Directory Server, Active Directory 등이 있다.
LDAP 서버에 접근하여 상호작용을 위해서는 클라이언트가 존재해야 한다. 이 클라이언트 역할을 하는 것 중 하나가 바로 Spring LDAP이다. 다른 LDAP 클라이언트와는 달리 예외 처리를 유연하게 제공하는다는 것이 강점으로 꼽힌다.

그렇다면 이것을 사용하는 방법은 어떻게 될 것인가? 다음으로 넘긴다. 지금은 LDAP말고 다른거 공부하고 싶다.

참고

https://zetawiki.com/wiki/%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC_%EC%84%9C%EB%B9%84%EC%8A%A4
https://ko.wikipedia.org/wiki/X.500
https://ko.wikipedia.org/wiki/%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC_%EC%84%9C%EB%B9%84%EC%8A%A4
http://egloos.zum.com/gunsystems/v/6785259
https://ldap.or.kr/ldap-a-to-z/
https://ldap.or.kr/ldap-%EC%9D%B4%EB%9E%80/
https://www.samsungsds.com/kr/insights/ldap.html
https://www.techopedia.com/definition/6857/directory-server-agent-dsa
https://www.techopedia.com/definition/6859/directory-user-agent-dua
https://always-kimkim.tistory.com/entry/X500%EA%B3%BC-LDAP-%EC%A0%95%EB%A6%AC

profile
개발자를 원하는 사람.

0개의 댓글