관리 메뉴

IT 쟁이

ASP.NET 인증 및 허가 -로그인 페이지 만들기 본문

ASP.NET/일반

ASP.NET 인증 및 허가 -로그인 페이지 만들기

클라인STR 2008. 1. 17. 02:06

 Window 통합 인증 - Windows의 사용자 계정을 기반으로 인증을 처리하는 방식이다. 인증을 통과하기 위한 사용자는 NT/2000 계열에 적정한 계정을 보유하고 있어야 한다. 이 방식은 대단히 안전한 방식이기는 하지만 IE에서만 지원이 되고, 또한 모든 사용자들이 Windows에 계정을 보유하고 있어야 한다는 제한 때문에 인트라넷과 같은 환경에서만 적합하다고 볼 수 있다.

폼 기반 인증 - 인터넷에서 가장 널리 사용되는 인증 방식으로 , 웹 페이지의 인증 폼에 회원 아이디 와 비밀번호를 입력하여 인증을 거치는 방식이 폼 기반 인증의 대표적인 케이스이다. 각각의 사용자 인증은 별도로 저장되어져 있는 정보(DB, XML)을 기반으로 처리되며, 인증 정보를 쿠키에 저장하여 사용하기에 쿠키 기반 인증 이라고도 불린다. 이 방식의 장점은 인증을 위한 UI를 사용자 정의할 수 있다는 것이다.

Web.config에 파일을 더블클릭하면 파일중간에 다음과 같은 부분을 확인 할 수 있다.


 <!--  인증
          이 섹션에서는 응용 프로그램의 인증 정책을 설정합니다. 가능한 모드로는 "Windows",
          "Forms", "Passport" 및 "None"이 있습니다.

          "None"을 지정하면 인증이 수행되지 않습니다.
          "Windows"를 지정하면 IIS가 인증 설정에 따라 인증을 수행합니다(기본, 다이제스트 또는 Windows 통합 인증).
           익명 액세스는 IIS에서 비활성화시켜야 합니다.
          "Forms"를 지정하면 사용자에게 자격 증명을 입력할 수 있는 사용자 지정 양식(웹 페이지)를
           표시하여 사용자를 응용 프로그램에서 인증합니다. 사용자 자격 증명 토큰은 쿠키에 저장됩니다.
          "Passport"를 지정하면 인증이 Microsoft에서 제공하는 중앙 집중식 인증 서비스를 통해 수행되며,
           이 서비스는 멤버 사이트에 대해 단일 로그온과 핵심 프로필 서비스를 제공합니다.
    -->
    <authentication mode="Windows" />

<authentication>라는 요소가 바로 인증을 위해 사용할 수 있는 섹션이다. 이 요소는 mode라는 필수 특성을 가지고 있으며, 이 특성에 사용할 수 있는 값으로는 다음과 같은 것들이 있다.


폼 기반 인증은 쿠키를기반으로 사용자의 인증여부를 검사하므로, 쿠키 기반의 인증이라고도 이야기한다. 폼 기반의 인증은 크게 인증(Authentication) 과정과 허가 (Authorization) 과정으로 나누어진다. 인증 과정에서는 사용자가 올바른 신원(아이디와 비밀번호를 가진) 사용자인지를 확인하는 작업을 한다. 해서 , 인증에 성공한  사용자에 대해서는 그 인증 정보를 브라우저의 쿠키에 저장하며, 이후의 페이지 요청에 대해서는 그 인증 쿠키를 사용하여 인증 과정을 자동 통과하게 한다.

만일 인증을 거치지 않은 사용자라면 인증 쿠키가 없을 것이므로, 먼저 인증 과정을 수행할 수 있도록 로그인 페이지로 자동 이동하며, 로그인 페이지에서 정상적으로 인증을 수행한 경우에 한해서, 인증 쿠키를 부여 받는다. 그리고 이 후로의 페이지 요청에 대해서는 마찬가지로 그 인증 쿠키를 이용하여 인증 과정을 자동 통과하게 된다.

허가 (Authorization) 과정은 사용자가 요청한 리소스에 대해 접근할 수 있는 권한이 있는지를 검사하는 과정이다. 만일 ,사용자가 해당 자원에 접근할 수 있는 권한이 있다면, 그 페이지를 받아 볼수 있고, 적절한 권한이 없다면 페이지를 접근할 수 없을 것이다.
<authentication mode="Forms">
  <forms name=".AUTHCOOKIE" loginUrl="Login.aspx" protection="ALL" />
   
    </authentication>


