본문 바로가기

ASP.NET

[ASP.NET] 보안 #1 - 인증과 권한 부여


ASP.NET의 '보안 - 인증과 권한 부여'에 대해 알아보겠습니다.

1. 인증과 권한 부여의 개념

인증은 특정 사용자가 유효한 사용자인지를 판단하는 과정을 의미합니다.
즉, 회원제 웹 사이트에서 회원에게만 공개되는 정보를 보려고 하려면 아이디와 암호를 입력해 로그인 과정을 거쳐야 합니다.
바로 이러한 과정을 인증(Authentication)이라고 합니다.

또 인증 받은 사용자(로그인한 사용자)와 인증을 받지 않은 사용자(비회원)는 콘텐츠에 접근 할 수 있는 자격에서 차이가 납니다.
회원과 비회원 모두 글을 읽을 순 있지만 비회원은 글을 쓸 수 없는 등의 차이가 있게 됩니다.
이렇게 웹 사이트에 접근하는 모든 사용자들은 웹 사이트 정책에 따라 콘텐츠에 대한 접근이 구분되는데 이것을 권한 부여(Authorization)라고 합니다.

별로 어려운 것이 없습니다.

이번엔 ASP.NET의 인증 종류에 대해서 알아보도록 합니다.

2. ASP.NET의 인증 종류

 인증 방식  설명
윈도우 기반(Windows-based) Windows의 권한 제어 방식을 웹 사이트에 그대로 적용한 인증 처리 방식
(주로 인트라넥 환경에서 사용)
폼 기반(Forms-based) HTTP 쿠키와 HTML 폼을 이용하여 인증. 폼 기반 인증은 ASP.NET에 제공하는 인증 관련 API를 사용할 수 있기 때문에 인증 처리를 쉽게 할 수 있음
Passport MS에서 제공하는 인증 서비스로 한 번의 로그인으로 여러 사이트에서 인증이 가능하도록 하는 서비스. 상용 서비스
사용자 지정 인증과 관련된 프로세스를 개발자가 직접 구현. 개발자가 원하는 대로 세세한 구현 가능 하지만 많은 개발 시간이 필요

※ 쿠키(Cookie)란?

쿠키는 사전적 의미로는 '비스킷', '납작한 과자' 등의 뜻을 가지고 있는데 컴퓨터 용어로 사용될 때는 인터넷 접속 시 사용자 정보를 클라이언트 PC에 저장하는 파일의 의미로 사용됩니다. 즉, 쿠키를 사용하면 각 사용자의 정보나 인증과 관련된 정보를 저장합니다. 어디에 접속하였는지 등이 쿠키에 저장이 되는 것이죠.

3. 폼 기반 인증

폼 기반 인증은 쿠키와 ASP.NET에서 제공하는 인증 관련 API를 사용해서 인증 처리를 하는 것을 말합니다.
아래는 폼 기반 인증 퍼리 과정을 나타낸 것입니다.
사용자의 요청에 의해 IIS를 거쳐 쿠키의 존재를 먼저 확인 합니다. 쿠키는 앞에서 말했 듯이 사용자의 정보나 인증과 관련된 정보를 저장하는 파일입니다. 만약 인증 쿠키가 존재한다면 페이지 접근 권한 여부를 묻게 되고, 페이지 접근 권한이 있다면 최종적으로 요청한 페이지에 접근하게 됩니다. 즉 로그인을 해서 권한을 부여 받았다는 정보가든 쿠키가 있으면 요청 페이지에 접근이 가능한 것입니다. 하지만 인증과정에서 인증 쿠키가 존재 하지 않으면 웹 사이트에서 로그인을 통해 인증을 해서 쿠키를 생성 해야겠죠?





폼 기반 인증의 예제를 통해 다시 한번 더 익혀보도록 할까요

[Web.config]


① : <authentication> 요소의 mode 특성을 Forms로 하여 폼 기반 인증을 사용하겠다고 명시를 먼저 합니다. name은 사용자 임의대로 정해주시면 되요.
loginUrl특성은 처음 인증(로그인)을 시도하려고 하는 페이지를 지정해 주는 것입니다. 반면에 defaultUrl 특성은 로그인 후 이동할 페이지 Url을 지정한 것이죠.

② : <authentication> 요소를 추가해서 웹 응용 프로그램 전체에 영향을 미치는 권한을 설정 해주어야 합니다.
<deny>, <allow>요소를 하위로 추가 할 수 있는데, 이 요소들은 각각, 접근거부와 접근 허용을 설정해 주는 것 입니다. User의 특성도 지정해 주는데
물음표(?)는 익명 사용자를 의미하는 것 입니다.

