DetailPage-MSS-KB

기술 자료

기술 자료: 299987 - 마지막 검토: 2006년 9월 5일 화요일 - 수정: 5.1

 
이 문서는 이전에 다음 ID로 출판되었음: KR299987
알림
모든 사용자는 Microsoft Windows Server 2003에서 실행 중인 Microsoft Internet Information Services(IIS) 버전 6.0으로 업그레이드하는 것이 좋습니다. IIS 6.0에서는 웹 인프라 보안이 크게 향상되었습니다. IIS 보안 관련 항목에 대한 자세한 내용을 보려면 다음 Microsoft 웹 사이트를 방문하십시오.
http://www.microsoft.com/korea/technet/iis/default.asp (http://www.microsoft.com/korea/technet/iis/default.asp)

이 페이지에서

요약

이 문서에서는 ASP(Active Server Pages) 응용 프로그램에 대해 폼 기반 보안을 구현하는 방법을 단계별로 설명합니다. 응용 프로그램의 보안이 향상된 경우, 인증된 사용자만 허용하려는 경우 및 사용자가 내부 도메인에 속하지 않는 경우(예: 인터넷 사용자)에 이 메커니즘을 사용할 수 있습니다. 이 예제에서는 데이터베이스를 사용하여 사용자 정보를 저장한 다음 데이터베이스를 통해 사용자가 유효한지 확인합니다.

전제 조건

  • Microsoft Windows NT 4.0 Workstation, Windows NT 4.0 Server, Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server 또는 Microsoft Windows Server 2003
  • Windows NT 4.0을 실행하는 컴퓨터의 경우 Microsoft Internet Information Server(IIS) 4.0, Windows 2000을 실행하는 컴퓨터의 경우 Microsoft Internet Information Services(IIS) 5.0 또는 Windows Server 2003을 실행하는 컴퓨터의 경우 Microsoft Internet Information Services(IIS) 6.0
  • Microsoft SQL Server 6.5 이후 버전의 SQL Server

이 응용 프로그램을 디자인하는 방법

이 절에서는 ASP 웹 응용 프로그램에서 폼 기반의 보안 또는 사용자 지정 보안을 구현하는 데 필요한 단계를 간략히 설명합니다.
  1. 사용자에게 로그온 폼을 제공합니다.
  2. 사용자 데이터베이스에 저장되어 있는 사용자 정보를 기준으로 사용자 자격 증명이 유효한지 검사합니다.
  3. 세션 변수를 만들고 해당 값을 사용자 ID로 설정합니다.
  4. 이후에 사용자가 수행하는 모든 요청에 대해 이 세션 변수의 값이 빈 문자열("")이 아닌지 점검하여 사용자가 로그온되어 있는지 여부를 확인합니다.
  5. 해당 변수가 비어 있으면 사용자가 유효한 사용자가 아니거나 세션에서 로그오프된 것입니다. 해당 변수가 비어 있으면 사용자를 로그온 페이지로 리디렉션합니다.
  6. 사용자 정보가 데이터베이스에 없기 때문에 로그온에 실패하면 해당 사용자가 사이트에 아직 등록되지 않은 것일 수 있습니다. 이 경우에는 사용자를 사이트에 등록할 수 있도록 Register.asp 페이지로 리디렉션합니다. 사용자가 등록을 마치면 해당 사용자의 정보가 사용자 데이터베이스에 추가됩니다.
  7. 사용자가 세션에서 로그오프할 수 있도록 로그온 페이지를 제외한 모든 페이지에 로그오프 페이지에 대한 링크를 제공합니다. 이 페이지는 사용자 ID에 빈 문자열("")을 할당하여 사용자 ID를 보유하고 있는 세션 변수를 지웁니다.

사용자 데이터베이스 테이블 만들기

  1. 시작, 실행을 차례로 누르고 열기 상자에 notepad를 입력한 다음 Enter 키를 눌러 메모장을 시작합니다.
  2. 다음 SQL 스크립트를 반전 표시하여 모두 선택하고 선택한 스크립트를 마우스 오른쪽 단추로 누른 다음 복사를 누릅니다. 메모장에서 편집 메뉴의 붙여넣기를 누릅니다.
    CREATE TABLE [Users] (
    	[uid] [varchar] (25) NOT NULL ,
    	[password] [varchar] (25) NOT NULL ,
    	CONSTRAINT [PK_Users] PRIMARY KEY  CLUSTERED 
    	(
    		[uid]
    	)  ON [PRIMARY] 
    ) ON [PRIMARY]
    GO
    					
  3. 파일 메뉴에서 저장을 누릅니다. 파일 이름 상자에 User.txt를 입력합니다.
  4. 시작을 누르고 프로그램, Microsoft SQL Server를 차례로 가리킨 다음 쿼리 분석기를 누릅니다. SQL Server에 연결 대화 상자에서 SQL Server를 실행 중인 서버의 이름, 사용자 ID 및 암호를 지정하여 SQL Server에 연결합니다.
  5. 파일 메뉴에서 열기를 누릅니다. 열기 대화 상자의 파일 형식 상자에서 모든 파일(*.*)을 누릅니다. 목록에서 User.txt를 누른 다음 열기를 누릅니다.
  6. 도구 모음의 데이터베이스 상자에서 이 테이블을 만들려는 데이터베이스를 선택합니다. 이 목적에 맞는 데이터베이스가 없으면 Pubs를 눌러 예제 Pubs 데이터베이스에 이 테이블을 만듭니다.
  7. 데이터베이스를 선택한 후에 쿼리 메뉴에서 실행을 눌러 쿼리를 실행합니다. 이렇게 하면 선택된 데이터베이스에 Users 테이블이 만들어집니다.

