ASP.NET Core 보안: 데이터 보호
ASP.NET Core에서 제공하는 Data Protection API는 암호화 키를 관리하고 민감한 데이터를 암호화하는 기능을 제공합니다. 주요 패키지로는 Microsoft.AspNetCore.DataProtection, Microsoft.AspNetCore.DataProtection.Abstractions, 그리고 Microsoft.AspNetCore.DataProtection.Extensions 등이 있습니다.
Microsoft.AspNetCore.DataProtection
Microsoft.AspNetCore.DataProtection 패키지는 ASP.NET Core의 데이터 보호 스택의 핵심 부분으로, 개발자가 쉽게 사용할 수 있는 API를 제공하고 암호화 및 해시 메커니즘을 다룹니다. 다음 코드는 이 패키지를 사용하는 방법을 보여줍니다:
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.SetApplicationName("myApplicationName")
.PersistKeysToFileSystem(new DirectoryInfo(@"C:\keys"));
// ... other service configuration
}
위의 코드는 애플리케이션의 고유한 이름을 설정하고, 암호화 키를 파일 시스템에 저장하는 방법을 보여줍니다. 이러한 설정을 통해 여러 애플리케이션 및 서버에서 암호화 키를 공유할 수 있게 됩니다.
Microsoft.AspNetCore.DataProtection.Abstractions
Microsoft.AspNetCore.DataProtection.Abstractions 패키지는 Data Protection 시스템의 주요 추상화를 제공합니다. 이 패키지의 주요 추상화 중 하나인 IDataProtector 인터페이스를 사용하면, 개발자는 민감한 데이터를 쉽게 암호화하고 복호화할 수 있습니다. 다음 코드는 이 인터페이스를 사용하는 방법을 보여줍니다:
public class MyService
{
private readonly IDataProtector _protector;
public MyService(IDataProtectionProvider provider)
{
_protector = provider.CreateProtector("MyPurpose");
}
public string ProtectData(string input)
{
return _protector.Protect(input);
}
public string UnprotectData(string input)
{
return _protector.Unprotect(input);
}
}
위의 코드에서, IDataProtectionProvider는 IDataProtector 인스턴스를 생성하며, 각각의 IDataProtector는 암호화에 사용되는 고유한 "purpose"를 가집니다.
Microsoft.AspNetCore.DataProtection.Extensions
마지막으로, Microsoft.AspNetCore.DataProtection.Extensions 패키지는 표준 서비스 컬렉션에 Data Protection 서비스를 추가하는 확장 메서드를 제공합니다. 이 패키지의 확장 메서드를 사용하면, ASP.NET Core 애플리케이션에서 Data Protection API를 쉽게 사용할 수 있습니다.
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.SetDefaultKeyLifetime(TimeSpan.FromDays(90));
// ... other service configuration
}
위의 코드에서, SetDefaultKeyLifetime 메서드는 생성되는 모든 키의 수명을 설정합니다.
Microsoft.AspNetCore.DataProtection.SystemWeb
Microsoft.AspNetCore.DataProtection.SystemWeb
패키지는 ASP.NET 웹 애플리케이션에서 데이터 보호 API를 이용할 수 있도록 합니다. 이 패키지를 사용하면, ASP.NET Core와 .NET Framework에서 동일한 암호화 키를 공유할 수 있습니다.
이 패키지를 사용하는 예제 코드는 다음과 같습니다:
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToAspNetFileSystem(new DirectoryInfo(@"~/App_Data/Keys"));
// ... other service configuration
}
이 코드는 암호화 키를 ASP.NET 애플리케이션의 App_Data 폴더에 저장하는 방법을 보여줍니다. 이렇게 하면, ASP.NET Core와 .NET Framework 애플리케이션에서 동일한 암호화 키를 사용할 수 있습니다.
Microsoft.AspNetCore.Cryptography.KeyDerivation
Microsoft.AspNetCore.Cryptography.KeyDerivation
패키지는 암호를 해시하는 데 사용되는 API를 제공합니다. 이 패키지는 사용자의 비밀번호를 안전하게 저장하는 데 필요한 함수를 제공합니다.
이 패키지를 사용하는 예제 코드는 다음과 같습니다:
public class PasswordHasher
{
public string HashPassword(string password)
{
// generate a 128-bit salt using a secure PRNG
byte[] salt = new byte[128 / 8];
using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(salt);
}
string hashed = Convert.ToBase64String(KeyDerivation.Pbkdf2(
password: password,
salt: salt,
prf: KeyDerivationPrf.HMACSHA256,
iterationCount: 10000,
numBytesRequested: 256 / 8));
return hashed;
}
}
위의 코드는 암호를 해시하는 방법을 보여줍니다. 이 메서드는 안전한 난수 생성기를 사용하여 솔트를 생성하고, PBKDF2 함수를 사용하여 비밀번호를 해시합니다.
결론
ASP.NET Core의 Data Protection 시스템은 매우 강력하고 유연한 API를 제공하며, 애플리케이션에서 민감한 데이터를 안전하게 암호화하고 관리하는 데 필요한 모든 기능을 제공합니다. 이 세 가지 패키지를 이용하면 ASP.NET Core 애플리케이션의 보안을 높일 수 있습니다.