[Ex01_Default.aspx]


Ex01_Default.aspx는 인증이 되었을 때 나타나는 페이지입니다.

③ : User.Identity.Name을 통해 폼 기반 인증에서 인증된 사용자의 아이디(이름)을 가져올 수 있습니다. 인증이 되면 "(사용자 아이디나 이름)님 환영합니다!!!"라고 나타나겠죠.

④ : <로그아웃>이라는 버튼을 클릭 했을 시 실행되는 이벤트 처리기 입니다. FormsAuthentication 클래스의 SignOut()정적 메서드를 통해 생성된 인증 쿠키를 삭제하고 로그아웃 시키는 것입니다. 


 
Ex01_Login.aspx는 로그인 페이지 입니다.

⑤ : <로그인> 버튼 클릭 시 실행되는 이벤트 처리기입니다. 사용자가 입력한 아이디와 비밀번호가 모두 "aaaa"일 때 인증을 합니다. 이때 인증 쿠키가 생성 되죠. FormsAuthentication 클래스의 RedirectFromLoginPage()메서드는 두 개의 매개변수를 정의하는데 하나는 사용자 아이디를 나타내는 string 형식의 변수이고, 다른 하나는 쿠키 유지 여부를 나타내는 bool 형식의 변수입니다. 쿠키 유지 여부 값을 false로 넘겨주면 현재 브라우저를 닫을 때 인증 쿠키가 사라져 자동 로그아웃이 됩니다. 하지만 쿠키 유지 여부 값을 true로 넘겨주면 로그아웃 버튼을 통해 쿠키를 삭제하지 않는 이상 여러 브라우저를 띄우더라도 계속 로그인 상태가 유지되게 합니다. 

4. 권한 부여

앞에서 간단하게 설명했었는데요. 폼 기반 인증에서 권한 부여는 Web.config 파일의 <authorization>요소에서 지정합니다.
<deny>, <allow>로 접근 거부 및 허가를 지정해줍니다. 이 요소들은 users, roles라는 특성을 제공해 사용자와 역할별 접근 권한을 지정하는데 사용합니다.
사용할 때 *, ? 와 같은 특수문자를 사용합니다.

사용자 이름 설명
 * 모든 사용자를 의미합니다.(익명포함) 
 ?  익명 사용자를 의미합니다.

이제 <authorization>을 어떤식으로 사용하는지 알아보겠습니다. Web.config에 입력하셔야 합니다!!

모든 익명 사용자를 웹 사이트에 접근하지 못하게 (<deny>)하는 구문입니다.
 <authorization>

        <deny users ="?"/>

</authorization>


아이디(이름)가 'aaa', 'bbb'인 사용자만 접근을 허용(<allow>)하고 나머지 모든 사용자들(*)의 접근을 거부(<deny>)하게 합니다.
 <authorization>

        <allow users ="aaa, bbb"/>

        <deny users ="*"/>

</authorization>


roles를 사용해 Admins라는 역학을 가진 사용자만 접근을 허용(<allow>)하고 나머지 모든 사용자들(*)의 접근을 거부(<deny>)하게 합니다.
 <authorization>

        <allow roles ="Admins"/>

        <deny users ="*"/>

</authorization>

이와 같이 <deny>, <allow>요소와 users, roles 특성을 사용하면 웹 응용 프로그램 단위로 영향을 미치는 권한을 여러분이 원하는 대로 설정할 수 있습니다.
이번에는 <location>요소를 사용해 특정 페이지에만 권한 부여가 적용되도록 해보겠습니다.

<location>요소의 path 특성을 사용하면 지정한 특정 페이지에만 권한을 부여할 수 있습니다.
 <configuration>

        <system.web>

               <authorization>

                       <deny users ="?"/>

               </authorization>

        </system.web>

 

        <location path ="SuperAdminPage.aspx">

               <system.web>

                       <authorization>

                              <deny users ="*"/>

                       </authorization>

               </system.web>

        </location>

특정 페이지 뿐만아니라 특정 폴더 하위에 있는 모든 페이지에도 일괄적으로 권한 부여할 수 있습니다.

별반 다를 것 없이 parh특성에 특정 폴더를 지정하면 됩니다.
아래에서 secured 폴더 하위에 있는 모든 페이지에 SubAdmins 역학을 가진 사용자만 접근이 가능하도록 지정한 것을 보실 수 있습니다.

 <location path ="secured">

               <system.web>

                       <authorization>

                              <allow roles ="SubAdmins"/>

                              <deny users ="*"/>

                       </authorization>

               </system.web>

        </location>


다음시간엔 로그인 컨트롤을 사용해 보겠습니다.