가상 디렉터리 만들기 및 구성

  1. Windows 탐색기에서 웹 루트 (기본적으로 웹 루트는 SystemDrive:\Inetpub\Wwwroot임) 아래에 폴더를 만듭니다. 폴더 이름을 ASPSecureAPP로 지정합니다.
  2. 인터넷 서비스 관리자 MMC(Microsoft Management Console)를 엽니다.

    참고 Windows NT 4.0에서 이 MMC의 이름은 인터넷 서비스 관리자로 지정됩니다.
    • Windows 2000 또는 Windows Server 2003을 실행 중인 컴퓨터에서 인터넷 서비스 관리자를 열려면 시작, 실행을 차례로 누르고 열기 상자에 inetmgr을 입력한 다음 Enter 키를 누릅니다.
    • Windows NT 4.0을 실행 중인 컴퓨터에서 인터넷 서비스 관리자를 열려면 다음과 같이 하십시오.
      1. 시작을 누르고 프로그램, Windows NT 4.0 Option Pack을 차례로 가리킨 다음 Microsoft Internet Information Server를 누릅니다.
      2. 인터넷 서비스 관리자를 누릅니다.
  3. 컴퓨터를 확장한 다음 기본 웹 사이트를 확장합니다. 1단계에서 만든 ASPSecureAPP 폴더를 마우스 오른쪽 단추로 누른 다음 등록 정보를 누릅니다.
  4. 등록 정보 대화 상자의 디렉터리 탭에 있는 응용 프로그램 설정 구역에서 만들기를 눌러 해당 디렉터리를 응용 프로그램으로 표시합니다.

예제 페이지 만들기

참고 메모장을 사용하여 이러한 페이지를 만드는 경우 파일을 저장할 때 다른 이름으로 저장 대화 상자의 파일 형식 상자에서 모든 파일을 눌러야 합니다.

Logon.asp

이 페이지에는 해당 사이트에 액세스하기 위한 사용자 이름과 암호를 입력할 수 있습니다.

다음 코드를 새 ASP 페이지에 복사하고 해당 파일을 Inetpub\Wwwroot 디렉터리의 ASPSecureAPP 폴더에 Logon.asp로 저장합니다.
<%
'The following three lines of code are used to make sure that this page is not cached on the client.
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1
%>
<html><body>
<form action="Validate.asp" method="post">
<P>
Login ID:&#xa0;&#xa0;  <INPUT type=text id=UID  name=UID> <br>
Password:&#xa0;&#xa0;<input type="password" id="passwd" name="passwd"> 
</P>
<input type="submit" value="Logon" id="submit1" name="submit1">
</form>
</body></html>
				
Validate.asp

사용자가 응용 프로그램에 로그온하기 위해 로그온 정보를 제공하면 이 페이지에서는 사용자 정보가 유효한지 확인한 다음 사용자를 적절한 페이지로 리디렉션합니다.

다음 코드를 새 ASP 페이지로 복사하고 유효한 값을 포함하도록 연결 문자열 매개 변수를 변경합니다. 연결 문자열 매개 변수는 다음과 같습니다.
  • User ID
  • Password
  • Initial Catalog
  • Data Source
해당 파일을 Inetpub\Wwwroot 디렉터리의 ASPSecureAPP 폴더에 Validate.asp로 저장합니다.
<%
Response.Buffer=true

'The following three lines of code are used to make sure that this page is not cached on the client.
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1

Dim userid
Dim Pwd
'Assign the user ID to this variable. The user provides the user ID.
userid= Request.Form("UID")
'Check whether userid is an empty string. If it is empty, redirect to Logon.asp.
'If it is not empty, connect to the database, and validate the user.

if userid <> "" then
    pwd = Request.Form("passwd")
	
    Dim Cn
    Dim Rs
    Dim StrConnect