<forms>태그 구역은 사용자 지정 폼 기반의 인증을 위해서 반드시 설정해 주어야 하는 부분으로 그 구역에서 지정할 수 있는 특성으로는 다음과 같은 것들이 있다.


name    인증에 사용할 HTTP 쿠키의 이름을 지정한다. 기본적인 name의 값은 .ASPXAUTH 이다.

loginUrl   인증되지 않은 사용자가 어플리케이션의 asp.net 페이지를 요청했을 경우, 로그온을 위해 이동할 페이지의 URL

protection        All   인증에 통과할 경우 부여되는 쿠키값을 보호하기 위해서 쿠키값에 대해 데이터 유효성 검사 및 암호화를 사용한다. 이는 기본값이며, 권장되는 값이다.

protection      None 인증 쿠키에 대해 어떠한 검증 및 암호화도 수행하지 않는다. 보안적으로 좋지 않은 방법이지만, 이를 사용할 경우 성능은 더 좋은 편이다. 보안이 중요하지 않은 사이트에 사용할 수 있는 방법이다.

protection   Encryption  인증 쿠키를 암호화 하지만, 데이터의 유효성에 대해서는 검증하지 않는다.

protection  Validation   인증 쿠키에 대해 유효성 검증은 수행하지만, 암호화는 하지 않는다.

timeout                 인증 쿠키값이 지속될 시간을 분 단위로 지정한다. 기본값은 30분이다.

path                 쿠키의 경로를 지정한다. 기본값은 백슬래시(\)이다.



인증만으로는 요청 자원에 대한 접근을 제어할 수 없으므로 허가와 관계된 요소를 설정해 주어야 한다.


    <authorization>
        <allow users="*" /> <!-- 모든 사용자를 허용합니다. -->
            <!--  <allow     users="[쉼표로 구분된 사용자 목록]"
                             roles="[쉼표로 구분된 역할 목록]"/>
                  <deny      users="[쉼표로 구분된 사용자 목록]"
                             roles="[쉼표로 구분된 역할 목록]"/>
            -->
    </authorization>



<authorization>  요소는 사이트에 자원에 접근할 수 있는 사용자들을 설정해 줄 수 있다.

<allow>  자원에 대한 접근을 허용한다.
            .users  접근을 허용할 사용자들의 목록. 여러 명일 경우 콤마를 구분자로 나열하며, 물음표(?)는 인증되지 않은 익명 사용자 를 대신사용하여 사용할 수 있고, 별표는 모든 사용자를 의미하는 문자로 사용된다.
             .roles 접근을 허용할 롤의 목록
             .verbs  접근을 허용할 HTTP 전송 메서드의 목록. 사용할 수 있는 값으로는 GET, POST, HEAD 등이 있다.

<deny> 자원에 대한 접근을 허용한다.
            .users  접근을 거부할 사용자들의 목록
            .roles 접근을 거부할 롤의 목록
            .verbs 접근을 거부할 HTTP 전송 메서드의 목록.


    <authorization>
        <allow users="admin, taeyo" />    //인증 아이디값인 admin 와 taeyo  인 사용자에 대해서만 허용한다.
        <deny users="*" />
         
    </authorization>


    <authorization>
        <deny users="?" />         인증되지않은 사용자의 접근을 거부한다.
         
    </authorization>


    <authorization>
        <allow users="*" />
         <deny users="taeyo" />  //언뜻보면 taeyo인 사용자를 제외한 모든 유저를 허용할것같지만 그렇지않다.
         //사용자에게 부여된 권한은 가정먼저 선언된 권한을 따라간다.
         
    </authorization>



Web.config 다음과 같이 작성한다.




login.aspx 페이지를 생성한다.

사용자 삽입 이미지



인증 버튼을 더블클릭하여 코드 비하인드 페이지에 클릭 이벤트를 작성한다.

private void Button1_ServerClick(object sender, System.EventArgs e)
  {
   string id = this.txtID.Value;
   string pwd = this.txtPwd.Value;

   if(id =="falhed" && pwd =="1")
   {
    FormsAuthentication.SetAuthCookie(id, false);
    string url = FormsAuthentication.GetRedirectUrl(id,false);
    Response.Redirect(url);

//    lblMsg.Text = "인증 되었습니다";
   }
   else
   {
    lblMsg.Text = "로그인에 실패하였습니다";
   }
  }


