LDAP 프로토콜이란? Feat.LDAP를 사용한 사내 서비스 인증 구현

2025-07-28

LDAP를 사용하게 된 이유

이전 회사에서 사내 출퇴근 관리 서비스 앱을 개발할 때가 있었는데, 당시 로그인 인증을 LDAP를 사용하여 구현하였다. 시놀로지를 사용하고 있다면 LDAP 서버를 사용할 수 있는데, (시놀로지 관련 참고 링크) 이를 통해서 로그인을 개발하면 별도의 회원가입없이 기존 사원정보를 통해서 로그인할 수 있게 된다. 그리고 이전 회사는 모든 사원이 시놀로지에 가입되어 있는 상태였기 때문에 편의성을 위해 LDAP를 사용하여 로그인 인증을 구현하게 되었다.

당시 LDAP 자체가 생소해서 어려움을 겪었지만, 막상 구현하고 보니 난이도가 높진 않았었기 때문에 혹시 다른 분들께 참고가 되었으면 하는 마음에 포스팅을 작성하게 되었다. 익숙한 http 방식이 아닌 ldap 프로토콜을 사용한단 점에서 생소하고 거부감이 들 수 있지만, 만약 시놀로지를 사용하고 있고 사내 시스템을 개발할 예정이라면 시놀로지의 LDAP 서버를 사용해서 인증을 구현하는 것도 추천하는 바이다.

LDAP란?

LDAP 이미지 주로 조직관리에 사용되는 프로토콜로, LDAP(Lightweight Directory Access Protocol) 영문을 그대로 풀어서 설명하자면 Directory에 접근하는 가벼운 프로토콜이라는 뜻이다. 여기서 말하는 Directory는 "이름", "이메일", "부서" 등과 같은 정보를 트리 형태로 저장하고 관리하는 시스템을 말한다. LDAP는 전통적인 관계형 데이터베이스와 달리 데이터 구조가 계층적이기 때문에 쓰기/삭제는 성능이 떨어지지만 빠른 조회 성능을 가지고 있기 때문에 사용자 ID, 비밀번호, 그룹, 역할 등의 인증/인가 정보 저장과 조회에 최적화되어있다.

위 이미지에 나타나있는 트리형태의 속성만 간단히 설명하자면 다음과 같다.

  • DC(Domain Component): 도메인 구성 요소의 약자로, 도메인을 쪼갠 단위를 의미한다.
  • OU(Organizational Unit): 조직 단위의 약자로, 보통 팀 등을 의미한다.
  • CN(Common Name): 일반 이름의 약자로, 보통 사용자 혹은 서비스의 이름을 의미한다.

Next.js에서 구현한 LDAP 인증 과정

// NextAuth 관련 코드
export const { handlers: { GET, POST }, auth, signIn, signOut, = NextAuth({
  ...authConfig,
  providers: [
    Credentials({
      async authorize(credentials) {
        if (credentials) {
          const res = await ldapAuthorize(credentials);
          return res;
        }

        return null;
      },
    }),
  ],
});

이 코드는 실제 구현한 코드의 일부를 간소화해서 나타낸 것으로, next-auth와 ldapjs 라이브러리를 사용하여 구현하였으며, next-auth 관련 코드는 사실 다른 인증방식을 사용하는 것과 크게 다른 바 없다.

// ldapAuthorize 관련 코드
function ldapLogin(username: string, password: string) {
  const client = ldap.createClient({
    url: `ldaps://${synology - address}`,
  });

  return new Promise<void>((resolve, reject) => {
    client.bind(
      `uid=${username},cn=${cn - data},dc=${dc - data},dc=synology,dc=${dc - data}`,
      password,
      (error: unknown) => {
        error ? reject(error) : resolve();
      }
    );
  });
}

LDAP 관련 코드는 이 부분인데, ldaps 프로토콜로 시놀로지의 LDAP 서버로 아아디와 패스워드를 담아 bind 요청을 보낸다. 인증이 성공한다면 이후 반환된 정보를 담아 인증이 진행되고, 실패할 경우 ldapLogin를 감싸고 있는 try-catch문에서 인증 실패 관련 로직을 진행한다.

생소한 코드들이 있어서 거부감이 들 수 있지만, 막상 들여다보면 http프로토콜을 통해서 서버로 아이디와 패스워드를 보내는 것처럼 ldap프로토콜을 통해서 LDAP 서버로 아이디와 패스워드를 보낸다는 것에만 차이가 있다. 만약 시놀로지 서버를 대상으로 진행한다면 위 코드를 바탕으로 구현한다면 크게 어려움은 없을터이니 한 번쯤 시도해보길 바란다.


참고 및 출처

Tags

이런 포스팅은 어떤가요?