'Specify the connection string to access the database.
'Remember to change the following connection string parameters to reflect the correct values
'for your SQL server.
    StrConnect = "Provider=SQLOLEDB.1;User ID=<username>;Password=<strong password>;Initial Catalog=pubs;" & _
    "Network Library=dbmssocn;Data Source=servername"

    Set Cn = Server.CreateObject("ADODB.Connection")
    Cn.Open StrConnect
    Set Rs = Server.CreateObject("ADODB.Recordset")
    Rs.Open "Select * from Users where uid='" & userid & "'",Cn
'Check to see whether this user ID exists in your database.
    If Not Rs.EOF then
        If strcomp( pwd, Rs.Fields("password").value , 1) = 0 then
'Password is correct. Set a session variable, and redirect the user to a Default.asp page
'or the main page in your application.
            Session("UID") = userid
            Response.Redirect "Default.asp"
            Response.End
        Else
'Password is incorrect. Redirect the user to the logon page.
            Response.Redirect "Logon.asp"
            Response.End
        End if
    Else
'If the user is not in your database, point him or her to the Register.asp page
'so that he or she can register at your Web site to access your application.
        Response.Redirect "Register.asp"
        Response.End
    End if
Else
    Response.Redirect "Logon.asp"
    Response.End
End if

%>
				
Register.asp

이 페이지에서는 해당 사이트에 액세스하기 위한 사용자 ID와 암호를 등록할 수 있습니다.

다음 코드를 새 ASP 페이지로 복사하고 유효한 값을 포함하도록 연결 문자열 매개 변수를 변경합니다. 연결 문자열 매개 변수는 다음과 같습니다.
  • User ID
  • Password
  • Initial Catalog
  • Data Source
해당 파일을 Inetpub\Wwwroot 디렉터리의 ASPSecureAPP 폴더에 Register.asp로 저장합니다.
<%
Response.Buffer=true

'The following three lines of code are used to make sure that this page is not cached on the client.
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1

'Check whether user has submitted user name and password so that you can 
'add that user to the users database and register him or her as a valid 
'user to use this application.
'This is just the minimal code that you need. You can customize this the way you want.
Dim pwd
Dim userid

userid = Request.Form("uname")
pwd = Request.Form("pwd")

If userid <> "" then
    If  pwd <> "" then
        Dim Cn
        Dim Rs
        Dim StrConnect

'Specify the connection string to access the database.
'Remember to change the following connection string parameters to reflect the correct values
'for your SQL server.
        StrConnect = "Provider=SQLOLEDB.1;User ID=<username>;Password=<strong password>;" & _
        "Initial Catalog=pubs;Network Library=dbmssocn;Data Source=servername"

        Set Cn = Server.CreateObject("ADODB.Connection")
        Cn.Open StrConnect
        Set Rs = Server.CreateObject("ADODB.Recordset")
        Rs.Open "Select * from Users where uid='" & userid & "'",Cn,3
        If Rs.RecordCount>0 then
            Response.Write "The Username that you entered has already been taken by someone else."
            Response.Write "Use a different Username."
            Set Rs = Nothing
            Set Cn = Nothing
        Else
            Dim records
            Cn.Execute "INSERT INTO USERS1 (uid,password) VALUES" & _
            "('" & userid & "','" & pwd & "')" , records
            If records=1 then
                Response.Write "You have been registered successfully."
                Set Rs = Nothing
                Set Cn = Nothing
                Session("UID")= userid
                Response.Redirect "Default.asp"
                Response.End 			
            Else
                Response.Write Err.Description
                Set Rs = Nothing
                Set Cn = Nothing
                Response.End 			
            End if
        End if
    Else
    Response.Write "Password is empty. Could not register. Try again."
    End if
End if
%>

<html>
<head>
<script language="javascript">
function callsubmit()
{

if (frm1.pwd.value==frm1.pwdc.value) {
frm1.submit();
}
else
{
alert("Password does not match. Re-enter the password");
}

}
</script>
</head>
<body>
<form action="" method="post" id=frm1 name=frm1>
<P>
Login ID:&#xa0;&#xa0;  <INPUT type=text id=uname  name=uname> <br>
Password:&#xa0;&#xa0;<input type="password" id="pwd" name="pwd"> <br>
Confirm Password:&#xa0;&#xa0;<input type="password" id="pwdc" name="pwdc"> 
</P>
<input type="button" value="Register" id="submit1" name="submit1" onclick=javascript:callsubmit();>
</form>
</body>
</html>
				
Logoff.asp

이 페이지에서는 사용자가 로그오프할 수 있습니다.

다음 코드를 새 ASP 페이지에 복사하고 해당 파일을 Inetpub\Wwwroot 디렉터리의 ASPSecureAPP 폴더에 Logoff.asp로 저장합니다.
<%
Response.Buffer=True

