MailKit 및 ASP.NET Core Web API를 사용하여 Outlook에서 단순 인증 문제 해결

OAuth2

ASP.NET Core 및 MailKit의 Outlook 인증 문제 이해

Outlook 이메일 기능을 MailKit을 사용하면 개발자는 종종 인증 문제에 직면하게 됩니다. 일반적인 문제 중 하나는 "535: 5.7.139 인증 실패" 오류 메시지입니다. 이는 일반적으로 Outlook 서버에서 기본 인증 방법이 비활성화되어 연결 시도가 실패할 때 발생합니다.

한때 널리 사용되었던 기본 인증은 보안을 강화하기 위해 Microsoft와 같은 서비스 공급자에 의해 점점 더 비활성화되었습니다. 대신 OAuth2와 같은 최신 인증 방법이 선호됩니다. 이러한 변화는 특히 사용자 이름과 비밀번호를 직접 사용하는 데 익숙한 개발자에게 혼란을 야기할 수 있습니다.

이 시나리오에서는 올바른 Outlook SMTP 서버 설정과 앱 비밀번호를 사용했지만 여전히 인증 오류가 발생할 수 있습니다. 이러한 문제를 효율적으로 해결하려면 기본 인증이 실패하는 이유를 이해하는 것이 중요합니다. 이 오류는 코드 자체의 문제가 아니라 보안 정책 시행을 나타냅니다.

이 문서에서는 이 오류가 발생하는 이유, 근본 원인 및 문제를 해결하기 위해 취할 수 있는 단계를 살펴보겠습니다. 또한 Outlook 서버와의 안전하고 성공적인 통신을 보장하기 위해 OAuth2와 같은 대체 인증 방법에 대해서도 논의합니다.

명령 사용예
ConfidentialClientApplicationBuilder.Create() 이 명령은 OAuth2 인증을 위한 기밀 클라이언트 애플리케이션을 구축하는 데 사용됩니다. 이는 MSAL(Microsoft Identity Client) 라이브러리의 일부이며 클라이언트 ID로 앱을 초기화하여 보안 통신을 위한 토큰을 획득할 수 있도록 합니다.
SaslMechanismOAuth2() 이 명령은 MailKit에만 적용되며 이메일을 보낼 때 OAuth2 토큰으로 인증하는 데 사용됩니다. OAuth2 프로토콜을 통해 보다 안전한 방법을 사용하여 기본 인증을 우회합니다.
AcquireTokenForClient(scopes).ExecuteAsync() 이 메서드는 클라이언트 애플리케이션에 대한 OAuth2 토큰을 획득합니다. 이는 MSAL 라이브러리의 일부이며 Microsoft Graph 또는 SMTP 서버와 같은 API에 대한 액세스 토큰을 생성하는 데 필수적입니다.
GraphServiceClient 이 개체는 Microsoft Graph API에서 Microsoft 서비스와 상호 작용하는 데 사용됩니다. 이를 통해 개발자는 OAuth2 토큰을 사용하여 이메일을 보내고, 사용자를 관리하고, Microsoft 365의 다른 리소스와 상호 작용할 수 있습니다.
DelegateAuthenticationProvider() 이 명령은 Microsoft Graph API 요청에 대한 인증 프로세스를 설정하는 데 사용됩니다. 각 API 요청에 OAuth2 토큰을 동적으로 할당하여 보안 통신을 보장합니다.
SendMail(message, false).Request().PostAsync() 이 명령은 구성된 이메일 메시지를 비동기적으로 보내는 Graph API의 일부입니다. Microsoft Graph의 보안 이메일 전송 기능을 사용하여 사용자의 사서함에 메시지를 게시합니다.
SmtpClient.AuthenticateAsync() MailKit에서 이 명령을 사용하면 클라이언트가 OAuth2 토큰과 같은 자격 증명을 사용하여 이메일 서버에 인증할 수 있습니다. 이는 기존의 사용자 이름 및 비밀번호 인증 방법을 대체합니다.
SecureSocketOptions.StartTls 이 명령은 SMTP 서버에 연결할 때 STARTTLS 프로토콜을 통해 안전하고 암호화된 연결을 적용하여 데이터가 네트워크를 통해 안전하게 전송되도록 하는 데 사용됩니다.
MimeMessage 이 클래스는 MailKit 라이브러리의 이메일 메시지를 나타냅니다. 여기에는 이메일의 보낸 사람, 받는 사람, 제목, 본문 등의 세부 정보가 포함됩니다. 보내기 전에 이메일 콘텐츠를 생성하고 형식을 지정하는 데 필수적입니다.