FormsAuthentication 개체는 인증 처리와 관계된 유용한 메서드들을 제공하는 클래스 이다.
using System.Web.Security; - 네임스페이스


SetAuthCookie() 현재 사용자를 인증된 사용자로 만드는 역할을 담당한다.
첫번째 인자로 지정된 ID를 가지고, 현재 사용자를 인증된 사용자로 만드는 것이다.

두번째 인자는 쿠키를 클라이언트의 머신에 파일 쿠키로써 저장할것인지 아니면 메모리 쿠키로써 저장할 것인지를 지정하는 부분이다. 그 값이 true가 되면 쿠키는 파일 쿠키가 되어 일정 기간동안 클라이언트의 하드에 저장이 되며, 그 기간 내에는 새로운 브라우저로 여러 번 반복해서 접근해도 인증이 자동 통과된다.
그 값이 false라면 쿠키는 메모리상에만 존재하는 임시 쿠키가 되므로, 현재의 브라우저를 사용할 경우에만 인증이 통과되고 새로운 브라우저로 어플리케이션에 접근하면 다시금 인증 과정을 거치게 된다.
대부분의 사이트는 인증의 보안성을 위해 파일 쿠키보다는 메모리 쿠키를 사용하는 편이기에 false로 지정했다.

페이지를 생성하여 main.aspx 페이지를 브라우저로 불러오기를 하면 인증이 되지 않았기 때문에 Login.aspx
페이지가 수행 된다.


FormsAuthentication.GetRedirectUrl(id,false);
원래 요청했던 페이지를 이동해주는 메서드 이다. 이 메서드를 사용하면 원래 요청했던 페이지의 경로가 어떻게 되는지 알수 있다.
GetRedirectUrl() 첫번째 인자는 사용자이름의 아이디 이고, 두 번째 인자는 쿠키의 설정이다. SetAuthCookie() 메서드와 동일한 경우 이다.

사용자가 요청한 페이지가 login.aspx 자신일 경우에는 GetRedirectUrl 메서드가 Default.aspx라는 기본 경로를 리턴해준다.
RedirectFromLoginPage()메서드를 사용하면 인증 쿠키를 사용자에게 부여하고, 사용자가 원래 요청했던 페이지의 정보를 동시에 알 수 있다.

FormsAuthentication.RedirectFromLoginPage(id, false);

web.config를 사용하여 DB를 사용하지 않고 사용자를 지정할 수 있다.

<credentials> 요소를 사용할경우 비하인드 코드를 다음과 같이 수정한다.

if(FormsAuthentication.Authenticate(id, pwd))
{
  FormsAuthentication.RedirectFromLoginPage(id, false);
}

Authenticate()메서드는 인자로써 사용자 아이디와 비밀번호를 입력받으며 그 데이터를 가지고 <credentials>요소 내에 기록되어 있는 인증 사용자 정보와 비교, 확인 한다. 그리고 입력받은 값과 동일한 아이디, 비밀번호를 가진 사용자가 해당 credentials
에 존재한다면 true를 그렇지 않으면 false를 리턴한다.

이 메서드는 단지 인증 사용자의 검증에사용되는 메서드이며, 인증 쿠키를 부여한다거나 하는 작업은 하지 않는다.

ASP.NET은 <credentials> 요소 내부의 사용자 정보 중 비밀번호를 마치 암호처럼 만들어서 사용할 수 있게 하는 기능도 지원해 준다. 이를 해싱이라고 한다. ASP.NET 에서는 2개의 해시알고리즘(SHA1, MD5)를 제공한다.

해시 알고리즘은 특정 길이의 이진값을 해시값이라고 하는 고정 길이의 작은 이진값으로 변환하는 것을 의미한다. 그렇게 얻어지는 해시값은 특정데이터에 대해 고유한 값을 가지게 된다. 즉, 특정 텍스트를 해시하면 마치 암호처럼 보이는 특별한 해시값을 얻을수 있다는 이야기이다.(그러나 역으로 해시값을 가지고 역으로 원래의 값을 알아내는것은 사실상 불가능하다.)

간단하게 이야기하면, 사용자의 비밀번호를 SHA1 해시 알고리즘이나 MD5 해시 알고리즘을 통해 암호처럼 만들어서 그 해시값을 원래의 비밀번호를 대신하여 사용할 수 있다는 이야기이다. 예를 들면 다음과 같이 각각의 비밀번호를 SHA1 해시 알고리즘을 사용하여 얻어낸 해시값으로 대체한 경우이다.


