Login 컨트롤 보안

업데이트: 2007년 11월

ASP.NET 로그인 컨트롤을 사용하면 사용자 인증, 멤버 자격 및 역할을 기반으로 웹 페이지 액세스 제어 솔루션을 제공할 수 있습니다. 로그인 컨트롤에는 CreateUserWizard 컨트롤, Login 컨트롤, LoginStatus 컨트롤, LoginView 컨트롤, PasswordRecovery 컨트롤 및 ChangePassword 컨트롤이 포함됩니다. 이 항목에서는 구성 및 코딩과 관련한 최선의 구현 방법을 통해 로그인 컨트롤의 보안을 향상시키는 방법에 대해 설명합니다.

다음과 같은 코딩 및 구성에 대한 최선의 구현 방법으로 응용 프로그램의 보안을 향상시킬 수 있지만, Microsoft Windows 및 IIS(인터넷 정보 서비스)에 대한 최신 보안 패치뿐만 아니라 Microsoft SQL Server나 다른 데이터 소스에 대한 모든 보안 패치를 사용하여 웹 서버 컴퓨터를 최신 상태로 계속 유지하는 것도 중요합니다.

보안 코드 작성 및 응용 프로그램 보안을 위한 최선의 구현 방법에 대해서는 Michael Howard와 David LeBlanc가 공동으로 저술한 책인 "Writing Secure Code" 또는 Microsoft Patterns and Practices(https://www.microsoft.com/resources/practices/default.mspx)에서 제공하는 지침을 참조하십시오.

다음 항목에서 다른 컨트롤 형식의 특수한 보안 연습에 대한 정보를 볼 수 있습니다.

로그인 컨트롤에 대한 일반 보안 연습

로그인 컨트롤 보안에는 다음과 같은 다양한 분야에 사용되는 최선의 구현 방법이 포함됩니다. 아래에는 자세한 정보를 볼 수 있는 링크와 함께 간단한 설명이 제공됩니다.

SSL(Secure Sockets Layer) 프로토콜 사용

ASP.NET 로그인 컨트롤은 HTTP를 통해 정보를 일반 텍스트 형태로 서버에 전송합니다. 중요한 정보를 사용할 때는 SSL(Secure Sockets Layer) 암호화와 함께 HTTPS 프로토콜을 사용하는 것이 가장 좋습니다. SSL은 데이터가 변경되지 않도록 보호하고(데이터 무결성), 사용자의 ID를 보호하고(기밀성), 데이터가 예상된 클라이언트로부터 비롯되었는지 확인(인증)합니다. 자세한 내용은 IIS 설명서에서 암호화 개요Configuring SSL on a Web Server or a Web Site를 참조하십시오.

사용자 입력 유효성 검사

사용자가 입력한 내용이 안전하다고 생각하지 마십시오. 악의적인 사용자가 잠재적으로 위험한 정보를 클라이언트에서 응용 프로그램으로 보낼 수 있습니다. 로그인 컨트롤의 경우 입력되는 정보가 중요하기 때문에 사용자 입력에 적절한 예방 조치를 취해야 합니다. 악의적인 입력으로부터 보호하는 방법에 대한 자세한 내용은 웹 응용 프로그램의 기본 보안에 대한 유용한 정보를 참조하십시오.

가능한 모든 경우에 유효성 검사 컨트롤을 사용하여 사용자 이름이 유효하고 암호가 강력한지 테스트합니다. 일부 사용자 입력은 유효성 검사 컨트롤 없이 유효성을 검사할 수 있습니다. 예를 들어 CreateUserWizard 컨트롤은 필요한 비교 유효성 검사를 지원합니다. EmailRegularExpression 속성에 정규식을 지정하여 전자 메일 주소가 지정한 패턴에 일치하는지 확인하고 PasswordRegularExpression 속성으로 암호가 요구 사항을 만족하는지 확인할 수도 있습니다.

로그인 컨트롤에서 가장 유연하게 사용자 입력의 유효성을 검사하기 위해 템플릿을 사용할 수 있습니다. 가능한 모든 경우에 컨트롤에 대한 템플릿을 만들고, 개별 컨트롤(일반적으로 TextBox 컨트롤)을 추가하고, 사용자 입력을 가능한 가장 좁은 범위로 제한할 수 있도록 유효성 검사 컨트롤을 추가합니다.

참고:

유효성 검사 컨트롤을 사용할 때는 클라이언트측 유효성 검사와 함께 항상 서버 코드에서도 유효성 검사를 수행하십시오. 이렇게 하면 클라이언트 스크립트 검사를 비활성화하거나 변경하여 사용자가 유효성 검사를 생략하지 않게 할 수 있습니다.

자세한 내용은 ASP.NET 웹 페이지에서 사용자 입력 유효성 검사를 참조하십시오.

뷰 상태 보안

로그인 컨트롤은 정보를 페이지의 뷰 상태에 저장하기 때문에 최선의 보안 구현을 위해서는 뷰 상태를 보호해야 합니다. 뷰 상태 데이터는 인코딩된 형식으로 저장되지만 다른 사용자에게 노출되거나 손상될 수 있습니다. 자세한 내용은 ASP.NET 뷰 상태 개요를 참조하십시오.

멤버 자격 보안

ASP.NET 멤버 자격은 사용자 자격 증명의 유효성 검사 및 저장 기능을 제공합니다. CreateUserWizard, Login, PasswordRecoveryChangePassword 컨트롤을 사용하면 ASP.NET 멤버 자격을 사용하여 코드가 거의 필요하지 않은 완전한 인증 시스템을 만들 수 있습니다. 또한 사용자 멤버 자격 처리 및 웹 사이트 내의 페이지에 대한 액세스 제어 기능 등이 포함된 완전한 솔루션을 구축하기 위해 LoginName, LoginStatusLoginView 컨트롤을 사용할 수 있습니다. 자세한 내용은 멤버 자격 소개멤버 자격 보안을 참조하십시오.

ASP.NET에 포함된 멤버 자격 공급자에는 MaxInvalidPasswordAttempts 속성에 지정된 대로 잘못된 암호나 암호 대답 시도의 최대 횟수에 대한 기본 제공 임계값이 있습니다. ASP.NET 멤버 자격을 사용하면 PasswordAttemptWindow 속성에 지정된 대로 멤버 자격 사용자가 잠기기까지 잘못된 암호나 암호 대답 시도의 최대 횟수가 허용되는 시간(분)을 구성할 수도 있습니다. 기본 암호 시도 임계값은 5회이며, 기본 암호 시도 시간은 10분입니다. 기본 공급자의 임계값은 응용 프로그램에 대한 Web.config 파일의 membership 섹션에 설정된 임계값으로 재정의될 수 있습니다. 이러한 임계값은 가능하면 최소값으로 설정하는 것이 좋습니다. 또한 RequiresQuestionAndAnswer 속성은 false로 설정하지 않는 것이 좋습니다. 이렇게 설정하면 잘못된 암호 대답 시도가 추적되지 않습니다. 자세한 내용은 멤버 자격 공급자를 참조하십시오.

전자 메일 보안

CreateUserWizard, ChangePasswordPasswordRecovery 컨트롤은 완료된 사용자 트랜잭션에 대한 자세한 내용이 포함된 전자 메일 메시지를 보낼 수 있습니다. 사용자에게 전송되는 전자 메일 메시지에는 필요한 정보만 포함되도록 하십시오. 예를 들어 전자 메일 메시지의 제목 줄을 의도하지 않은 사람이 다른 전자 메일 메시지에서 쉽게 필터링할 수 있도록 만들지 마십시오. 암호는 전자 메일로 보내지 않는 것이 좋습니다. 확인 코드 및 반환 URL(사용자가 트랜잭션을 완료하려면 해당 URL을 사용해야 함) 전송과 같이 암호 트랜잭션을 확인할 수 있는 다른 방법을 고려하십시오.

CreateUserWizard, ChangePasswordPasswordRecovery 컨트롤의 MailDefinition 속성을 지정하지 않으면 전자 메일 메시지가 전송되지 않습니다. 이러한 컨트롤을 구성하여 전자 메일 메시지를 보내는 경우 모든 SMTP 관련 오류를 catch하도록 메일 오류 이벤트를 처리하여 불필요한 정보가 사용자에게 노출되지 않도록 하는 것이 좋습니다. ChangePassword 컨트롤의 경우 SendMailError를 처리하고 SendMailErrorEventArgs 개체의 Handled 속성을 true로 설정합니다. 메일 오류 이벤트를 처리하는 방법에 대한 예는 SendMailError를 참조하십시오. SMTP(Simple Mail Transfer Protocol) 서비스를 설치하는 방법에 대한 자세한 내용은 방법: IIS 6.0에서 SMTP 가상 서버 설치 및 구성을 참조하십시오.

개별 컨트롤에 대한 보안 고려 사항

다음 단원에서는 개별 로그인 컨트롤에 대한 보안 고려 사항을 설명합니다.

CreateUserWizard

CreateUserWizard 컨트롤은 사용자로부터 정보를 수집한 다음, ASP.NET 멤버 자격 시스템에 해당 사용자에 대한 계정을 만듭니다. 사용자는 CreateUserWizardStepCompleteWizardStep 단계의 이전 또는 이후에 필드나 단계를 추가하여 추가 정보를 받아들이도록 CreateUserWizard 컨트롤을 확장할 수 있습니다. 사용자가 CreateUserWizard 컨트롤의 모든 단계를 완료하지 않으면 보안 문제가 발생할 수 있지만 계정은 만들어집니다. 사용자가 사용자 지정 마법사 단계를 건너뛸 수 없도록 하려면 OnNextButtonClick 메서드를 재정의하여 사용자 지정 인증을 수행합니다. 정보가 수집된 후 MembershipProvider 클래스의 CreateUser 메서드를 사용하여 사용자를 만듭니다.

관리 작업을 수행 중이며 CreateUserWizard를 사용하여 자동으로 사용자 계정을 만드는 경우 AutoGeneratePassword 속성을 true로 설정하고 LoginCreatedUser 속성을 false로 설정하는 것이 좋습니다. 이러한 특별한 시나리오에서는 DisableCreatedUser 속성을 false로 설정하는 것이 좋습니다.

로그인 컨트롤

Login 컨트롤은 사용자 이름 및 암호 텍스트 상자뿐만 아니라 다음에 페이지를 방문할 때 사용자 정보를 기억할지 여부를 지정하는 확인란까지 포함한 복합 컨트롤입니다. RememberMeSet 속성은 사용자의 브라우저로 인증 쿠키를 보내고 DisplayRememberMe 속성은 영구 쿠키의 전송 여부를 사용자가 제어할 수 있는 확인란을 표시합니다. RememberMeSet을 true로, DisplayRememberMe를 false로 설정하지 마십시오. 이렇게 하면 사용자 몰래 쿠키가 전송됩니다. 일반적으로 쿠키를 사용자의 컴퓨터에 저장하는 경우에는 몇 가지 위험이 있습니다. 쿠키는 또 다른 형태의 사용자 입력이므로 정보 공개 및 스푸핑 대상이 됩니다. 자세한 내용은 ASP.NET 쿠키 개요를 참조하십시오.

Login 컨트롤을 여러 최종 사용자가 사용하는 경우 공용 컴퓨터의 사용자들이 세션 시간이 종료된 다음 삭제되는 비영구 쿠키 사용을 선택할 수 있도록 컨트롤을 코딩하십시오. 작업 작성에 대한 자세한 내용은 방법: 쿠키 작성을 참조하십시오.

LoginName 컨트롤

LoginName 컨트롤은 사용자의 로그인 이름을 표시하거나 응용 프로그램이 Windows 인증을 사용하는 경우 사용자의 도메인 및 계정 이름을 표시합니다. 사용자가 이름 또는 계정 정보의 표시 여부를 지정할 수 있는 확인란을 추가해 보십시오. 예를 들어 공용 컴퓨터의 사용자는 중요한 정보가 표시되지 않기를 바랍니다.

LoginView 컨트롤

LoginView 컨트롤을 사용하면 로그온한 사용자와 로그온하지 않은 사용자(익명 사용자)에게 서로 다른 정보를 표시할 수 있습니다. AnonymousTemplateLoggedInTemplate 템플릿으로 표시하는 콘텐츠와 RoleGroups 속성에 연결된 템플릿으로 표시하는 모든 콘텐츠를 검토하여 사용자가 의도되지 않은 템플릿을 볼 수 없도록 합니다. 특히 RoleGroups 속성의 컬렉션은 템플릿이 정의된 순서대로 검색됩니다. 사용자에게는 첫 번째로 일치하는 역할 그룹 템플릿이 표시됩니다. 사용자가 두 개 이상의 역할 멤버인 경우 사용자의 역할과 일치하는 첫 번째 역할 그룹 템플릿이 표시됩니다. 단일 역할에 대해 템플릿이 두 개 이상 연결된 경우 첫 번째 정의된 템플릿만 사용됩니다. 자세한 내용은 역할 관리 이해를 참조하십시오.

PasswordRecovery 컨트롤

PasswordRecovery 컨트롤을 사용하면 사용자 이름과 연결된 전자 메일 주소를 기반으로 사용자가 암호를 검색할 수 있습니다. PasswordRecovery 컨트롤을 구성할 때는 다음 지침을 따릅니다.

  • 전자 메일 메시지를 보낼 때 오류가 발생할 경우 작업을 수행하도록 SendMailError 이벤트를 처리합니다.

  • MaxInvalidPasswordAttempts 속성을 사용하여 암호 대답 시도의 제한 횟수를 설정하고 PasswordAttemptWindow 속성을 사용하여 제한 시간을 설정합니다.

  • 사용자에게 전자 메일로 전송되는 모든 정보를 검토하고 특히 암호 복구 전자 메일 메시지에 사용자 암호가 있는 경우 메시지 전송에 사용되는 채널의 보안을 검토합니다. 제목 줄에 "암호"라는 단어가 포함된 메시지와 같이 중요한 정보가 포함되어 있음을 명확히 알 수 있는 전자 메일 메시지는 보내지 마십시오.

ChangePassword 컨트롤

ChangePassword 컨트롤을 사용하면 사용자가 암호를 변경할 수 있습니다. ChangePassword 컨트롤을 구성할 때는 다음 지침을 따릅니다.

  • 전자 메일을 보낼 때 오류가 발생할 경우 작업을 수행하도록 SendMailError 이벤트를 처리합니다.

  • MaxInvalidPasswordAttempts 속성을 사용하여 암호 대답 시도의 제한 횟수를 설정하고 PasswordAttemptWindow 속성을 사용하여 제한 시간을 설정합니다.

  • 사용자에게 전자 메일로 전송되는 모든 정보를 검토하고 특히 ChangePassword 컨트롤이 전자 메일을 사용하여 사용자에게 새 암호를 보내도록 구성된 경우 메시지 전송에 사용되는 채널의 보안을 검토합니다.

  • 사용자의 새로운 암호를 포스트백하는 동안 암호를 읽을 수 없도록 SSL을 사용합니다.

  • ChangePassword 컨트롤이 사용자에게 전송되는 전자 메일 메시지의 본문으로 사용하는 파일에 대한 액세스를 제한합니다. 이 파일은 MailDefinition 클래스의 BodyFileName 속성에 의해 정의됩니다.

참고 항목

작업

방법: IIS 6.0에서 SMTP 가상 서버 설치 및 구성

개념

웹 응용 프로그램의 기본 보안에 대한 유용한 정보

표준 컨트롤 보안

멤버 자격 보안

기타 리소스

멤버 자격을 사용하여 사용자 관리

ASP.NET 웹 사이트 보안

유효성 검사 서버 컨트롤 구문

암호화 서비스