안전한 이메일 전송을 위한 OAuth2 통합 탐색

위에 제공된 스크립트는 다음 문제를 해결하도록 설계되었습니다. ASP.NET Core Web API에서 MailKit을 사용하여 Outlook의 SMTP 서버를 통해 이메일을 보낼 때 발생합니다. 이 오류는 Microsoft가 보안 강화를 위해 기본 인증을 비활성화하여 개발자가 보다 안전한 인증 방법인 OAuth2를 채택하도록 했기 때문에 발생합니다. 첫 번째 솔루션에서는 OAuth2 토큰과 함께 MailKit을 사용하여 이메일을 인증하고 보냈습니다. 사용자 이름과 암호에 의존하는 대신 OAuth2에는 MSAL(Microsoft Identity Client)에서 생성되고 요청을 안전하게 인증하는 데 사용되는 토큰이 필요합니다.

우선 솔루션은 MSAL 라이브러리의 일부인 'ConfidentialClientApplicationBuilder.Create()' 메서드를 사용하여 클라이언트 애플리케이션을 만듭니다. 이 단계에서는 OAuth2 토큰을 생성하는 데 필요한 클라이언트 ID, 테넌트 ID, 클라이언트 암호와 같은 필수 자격 증명을 사용하여 애플리케이션을 초기화합니다. 애플리케이션이 빌드되면 `AcquireTokenForClient()` 메서드는 Outlook의 SMTP 서버에 인증하는 데 필요한 토큰을 검색합니다. 'SaslMechanismOAuth2()' 메커니즘을 사용하면 MailKit은 기본 인증을 완전히 우회하여 이 토큰을 사용하여 이메일 전송 프로세스를 인증할 수 있습니다. 이 방법을 사용하면 애플리케이션이 최신 보안 프로토콜을 준수하고 더 이상 사용되지 않는 방법을 방지할 수 있습니다.

두 번째 솔루션에서는 Microsoft Graph API를 사용하여 SMTP 서버와 직접 상호 작용하지 않고 이메일을 보냅니다. Microsoft Graph는 Outlook 이메일을 포함한 Microsoft 서비스 관리를 위한 올인원 솔루션을 제공합니다. Graph API는 각 요청에 OAuth2 토큰을 할당하는 `DelegateAuthenticationProvider()`를 통해 OAuth2 인증을 활용합니다. 이 토큰은 MSAL을 사용하여 유사하게 생성됩니다. 'GraphServiceClient' 개체는 Microsoft 서버와의 보안 통신을 촉진하여 API가 이메일을 원활하게 보낼 수 있도록 합니다. 이 방법은 SMTP와 같은 개별 서비스에 대한 직접 연결을 줄이면서 더 광범위한 Microsoft 서비스 집합을 처리하려는 사용자에게 특히 유용합니다.

마지막으로 세 번째 솔루션에서는 내장된 .NET의 네임스페이스입니다. 인증을 위해 여전히 OAuth2를 사용하지만 이 방법은 이메일 전송을 위해 MailKit을 System.Net.Mail의 SMTP 클라이언트로 대체합니다. OAuth2 토큰은 일반적인 사용자 이름과 비밀번호 조합 대신 자격 증명으로 전달됩니다. 이메일은 일반적인 'MailMessage' 및 'SmtpClient' 개체를 사용하여 구성되고 전송됩니다. 이 접근 방식은 기본 .NET 라이브러리 작업을 선호하지만 이메일 전송을 위해 보안 OAuth2 인증이 필요한 개발자에게 유용할 수 있습니다.

이러한 모든 방법은 기본 인증이 비활성화되는 문제를 해결할 뿐만 아니라 ASP.NET Core Web API의 이메일 전송 기능을 미래에도 보장합니다. 각 솔루션은 오래되고 덜 안전한 인증 방법을 대체하여 OAuth2를 통한 보안의 중요성을 강조합니다. 개발자는 MSAL 및 Microsoft Graph와 같은 최신 인증 라이브러리를 활용하여 애플리케이션이 최신 보안 표준을 준수하도록 보장하는 동시에 안정적인 이메일 전송 기능을 제공할 수 있습니다.

해결 방법 1: Outlook 인증을 위해 OAuth2로 전환