테스트 페이지로 웹폼을 하나생성하고 다음 코드를 추가한다.
private void Page_Load(object sender, System.EventArgs e)
  {
   // 여기에 사용자 코드를 배치하여 페이지를 초기화합니다.
   string pwd = "kevin";
   this.Label1.Text = FormsAuthentication.HashPasswordForStoringInConfigFile(pwd,"SHA1");
  }

실행하면 브라우저에 다음과 같은 값이 출력된다.

브라우저에 출력된 값은 Kevin 이라는 텍스트를 SHA1 알고리즘으로 해시한 값이다.
FormsAuthentication 개체의 HashPasswordForStoringInConfigFile 메서드는 지정된 알고리즘에 따라 해시값을 만들어 주는 함수이다.첫번째 인자로는 변환할 값을 넣어주고 두 번째 인자로는 어떤알고리즘을 사용하여 해시할 것인지를 알려주면 된다. 여기에는 SHA1 이나 MD5를 사용할 수 있다.


 

특정 자원에 대한 접근 제한 : <location> 요소

<location> 요소는 특정 자원을 제한하기 위해서 사용할 수  있는 요소이다. 중요한 것은 Web.config  파일 내에서 이 요소가 자리하는 위치인데, 지금까지의 다른 요소들은 <system.web> 요소 내부에 위치했던 것에 반해 이 요소는 그 외부에 존재해야만 한다. 예를 들면 다음과 같다.



<location> 요소를 사용하기 위해서는 반드시 path 특성을 설정해야만 하는데, 이는 현재 어플리케이션의 하위 디렉터리나, 특정 파일 경로가 될 수 있다. 위의 예에서는 path를 Navigator 디렉터리로 지정하고 있다. 즉 navigator 디렉터리에 대해서는 별도의 설정을 하겠다는 의미가 된다.

<location>요소의 하위로는 <system.web> 요소가 따르게 되며, 그 안에는 앞에서 배운 설정들을 같은 방식으로 사용할 수 있다. 위의 예에서는 허가(authorization)와 관계된 설정만 을 지정하고 있다.



즉 navigator 디렉터리는 admin이라는 아이디를 갖는 사용자 외에는 그 누구도 접근하지 못하게 막겠다는 것이다.

Navigator 디렉터리 내의 모든 자원은 아이디가 admin인 사용자 외에는 누구 도 접근 할 수 없게 된다.

이를 약간 수정하여서 인증이 된 회원은 Login.aspx  페이지를 다시 요청하는것을 수정하여 Default.aspx 페이지를 요청하는 걸로 수정해 보자

현재 인증이 된 사용자인지 아닌지를 파악하고 인증이 된 사용자라면 default.aspx 페이지를 분기시키는 코드를 추가해야한다.
Page 클래스의 User 속성을 사용하면 된다. Page객체의 User는 현재 페이지를 요청하는 사용자에 대한 정보를 가지고 있다. 또 User속성이 가진 것중 중요한 속성은 Identity가 있다. Identity속성 또한 내부적으로 개체로써 제공되는데 이 개체가 가지고 있는 속성들을 통해서 우리는 사용자가 인증되었는지 인증되었다면 그 사용자의 이름은 무엇인지 등의 정보를 얻을 수 가 있다.

Authentication Type   - 사용자 인증 형식
IsAuthenticated         - 사용자기 인증 되었는지 여부를 나타내는 값
Name                       - 현재 사용자의 이름(일반적인 경우 ID)

이러한 속성의 값들은 사용자가 인증 처리를 통과함과 동시에 할당된다.
User.Identity.IsAuthenticated 값의 true , false 여부를 검사해서 확인할 수 있다.
Name 속성을 통해 아이디를 알 수 있다.





끝으로 현재 인증되지 않은 사용자가  Default.aspx 페이지를 요청할 경우 login.aspx 페이지가 요청 될 것이다.

Default.aspx 페이지에 별도의 설정을 추가하여 이 페이지에 대해서는 모든 사용자가 자유롭게 접근할 수 있도록 한다.





로그 아웃

FormsAuthentication.SignOut(); 메서드를 사용하여 현재 인증된 사용자를 로그아웃 시킨다.


사용자 삽입 이미지


로그인 후


사용자 삽입 이미지

참고 서적 = 태요의 ASP.NET with C# 1.0
Comments