Passkey, SAML SSO, LDAP, TOTP 2FA로 구현하는 Delphi 로그인

· 컴포넌트
Passkey, SAML SSO, LDAP, TOTP 2FA로 구현하는 Delphi 로그인

로그인 화면은 모든 고객이 저마다의 의견을 가지고 있는 비즈니스 애플리케이션의 유일한 부분입니다. Entra ID 계정으로 로그인할 수 있나요? 패스키를 지원하나요? 감사팀은 2단계 인증을 원합니다. 사용자들은 이미 Active Directory에 있는데 왜 또 다른 비밀번호가 필요한가요? 그리고 애플리케이션이 보내는 메일은 Microsoft 365가 SMTP 설정의 비밀번호를 거부한 날부터 작동을 멈췄습니다.

이러한 질문 하나하나는 각자의 사양, 각자의 XML 또는 ASN.1, 그리고 거의 맞지만 완전히 맞지는 않는 저마다의 방식을 가진 프로토콜입니다. 새로운 엔터프라이즈 인증 컴포넌트는 이를 Delphi 컴포넌트로 해결합니다. sgcWebSockets의 EnterpriseAll-Access 에디션과 sgcAuth 패키지에 포함되어 있으며, 동일한 컴포넌트가 sgcWebSockets .NET에도 포함되어 있습니다.

사용자가 기대하는 방식의 패스키

WebAuthn 서버는 이제 사람들이 패스키라고 말할 때 실제로 의미하는 바를 모두 다룹니다.

SAML 싱글 사인온

대형 고객은 자사 직원이 여러분의 애플리케이션에 계정을 갖는 것을 원하지 않습니다. 회사가 이미 사용 중인 ID 제공자로 로그인하기를 원합니다. TsgcSAMLServiceProvider는 여러분의 애플리케이션을 Entra ID, Okta, AD FS, Google Workspace, Keycloak을 위한 SAML 2.0 서비스 제공자로 만듭니다. ID 제공자가 로그인을 처리하고, 애플리케이션은 어설션(assertion)을 수신하며, 사용자 이름을 보기도 전에 해당 어설션의 서명이 검증됩니다.

Active Directory 및 LDAP 로그인

회사 네트워크 내부에서 실행되는 애플리케이션의 경우, 사용자는 이미 비밀번호, 즉 Windows 비밀번호를 가지고 있습니다. TsgcLDAPClient는 LDAPS 또는 StartTLS를 통해 Active Directory나 모든 LDAP 디렉터리에 대해 사용자 이름과 비밀번호를 검증하므로, 비밀번호가 평문으로 네트워크를 통과하는 일이 없습니다. SecurityldapsecLDAPS 또는 ldapsecStartTLS로 설정하고 Authenticate를 호출하세요.

사용자가 누구인지 아는 것은 질문의 절반에만 답할 뿐입니다. GetUserGroups는 중첩된 그룹을 포함해 해당 계정이 속한 그룹을 반환하므로, “이 사용자가 청구서 승인자인가”와 같은 질문은 직접 작성하고 디버깅해야 하는 재귀 검색 대신 한 번의 호출로 해결됩니다.

인증 앱에서 생성하는 2단계 인증 코드

TsgcTOTPAuthenticator는 Google Authenticator, Microsoft Authenticator 및 그 밖의 모든 TOTP 앱의 6자리 코드를 생성하고 검증합니다. 등록은 비밀 값 하나와 QR 코드로 표시하는 URI 하나로 이루어집니다. 로그인은 한 번의 호출입니다.

uses
  sgcAuth_TOTP, sgcBase_Helpers;

var
  oTOTP: TsgcTOTPAuthenticator;
  vSecret, vURI: string;
  vLastStep: Int64;
begin
  oTOTP := TsgcTOTPAuthenticator.Create(nil);
  try
    oTOTP.Issuer := 'MyApp';

    // enrolment: store vSecret with the user, show vURI as a QR code
    vSecret := oTOTP.GenerateSecret;
    vURI := oTOTP.GetProvisioningURI('john@example.com', vSecret);

    // sign-in: vLastStep is the last step accepted for this user, -1 the first time
    vLastStep := -1;
    if oTOTP.VerifyCode(vSecret, txtCode.Text,
      StrToInt64(GetDateTimeUnix(Now)), vLastStep) then
      ShowMessage('Signed in') // save vLastStep, this code is now spent
    else
      ShowMessage('Wrong, expired or already used');
  finally
    oTOTP.Free;
  end;
end;

이 오버로드가 바로 재전송 방지(replay protection)입니다. 이미 승인된 코드는 자신의 30초 유효 시간 안에서도 거부되므로, 누군가 어깨너머로 읽은 코드는 사용된 순간 아무 가치가 없어집니다. 휴대폰을 잃어버리는 날을 위해 GenerateRecoveryCodes는 일회용 복구 코드 목록을 생성합니다. 비밀번호를 보관하듯이 이 코드도 보관하세요.

OpenID Connect를 통한 로그인

TsgcHTTP_OIDC_Client는 모든 OpenID Connect 제공자로 사용자를 로그인시킵니다. 제공자의 디스커버리 문서를 읽으므로, 구성은 수작업으로 복사한 엔드포인트 목록이 아니라 발급자 URL과 클라이언트 ID로 끝납니다. 수신한 ID 토큰을 검증하며, 동일한 서명 키가 여러분의 REST API에 도달하는 베어러 토큰도 검증하는데, 이는 각 고객 테넌트가 자신의 발급자로 서명하는 Entra ID 멀티 테넌트 애플리케이션의 토큰도 포함합니다.

Microsoft 365 및 Gmail 메일을 위한 OAuth2

Microsoft 365와 Gmail은 SMTP, IMAP, POP3에서 비밀번호가 아니라 OAuth2를 요구합니다. TsgcMailOAuth2는 액세스 토큰을 획득하고, 갱신하며, SMTP, IMAP, POP3 세션이 로그인에 사용하는 XOAUTH2 문자열을 만듭니다. 제공자와 프로토콜을 선택하고, 클라이언트 ID를 지정한 다음, OnTokensChanged가 발생하면 리프레시 토큰을 저장하세요. 브라우저가 없는 서비스나 콘솔 애플리케이션은 대신 디바이스 코드 플로우를 사용할 수 있습니다.

데모 사용해 보기

모든 컴포넌트는 Demos\26.Authentication에 실행 가능한 데모를 가지고 있습니다.

문서

받는 방법

이 컴포넌트는 Delphi, C++ Builder, .NET용 sgcWebSockets의 Enterprise 및 All-Access 에디션에 포함되어 있습니다. 인증 기능만 필요하다면 sgcAuth 패키지에서 별도로 제공합니다. 이 컴포넌트들은 추가적인 요소입니다. 폼에 하나를 올려놓기 전까지는 기존 애플리케이션에서 아무것도 바뀌지 않습니다.

다음 읽을거리

영상으로 보기

“Delphi login with passkeys, SAML SSO, Active Directory LDAP and TOTP 2FA”라는 제목의 짧은 영상eSeGeCe 채널에 올라와 있습니다.

질문이나 피드백이 있으신가요, 아니면 로그인 페이지에 통합하는 데 도움이 필요하신가요? 문의하기. 코드를 작성한 사람들로부터 직접 답변을 받으실 거예요.