이 접근 방식은 ASP.NET Core 및 MailKit을 사용하여 기본 인증을 Outlook에서 보안 이메일 전송에 권장되는 방법인 OAuth2로 대체합니다.

// Step 1: Install required NuGet packages
// MailKit, MimeKit, and Microsoft.Identity.Client for OAuth2

using MailKit.Net.Smtp;
using MimeKit;
using Microsoft.Identity.Client;

// Step 2: Configure OAuth2 authentication
var clientId = "your-client-id";
var tenantId = "your-tenant-id";
var clientSecret = "your-client-secret";

var cca = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithClientSecret(clientSecret)
    .WithAuthority(new Uri($"https://login.microsoftonline.com/{tenantId}"))
    .Build();

var scopes = new[] { "https://outlook.office365.com/.default" };
var result = await cca.AcquireTokenForClient(scopes).ExecuteAsync();

// Step 3: Send email using OAuth2 token
var emailMessage = new MimeMessage();
emailMessage.From.Add(new MailboxAddress("Your Name", "your-email@outlook.com"));
emailMessage.To.Add(new MailboxAddress("Recipient", "recipient@example.com"));
emailMessage.Subject = "Subject";
emailMessage.Body = new TextPart("plain") { Text = "Hello, this is a test email." };

using (var smtpClient = new SmtpClient())
{
    await smtpClient.ConnectAsync("smtp.office365.com", 587, SecureSocketOptions.StartTls);
    await smtpClient.AuthenticateAsync(new SaslMechanismOAuth2("your-email@outlook.com", result.AccessToken));
    await smtpClient.SendAsync(emailMessage);
    await smtpClient.DisconnectAsync(true);
}

해결 방법 2: Microsoft Graph API를 사용하여 이메일 보내기

이 방법에는 ASP.NET Core 백엔드에서 이메일을 보내기 위해 Microsoft Graph API를 사용하고 SMTP 구성을 완전히 우회하는 방법이 포함됩니다.

// Step 1: Add Microsoft.Graph NuGet package
using Microsoft.Graph;
using Microsoft.Identity.Client;

// Step 2: Configure Graph API and authentication
var confidentialClient = ConfidentialClientApplicationBuilder.Create(clientId)
    .WithTenantId(tenantId)
    .WithClientSecret(clientSecret)
    .Build();

var graphClient = new GraphServiceClient(new DelegateAuthenticationProvider(async (requestMessage) =>
{
    var authResult = await confidentialClient.AcquireTokenForClient(scopes).ExecuteAsync();
    requestMessage.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authResult.AccessToken);
}));

// Step 3: Prepare and send email via Graph API
var message = new Message
{
    Subject = "Test Email",
    Body = new ItemBody
    {
        ContentType = BodyType.Text,
        Content = "Hello, this is a test email sent via Microsoft Graph API."
    },
    ToRecipients = new List<Recipient>()
    {
        new Recipient { EmailAddress = new EmailAddress { Address = "recipient@example.com" } }
    }
};

await graphClient.Users["your-email@outlook.com"].SendMail(message, false).Request().PostAsync();

해결 방법 3: SMTP와 함께 OAuth2 사용(다른 라이브러리)

이 접근 방식에서는 동일한 OAuth 인증 방법을 사용하여 MailKit 대신 System.Net.Mail을 사용하여 OAuth2로 이메일을 보냅니다.

// Step 1: Configure OAuth2 with System.Net.Mail
var smtpClient = new SmtpClient("smtp.office365.com")
{
    Port = 587,
    EnableSsl = true,
    UseDefaultCredentials = false,
    Credentials = new NetworkCredential("your-email@outlook.com", accessToken)
};

// Step 2: Construct the email message
var mailMessage = new MailMessage
{
    From = new MailAddress("your-email@outlook.com"),
    Subject = "Test Email",
    Body = "This is a test email sent using System.Net.Mail with OAuth2.",
    IsBodyHtml = true
};

mailMessage.To.Add("recipient@example.com");

// Step 3: Send the email
await smtpClient.SendMailAsync(mailMessage);

이메일 전송을 위한 최신 보안 표준 구현

최신 이메일 시스템의 맥락에서 기본 인증은 점점 더 오래되고 안전하지 않은 것으로 간주됩니다. 이는 OAuth2와 같은 보다 안전한 메커니즘을 시행하기 위해 기본 인증을 비활성화한 Outlook과 같은 주요 서비스 제공업체의 경우 특히 그렇습니다. 사용자 이름과 비밀번호에만 의존하는 기본 인증은 무차별 대입 공격에 취약하며 자격 증명이 도난당할 경우 손상될 수 있습니다. 따라서 Microsoft가 권장하는 대로 OAuth2로 전환하면 사용자 자격 증명을 노출하지 않고 토큰이 안전하게 교환됩니다.