'The following three lines of code are used to make sure that this page is not cached on the client.
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1

'Set the session variable to an empty string and also destroy the session to make
'to complete the user session.
Session("UID")=""
Session.Abandon
Response.Redirect "Logon.asp"
Response.End
%>
				
Default.asp

이 페이지를 사용하여 사용자가 만든 다른 여러 페이지를 테스트할 수 있습니다.

다음 코드를 새 ASP 페이지에 복사하고 해당 파일을 Inetpub\Wwwroot 디렉터리의 ASPSecureAPP 폴더에 Default.asp로 저장합니다.
<%
'The following three lines of code are used to make sure that this page is not cached on the client.
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1

if session("UID")="" then 
    Response.Redirect "Logon.asp"
    Response.End
else
    Response.Write "You are logged on as " & session("UID") & "<br>"
end if
%>
<HTML>
<BODY>
<A HREF="Logoff.asp">Click here to log off</A>
<BODY>
</HTML>
				

페이지에 유효성 검사 코드 추가

다음 코드는 사용자가 웹 사이트에 이미 로그온한 후 아직 로그오프하지 않았는지 여부를 확인합니다.

이 코드 부분을 Logon.asp 페이지와 Validate.asp 페이지를 제외한 보안이 향상된 각 ASP 페이지에 복사합니다. Logon.asp 페이지나 Validate.asp 페이지에는 이 코드를 추가하지 마십시오. 이 코드가 각 페이지의 맨 처음에 나타나도록 코드를 맨 위에 붙여 넣어야 합니다.
<%
'The following three lines of code are used to make sure that this page is not cached on the client.
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1

if session("UID")="" then 
    Response.Redirect "Logon.asp"
    Response.End
end if
%>
				

이 응용 프로그램의 작동 방식

기본적으로 이 응용 프로그램은 자격 증명을 제공하지 않고도 누구나 볼 수 있는 두 개의 페이지(Logon.asp 및 Register.asp)를 포함합니다. 나머지 페이지를 보려면 유효한 사용자 ID와 암호를 사용하여 로그온해야 합니다. 따라서 사용자가 로그온 정보가 필요한 페이지를 직접 찾아 보는 경우 Logon.asp 페이지로 리디렉션됩니다. Logon.asp 페이지에서 사용자는 유효한 사용자 ID와 암호를 입력해야 합니다. 암호가 올바르지 않으면 다시 로그온을 시도할 수 있습니다.

해당 사용자의 사용자 ID와 암호가 데이터베이스에 없으면 사용자는 응용 프로그램을 사용하도록 등록할 수 있는 Register.asp 페이지로 리디렉션됩니다. 사용자가 Register.asp 페이지를 통해 웹 사이트에 등록하면 사용자의 정보는 해당 사용자가 유효한지 확인하는 데 사용되는 데이터베이스에 입력됩니다.

문제 해결

  • 요구 사항 및 이 응용 프로그램에 적용되는 보안 수준에 따라 Logon.asp에서 SSL(Secure Sockets Layer) 암호화를 사용하여 사용자 자격 증명이 일반 텍스트로 전달되지 않게 할 수 있습니다.
  • 이러한 사용자 계정은 Windows 계정에 매핑되지 않습니다. 따라서 Windows 계정을 사용하여 이 응용 프로그램에 직접 로그온할 수 없습니다.
  • 이 보안 메커니즘은 ASP 세션 기반 정보를 활용하므로 쿠키가 설정되지 않은 사용자에게는 적용되지 않습니다.

참조

자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
172138  (http://support.microsoft.com/kb/172138/ ) HOWTO: IIS 가상 디렉터리 만들기
282060  (http://support.microsoft.com/kb/282060/ ) 인터넷 정보 서비스 보안을 위한 리소스
299970  (http://support.microsoft.com/kb/299970/ ) HOWTO: NTFS 보안 기능을 사용하여 IIS 4.0 또는 5.0에서 실행되고 있는 웹 페이지 보호




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹 (http://support.microsoft.com/newsgroups/default.aspx) 에 참여하시기 바랍니다.

본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Active Server Pages 4.0
키워드: 
kbaspobj kbdatabase kbhowtomaster kbsecurity KB299987
폐기된 기술 자료 문서더 이상 지원되지 않는 제품의 KB 내용에 대한 고지 사항
이 문서에서는 Microsoft에서 더 이상 지원하지 않는 제품에 대해 설명합니다. 따라서 이 문서는 "있는 그대로" 제공되며 업데이트되지 않습니다.
공유
추가 지원 옵션
Microsoft Community 지원 포럼
직접 문의하기
Microsoft Certified Partner 찾기
Microsoft Store