ASP.NET에서의 쿠키 암호화
저번 기사인 ASP.NET에서의 사용자 방문 기록 추적에서 쿠키를 사용해서 사용자의 세션을 어떻게 유지하는지 본적이 있다. 또한 사용자의 개인정보를 쿠키에 담을때 주의해야할 사항에 대해서도 간단히 언급한 적이 있다.
쿠키는 웹기반 애플리케이션에서 사용자와 개발자 모두에게 편리함을 제공한다. 하지만 쿠키는 두가지 이유에서 보안상의 문제점이 있다. 하나는 여러분이 SSL을 사용하지 않는다면 쿠키의 데이터는 Request와 Response의 HTTP 헤더에 노출된채 전송된다. 이것은 특정 IP의 특정 포트의 패킷을 관찰할 수 있는 사람이면 쿠키의 데이터를 읽어낼 수 있다는 말이 된다. 두번째 이유는 쿠키 파일이 브라우져의 캐시 디렉터리에 저장된다는 것이다. 따라서 누군가가 여러분의 컴퓨터를 사용한다면 쿠키 파일을 열어서 데이터를 볼 수있다. 아래의 그림은 쿠키 파일을 열어본 예이다.
만약 다른 사람이 이 데이터를 보고 은행의 잔고를 거덜낸다면 쿠키의 보안이 왜 중요한지 공감할 수 있을 것이다.
만일 여러분이 쿠키 데이터를 본 적이 없다면 다음을 따라해보기 바란다. 인터넷 익스플로어의 도구 메뉴에서 인터넷 옵션을 선택한 다음 임시 인터넷 파일에서 설정을 누르자. 그리고 파일 보기를 누르면 임시 인터넷 파일이 나열되는데 이름 순으로 나열하여 Cookie의 앞자인 C까지 내려와보면 많은 쿠키 파일들을 볼 수 있다. 필자의 경우 1850개의 쿠키 파일이 있었다.
따라서 쿠키에는 절대 사용자의 개인 정보 같은 민간한 데이터는 저장하지 않도록 한다. 만약 쿠키에다 데이터를 꼭 저장해야 한다면 이 데이터를 암호화시켜야 한다.
기존의 ASP에서 쿠키의 데이터를 암호화하기 위해서는 서드파티 컴포넌트를 사용하여야 하였다. 아니면 여러분이 스스로 컴포넌트를 만들어서 사용하여야 하였다. 어쨌든 대부분은 문자를 ASCII 값으로 변경하는 Rot13 같은 단순한 기술등에 의지하여야 하였다. 그러나 불행하게도 이러한 기술들은 패킷 스니프에 대처할 만큼은 안된다. 다음은 ASP에서 Rot13 알고리즘을 적용한 예이다.
http://www.brettb.com/rot13_encoding_with_asp.asp
하지만 ASP.NET을 사용한다면 이제 이러한 빈약한 알고리즘을 구현해서 사용해야할 이유가 없다. 닷넷 프레임웍에서는 System.Security.Cryptography 네임스페이스에서 암호화 클래스를 제공해주기 때문이다. 이 네임스페이스에 대해서는 다음의 MSDN 글을 읽어보기 바란다.
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemsecuritycryptography.asp?frame=true
암호화
암호화에 대한 내용은 대단히 복잡하다. 사실 암호화는 데이터를 어떻게 보호할 것인가에 따라 복잡하게 된다. 게다가 필자는 암호화의 전문가도 아니다. 아마 이에 사용되는 수학적 지식을 모두 이해하고 있는 사람은 얼마되지 않을 것이다. 그리고 닷넷 프레임웍의 암호화 클래스에 대해서 적을 수 있는 사람은 이들 중 절반도 되지 않을 것이다.
다행히 우리는 이 복잡한 내용을 이해하고 있지 않아도 된다. 왜냐하면 닷넷 프레임웍은 대부분의 알고리즘을 쉽게 사용할 수 있는 방법을 제공해주기 때문이다. 먼저 쿠키의 데이터를 암호화하기 전에 암호화 클래스에 대해서 보도록 하고 어떠한 클래스가 쿠키의 데이터를 암호화하는데 적합한지 보도록 하겠다.
암호화란 무엇인가?
간단하게 말해서 암호화는 대상 문자열을 다른 문자열에 변환하여 집어넣어 단순한 방식으로는 원래의 문자를 판독해낼 수 없도록 하는 것이다. 이러한 처리는 키라고 불리는 문자열을 가지고 수행한다. 기술적으로 말하면 이 키는 수학적으로 쪼개져서 원래의 문자에 복잡하게 삽입된다. 때때로 Initialization Vector라는 문자로 키 문자를 삽입하기 전에 원래 문자를 섞어놓는다. 이것은 키 문자를 사용하였을 경우 단조로운 패턴에 의해 원래 문자가 노출되는 것을 방지하는데 도움을 준다. 물론 이 둘다 한번 사용으로 영구적 사용될 수 있는 것은 아니다. 키와 Initialization Vector 문자를 그대로 계속 사용한다면 그 알고리즘을 역으로 사용하여 원래 문자를 복구해낼 수 있기 때문이다.
암호화의 강도를 결정하는 것은 사용되는 키의 크기이다. 키 크기가 클수록 더욱 강력한 암호화를 할 수 있다. 일반적인 키 크기는 64bit(8byte), 128bit(16byte), 192bit(24byte), 256bit(32byte) 그리고 512bit(64byte)이다. 이러한 알고리즘을 크랙하는 방법은 모든 가능의 수만큼 키를 조합하여 마구잡이로 대입해보는 것이다. 64bit의 경우 72,057,594,037,927,936 (2^56 8bit는 패리티로 사용된다.)만큼의 조합이 생긴다. 따라서 여러분이 매우 성능이 좋은 컴퓨터가 아니라면 가장 작은 크기의 키를 사용하더라도 상당한 시간이 걸린다.
암호화 패턴
데이터를 암호화하는데 두가지의 방식이 있다. 하나는 대칭형(또는 개인키)이고 또 다른 하나는 비대칭형(또는 공개키)방식이다. 대칭형에서 암호화 기술은 데이터 교환의 두 주체(암호화하는 쪽과 복호화하는 쪽)가 꼭 하나의 개인키를 가지고 있어야 한다.
비대칭형에서의 암호화에서 복호화하는 쪽은 암호화한 쪽에게 공개키를 요청한다. 암호화한 쪽은 공개키를 생성하고 이를 요청한 쪽에 보내준다. 그러면 암호화한 쪽은 그 공개키를 사용하여 두번째 개인키를 생성한다. 이 새로운 개인키는 복호화하는 쪽에게 보낼 메시지를 암호화하는데 사용한다. 그리고 공개키를 사용하여 메시지를 해독한다. 만약 다른 쪽에도 암호화된 데이터를 보내야 된다면 다른 쪽에서도 새로운 공개키를 만들고 이에 대응하는 식으로 전송된다. 이러한 비대칭 기술은 SSL에서 사용된다.
우리가 볼 쿠키 암호화에서는 대칭형을 사용할 것이다. 암호화와 복호화가 서버의 같은 애플리케이션에 행하기 때문에 우리는 단지 하나의 개인키만 있으면 된다.
Cryptographic Service Providers
닷넷 프레임웍은 기본 대칭형 알고리즘 클래스에서 확장된 4가지 암호화 알고리즘을 제공한다.
- System.Security.Cryptography.DES (Data Encryption Standard)
- System.Security.Cryptography.TripleDES (Triple Data Encryption Standard)
- System.Security.Cryptography.RC2
- System.Security.Cryptography.Rijndael
우리가 볼 예제에서 우리는 DES와 TripleDES를 사용할 것이다. 이들 알고리즘은 Cryptographic Service Providers(CSP)로서 구분되어져 있는 래퍼 클래스를 통해 액세스 할 수 있다. 모든 CSP 개체들은 CreateEncryptor와 CreateDecryptor라는 두가지 중요한 메서드를 가지고 있다. 각각의 메서드는 개인키와 Initialization Vector를 위해 두개의 파라미터를 가진다. 또한 각각의 메서드는 ICryptoTransform 인터페이스로 알고리즘 개체를 반환한다. 이 개체는 CryptoStream 개체에 의해 사용될 것이다.(이에 대해서는 조금있다가 다룰 것이다.)
닷넷 프레임웍에서의 암호화에 대해서 좀 더 보고자 한다면 다음 링크의 MSDN문서를 참고하기 바란다.
http://msdn.microsoft.com/library/en-us/cpguide/html/cpconcryptographyoverview.asp?frame=true
키 크기 결정
DES는 키 크기가 64bit로 제한되어있기 때문에 약한 암호화 방식의 하나이다. 어쨌든 쿠키의 데이터를 암호화하는데는 이정도가 적격이다. TripleDES는 암호화를 세번 수행하기 때문에 키 크기가 128bit나 192bit로 DES에 비해 두세배는 크고 더욱 안전하다. 여러분이 어떠한 알고리즘을 선택하는 것과 함께 쿠키의 크기도 고려해야 한다. 여러분이 뒤에 예제를 보면 알겠지만 암호화된 데이터는 크기가 증가한다. 따라서 크기가 큰 키를 사용할 수록 더 큰 데이터가 나오게 된다. 이것은 쿠키의 크기는 4kb로 제한되어있기 때문에 중요하게 생각해야할 사항이다.
이를 대체할 다른 방법은 Input 태그의 hidden에 이를 임시적으로 유지시키는 것이다. 물론 여러분이 ASP.NET의 ViewState에 대해서 정확히 알고 있어야 한다. 추가적으로 ViewState는 기본 암호화를 제공한다. 웹폼의 ViewState는 기본적으로 데이터에 비대칭형 알고리즘의 일종을 사용한 해쉬 함수를 사용한다. 이것은 완벽한 암호화는 아니지만 ViewState 사용시 여러분이 앞서 언급한 TripleDES 알고리즘을 사용하여 좀 더 안전한 암호화 방식을 사용하도록 설정할 수 있다. 이에 대해서는 MSDN문서를 참고하기 바란다.
http://msdn.microsoft.com/library/en-us/dnaspnet/html/asp11222001.asp?frame=true
이러한 방식의 더 많은 쿠키의 데이터를 이동시킬 수 있지만 기억할 것은 ViewState가 필요없는 경우 각 요청은 불필요한 네트웍 트래픽을 유발시킨다는 것이다.
마지막으로 암호화는 프로세서 집약적 요소이다. 많은 데이터를 암호화/복호화 하던가 더욱 강력한 알고리즘을 사용하는 경우 더 많은 서버의 자원을 필요로하게 되며 이는 잠재적으로 전체 서버의 성능을 저하시킬 수 있다.
CryptoStream 개체
여러분이 닷넷의 암호화/복호화에서 이해하기 힘든것중의 하나는 CryptoStream 개체를 사용하여 핸들링한다는 것일 것이다. 여러분은 단지 문자를 변경하면 되는 것이라고 생각을 할 것이다. 그런데 왜 스트림을 뒤석어야 되는가? 이는 암호화에 대한 전반적인 이해와 닷넷 프레임웍의 스트림 사용에 대해서 이해를 한다면 이해가 될 것이다. 닷넷 프레임웍에서 모든 외부 리소스를 액세스(IO) 하기 위해서는 거의 대부분 스트림을 사용하여야 한다. 하지만 이는 System.IO 네임스페이스에 없기 때문에 CryptoStream 개체는 System.IO.Stream 개체를 상속을 받는다.
스트림을 사용함으로 얻는 주된 이점은 이들이 서로 연결되어 있다는 것이다. 이것은 특히 파일 처리 작업이나 다른 네트웍 자원에 액세스할 때 유용하다. 예로 여러분은 동시에 암호화된 네트웍 서비스 소켓과 스트림 데이터를 열수 있다. 다음의 링크는 스트림을 사용한 파일 암호화에 DES를 사용한 예이다.
따라서 스트림으로된 문자를 가지고 할 경우 MemoryStream이라는 특별한 클래스를 활용할 수 있다. 이것은 우리가 스트림으로서 문자를 핸들링하고 CryptoStream을 통해서 처리할 수 있게 해준다.
암호화 클래스 생성
이제 암호화에 사용할 클래스를 만들어보기로 하자. 클래스의 이름은 CryptoUtil이라고 하였다. 여기서는 모든 메서드를 shared(static)으로 하였다.
Imports System.Diagnostics Imports System.Security.Cryptography Imports System.Text Imports System.IO Public Class CryptoUtil ' 키와 Initialzation Vector를 위한 8바이트 랜덤 선택 ' IV는 텍스트의 첫번째 블럭을 암호화하기 위해 사용된다. ' 따라서 반복적인 패턴이 발생하지 않는다. Private Shared KEY_64() As Byte = {42, 16, 93, 156, 78, 4, 218, 32} Private Shared IV_64() As Byte = {55, 103, 246, 79, 36, 99, 167, 3} ' TripleDES에서 사용될 24 바이트 또는 192 비트 키와 IV Private Shared KEY_192() As Byte = {42, 16, 93, 156, 78, 4, 218, 32, _ 15, 167, 44, 80, 26, 250, 155, 112, _ 2, 94, 11, 204, 119, 35, 184, 197} Private Shared IV_192() As Byte = {55, 103, 246, 79, 36, 99, 167, 3, _ 42, 5, 62, 83, 184, 7, 209, 13, _ 145, 23, 200, 58, 173, 10, 121, 222} ' DES 암호화 Public Shared Function Encrypt(ByVal value As String) As String If value <> "" Then Dim cryptoProvider As DESCryptoServiceProvider = _ New DESCryptoServiceProvider() Dim ms As MemoryStream = New MemoryStream() Dim cs As CryptoStream = _ New CryptoStream(ms, cryptoProvider. CreateEncryptor(KEY_64, IV_64),CryptoStreamMode.Write) Dim sw As StreamWriter = New StreamWriter(cs) sw.Write(value) sw.Flush() cs.FlushFinalBlock() ms.Flush() ' 다시 스트림에서 문자열로 변환한다. Return Convert.ToBase64String(ms.GetBuffer(), 0, ms.Length) End If End Function ' DES 복호화 Public Shared Function Decrypt(ByVal value As String) As String If value <> "" Then Dim cryptoProvider As DESCryptoServiceProvider = _ New DESCryptoServiceProvider() ' 문자열을 byte 배열로 변환 Dim buffer As Byte() = Convert.FromBase64String(value) Dim ms As MemoryStream = New MemoryStream(buffer) Dim cs As CryptoStream = _ New CryptoStream(ms, cryptoProvider. CreateDecryptor(KEY_64, IV_64),CryptoStreamMode.Read) Dim sr As StreamReader = New StreamReader(cs) Return sr.ReadToEnd() End If End Function ' TRIPLE DES 암호화 Public Shared Function EncryptTripleDES(ByVal value As String) As String If value <> "" Then Dim cryptoProvider As TripleDESCryptoServiceProvider = _ New TripleDESCryptoServiceProvider() Dim ms As MemoryStream = New MemoryStream() Dim cs As CryptoStream = _ New CryptoStream(ms, cryptoProvider. CreateEncryptor(KEY_192, IV_192),CryptoStreamMode.Write) Dim sw As StreamWriter = New StreamWriter(cs) sw.Write(value) sw.Flush() cs.FlushFinalBlock() ms.Flush() ' 다시 스트림에서 문자열로 변환한다. Return Convert.ToBase64String(ms.GetBuffer(), 0, ms.Length) End If End Function 'TRIPLE DES 복호화 Public Shared Function DecryptTripleDES(ByVal value As String) As String If value <> "" Then Dim cryptoProvider As TripleDESCryptoServiceProvider = _ New TripleDESCryptoServiceProvider() ' 문자열을 byte 배열로 변환 Dim buffer As Byte() = Convert.FromBase64String(value) Dim ms As MemoryStream = New MemoryStream(buffer) Dim cs As CryptoStream = _ New CryptoStream(ms, cryptoProvider. CreateDecryptor(KEY_192, IV_192),CryptoStreamMode.Read) Dim sr As StreamReader = New StreamReader(cs) Return sr.ReadToEnd() End If End Function End Class |
클래스의 맨 위에서 바이트 배열로서 키를 초기화하였다. 또한 이 배열에 숫자를 사용하였다. 만약 여러분이 이 키값을 조금 변경하고 싶다면 값은 0 에서 255 사이의 값으로 사용하도록 한다. 이것이 바이트의 허용범위이기 때문이다.
또한 우리는 DES와 TripleDES 각각 암호화, 복호화하는 함수를 만들었다. 암호화 함수에서 메모리 스트림에 있는 버퍼를 ToBase64String 함수를 사용하여 문자로 변환하였다. 복호화 함수에서 이를 반대로 하려면 FromBase64String 함수를 사용하면 된다.
쿠키사용 클래스 생성
다음으로 해볼 것은 아까 생성한 암호화 기능을 사용하여 쿠키의 데이터를 설정하고 이를 가져오는 것이다. 쿠키의 데이터를 쉽게 핸들링하기 위해서 System.Web 네임스페이스를 명시하자.
Public Class CookieUtil ' 쿠키데이터 설정 함수들 ' SetTripleDESEncryptedCookie함수(TripleDES 사용) - 키와 값만 사용 Public Shared Sub SetTripleDESEncryptedCookie(ByVal key As String, _ ByVal value As String) ' 각 부분을 암호화 key = CryptoUtil.EncryptTripleDES(key) value = CryptoUtil.EncryptTripleDES(value) SetCookie(key, value) End Sub ' SetTripleDESEncryptedCookie함수(TripleDES 사용) - 메서드 오버로드를 '사용하여 파기시간 파라미터 추가 Public Shared Sub SetTripleDESEncryptedCookie(ByVal key As String, _ ByVal value As String, ByVal expires As Date) ' 각 부분을 암호화 key = CryptoUtil.EncryptTripleDES(key) value = CryptoUtil.EncryptTripleDES(value) SetCookie(key, value, expires) End Sub ' SetEncryptedCookie함수(DES 사용) - 키와 값만 사용 Public Shared Sub SetEncryptedCookie(ByVal key As String, _ ByVal value As String) ' 각 부분을 암호화 key = CryptoUtil.Encrypt(key) value = CryptoUtil.Encrypt(value) SetCookie(key, value) End Sub ' SetEncryptedCookie함수(DES 사용) - 메서드 오버로드를 ' 사용하여 파기시간 파라미터 추가 Public Shared Sub SetEncryptedCookie(ByVal key As String, _ ByVal value As String, ByVal expires As Date) ' 각 부분을 암호화 key = CryptoUtil.Encrypt(key) value = CryptoUtil.Encrypt(value) SetCookie(key, value, expires) End Sub ' SetCookie함수(비암호화) - 키와 값만 사용 Public Shared Sub SetCookie(ByVal key As String,ByVal value As String) ' 각 부분 인코딩 key = HttpContext.Current.Server.UrlEncode(key) value = HttpContext.Current.Server.UrlEncode(value) Dim cookie As HttpCookie cookie = New HttpCookie(key, value) SetCookie(cookie) End Sub ' SetCookie함수(비암호화) - 메서드 오버로드를 ' 사용하여 파기시간 파라미터 추가 Public Shared Sub SetCookie(ByVal key As String, _ ByVal value As String, ByVal expires As Date) ' 각 부분 인코딩 key = HttpContext.Current.Server.UrlEncode(key) value = HttpContext.Current.Server.UrlEncode(value) Dim cookie As HttpCookie cookie = New HttpCookie(key, value) cookie.Expires = expires SetCookie(cookie) End Sub ' SetCookie함수 - HttpCookie만 사용 Public Shared Sub SetCookie(ByVal cookie As HttpCookie) HttpContext.Current.Response.Cookies.Set(cookie) End Sub ' 쿠키 데이터를 가져오는 함수들 Public Shared Function GetTripleDESEncryptedCookieValue (ByVal key As String) As String ' 키 암호화 key = CryptoUtil.EncryptTripleDES(key) ' 값 가져오기 Dim value As String value = GetCookieValue(key) ' 값 복호화 value = CryptoUtil.DecryptTripleDES(value) Return value End Function Public Shared Function GetEncryptedCookieValue(ByVal key As String) _ As String ' 키 암호화 key = CryptoUtil.Encrypt(key) ' 값 가져오기 Dim value As String value = GetCookieValue(key) ' 값 복호화 value = CryptoUtil.Decrypt(value) Return value End Function Public Shared Function GetCookie(ByVal key As String) As HttpCookie ' 키 인코딩 key = HttpContext.Current.Server.UrlEncode(key) Return HttpContext.Current.Request.Cookies.Get(key) End Function Public Shared Function GetCookieValue(ByVal key As String) As String Try ' 값을 받기 위해 쿠키를 인코딩하지 말것 ' GetCookie 함수에서 인코딩하였음 ' 값 가져오기 Dim value As String value = GetCookie(key).Value ' 값 디코딩 value = HttpContext.Current.Server.UrlDecode(value) Return value Catch End Try End Function End Class |
대부분의 쿠키값 설정 함수들은 메서드 오버로드를 사용하여 쿠키의 파기시간을 추가적으로 받도록 하였다. 파기시간을 설정하지 않게되면 메모리의 브라우져 세션에 쿠키가 유지되게 된다. 쿠키를 계속하여 사용하고 싶다면 파기시간을 미래의 어느 한 시점으로 지정해주자.
또한 암호화 함수들은 키와 데이터를 모두 암호화 한다. 이것은 데이터에 대한 정보가 노출될 수 있기 때문에 키 또한 암호화하는 것은 매우 중요한 사항이다. 예로 키가 UserID이고 그대로 노출되어 있다면 당연히 집중 공격의 대상이 될 것이다.
쿠키 인코딩
위에서 일반적인 쿠키 함수들은 쿠키의 키와 값을 인코딩하고 디코딩한다. 이는 쿠키 역시 URL과 같은 제약을 받기 때문이다. 예로 '='와 ','는 예약어이다. 특히 암호화된 데이터를 저장할때 암호화 알고리즘은 할당된 블럭 사이즈에서 블럭을 채우기 위해서 '='를 추가하기 때문에 각별히 조심해야 한다.
쿠키 데이터를 암호화한 예제는 EncryptingCookies, Plourdenet.Com.WebTools 두개의 프로젝트로 구분되어 있다. EncryptingCookies 프로젝트는 웹 애플리케이션 프로젝트로 암호화 클래스와 쿠키 유틸리티를 사용한다. Plourdenet.Com.WebTools 프로젝트는 클래스 라이브러리로 암호화 클래스와 쿠키 유틸리티 클래스이다. 이 두개를 분리한 이유는 나중에 여러분이 다른 웹 프로젝트에 암호화를 사용할 경우 Plourdenet.Com.WebTools 프로젝트를 참조만하면 되도록 하기 위함이다.
주의할 것은 첫번째 Plourdenet.Com.WebTools 프로젝트의 경우 System.Web을 참조시켜주어야 한다. 두번째로는 웹 애플리케이션인 EncryptingCookies 프로젝트에서 다음과 같이 Plourdenet.Com.WebTools를 참조하도록 하여야 한다.
Imports Plourdenet.Com.WebTools |
웹 애플리케이션은 두개의 웹폼으로 되어있다. 먼저 SetCookies.aspx를 보도록 하고 그 다음 GetCookies.aspx를 보도록 하겠다.
SetCookies.aspx
쿠키의 데이터를 설정하는 페이지는 간단하게 되어있다. 하나의 텍스트박스에 여러분은 값을 넣고 버튼을 누르면 이 값을 서버로 전송한다.
전송 버튼을 눌렀을때 아래의 이벤트를 발생시킨다.
Protected Const COOKIE_KEYNAME = "MyKey" Private Sub btnSaveCookie_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnSaveCookie.Click CookieUtil.SetCookie(COOKIE_KEYNAME, _ txtCookieValue.Text, Now.AddDays(30)) CookieUtil.SetEncryptedCookie(COOKIE_KEYNAME, _ txtCookieValue.Text, Now.AddDays(30)) CookieUtil.SetTripleDESEncryptedCookie(COOKIE_KEYNAME, _ txtCookieValue.Text, Now.AddDays(30)) Response.Redirect("GetCookies.aspx") End Sub |
키 이름으로 상수변수를 사용하였고 텍스트박스에서 받은 값을 3가지 방식으로 쿠키를 기록한다. 첫번째는 일반적인 비암호화된 쿠키이고 두번째는 DES를 사용하여 암호화한 쿠기, 세번째는 TripleDES를 사용하여 암호화한 쿠키이다.
GetCookies.aspx
쿠키 값을 가져오는 부분은 쿠키값 설정때보다 조금 더 작업이 필요하다.
Page_Load 이벤트에서 CookieUtil 클래스를 사용하여 쿠키의 데이터를 가져온다. 그리고나서 이 데이터값들을 화면에 출력한다.
Protected Const COOKIE_KEYNAME = "MyKey" Private Sub Page_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Dim DESCookieKey As String = CryptoUtil.Encrypt(COOKIE_KEYNAME) Dim TripleDESCookieKey As String = _ CryptoUtil.EncryptTripleDES(COOKIE_KEYNAME) lblCookieName.Text = COOKIE_KEYNAME lblStandardCookieValue.Text = _ CookieUtil.GetCookieValue(COOKIE_KEYNAME) lblDESEncryptedValue.Text = _ CookieUtil.GetCookieValue(DESCookieKey) lblDESDecryptedValue.Text = _ CookieUtil.GetEncryptedCookieValue(COOKIE_KEYNAME) lblTripleDESEncryptedValue.Text = _ CookieUtil.GetCookieValue(TripleDESCookieKey) lblTripleDESDecryptedValue.Text = _ CookieUtil.GetTripleDESEncryptedCookieValue(COOKIE_KEYNAME) Dim cookie As HttpCookie Dim key As String lblAllCookies.Text = _ "<table cellSpacing=1 cellPadding=1 border=1>" & vbCrLf lblAllCookies.Text &= _ "<tr><td><b>Keys</b></td><td><b>Values</b></td></tr>" & vbCrLf For Each key In Request.Cookies.Keys cookie = Request.Cookies(key) lblAllCookies.Text &= _ "<tr><td><b>" & cookie.Name & "</b></td><td>" & _ cookie.Value & "</td></tr>" & vbCrLf Next lblAllCookies.Text &= "</table>" & vbCrLf End Sub |
쿠키사용시 주의해야할 점
지금까지 쿠키의 데이터를 암호화하는것에 대해서 보았다. 마지막으로 여러분에게 쿠키를 사용할때 주의할 점을 말하고 마치도록 하겠다.
- 쿠키의 전체 크기 한계는 4kb이다. 여기에는 키와 키와 값 사이의 공백, 기타 관련된 모든 데이터를 포함한 크기이다.
- 암호화를 하게되면 쿠키 데이터의 크기가 증가하게 된다. 4kb를 넘지않도록 주의한다.
- 매 요청때마다 쿠키는 서버로 보내어지게 된다. 따라서 여러분이 덩치가 큰 쿠키의 데이터를 보내고 받아야 한다면 네트웍 대역과 서버의 처리 능력에 대해서도 고려해야 한다.
- 암호화된 덩치 큰 데이터는 애플리케이션 성능에 영향을 미친다.
- 여러분의 사이트가 SSL을 사용하지 않는다면 사용자가 입력하는 초기화 값은 암호화되지 않는다. 예를들면 예제의 쿠키 데이터 설정하는 페이지에서 값은 일반 텍스트로 서버에 보내어진다.
- 쿠키는 사용자에 의해 언제든지 차단되거나 삭제될 수 있다. 만약 여러분의 애플리케이션에서 쿠키를 크리티컬한 요소로서 사용한다면 다른 방법을 사용하거나 사용자가 쿠키를 차단 또는 삭제할 수 없도록 조치를 취해야 한다.
[역주: 웹 애플리케이션만 폴더명 그대로 가상디렉터리로 설정한다.]