OAuth2 구현의 중요한 측면 중 하나는 액세스 토큰의 개념입니다. OAuth2는 SMTP 서버를 통한 직접 인증에 의존하는 대신 이메일 서비스와 같은 리소스에 대한 보안 액세스를 허용하는 시간 제한 토큰을 발행합니다. 이러한 토큰은 권한 부여 서버에서 부여되며 개발자는 MSAL(Microsoft Identity Client)과 같은 라이브러리를 사용하여 토큰을 얻을 수 있습니다. 이러한 토큰을 사용하면 애플리케이션은 사용자 계정에 대한 제한된 액세스 권한을 얻어 장기간의 정적 자격 증명과 관련된 위험을 줄일 수 있습니다.

또한 OAuth2를 채택하면 애플리케이션이 최신 보안 관행에 맞게 조정될 뿐만 아니라 향후 개발에 대비할 수도 있습니다. 클라우드 기반 서비스용 API를 포함한 많은 API는 이제 보안 통신을 위해 OAuth2에 크게 의존합니다. 이를 통해 서비스가 발전함에 따라 이메일 전송 기능이 계속 작동하고 안전하게 유지됩니다. 통합하는 개발자의 경우 ~와 함께 , OAuth2를 활용하면 토큰 기반 인증부터 STARTTLS와 같은 프로토콜을 통한 암호화된 전송에 이르기까지 다양한 보안 강화 기능이 제공됩니다.

  1. Outlook에서 535:5.7.139 오류가 발생하는 이유는 무엇입니까?
  2. 이 오류는 Outlook의 SMTP 서버에 대해 기본 인증이 비활성화되어 있기 때문에 발생합니다. Microsoft는 이제 보안 인증을 위해 OAuth2를 요구합니다.
  3. MailKit에서 OAuth2를 어떻게 활성화합니까?
  4. 다음을 사용하여 OAuth2를 구현할 수 있습니다. 애플리케이션을 구성하고 토큰으로 이메일 전송을 인증합니다.
  5. Outlook에서 이메일을 보내기 위한 기본 인증의 대안은 무엇입니까?
  6. OAuth2가 선호되는 대안입니다. 안전하고 시간 제한이 있는 인증을 위해 사용자 이름과 비밀번호 대신 토큰을 사용합니다.
  7. 이메일 전송에 SMTP를 사용하는 것보다 Microsoft Graph API가 더 좋습니까?
  8. Microsoft Graph API는 단순한 이메일 전송 이상의 기능을 처리할 수 있는 광범위한 서비스입니다. 다양한 Microsoft 365 리소스에 액세스해야 하는 경우 더욱 유용하며 권장됩니다.
  9. 내 애플리케이션에서 OAuth2가 올바르게 작동하는지 어떻게 테스트하나요?
  10. 단위 테스트를 구현하여 OAuth2 토큰이 생성되고 이메일 전송 서비스에 올바르게 전달되는지 확인할 수 있습니다.

Outlook의 기본 인증 오류를 해결하려면 OAuth2와 같은 최신 보안 표준을 채택해야 합니다. 이 접근 방식은 기본 인증의 취약점을 제거하고 Outlook의 SMTP 서버를 통해 메시지를 보내는 보다 안전한 방법을 제공합니다.

OAuth2를 ASP.NET Core 및 MailKit과 통합함으로써 개발자는 애플리케이션의 미래 경쟁력을 확보하고 보안 통신을 보장하며 업데이트된 서비스 공급자 요구 사항을 준수할 수 있습니다. 이는 인증 문제를 해결할 뿐만 아니라 전반적인 보안 및 기능을 향상시킵니다.

  1. Microsoft의 기본 인증 및 OAuth2 구현 지원 중단에 대한 자세한 문서: Microsoft Exchange Online 기본 인증 지원 중단
  2. 이메일 기능을 위해 .NET에서 MailKit 및 MimeKit을 사용하는 방법에 대한 종합 가이드: MailKit 문서
  3. OAuth2 인증을 위한 MSAL(Microsoft Identity Client) 라이브러리 설명서: MSAL(Microsoft ID 플랫폼) 개요