ASP.NET
2009. 10. 31.
안혁
http://hyok.kr
ASP.NET으로 구성된 웹 어플리케이션 서버가 L4 Switch에 의하여 Load Balancing 되는 경우 웹 페이지 접속 시 ASP.NET 컨트롤(트리 컨트롤 같은...)에서 없던 오류가 발생하거나 이미지가 [x] 표시 되는 현상이 발생할 수 있습니다. 이 경우 Fiddler를 통하여 페이지 요청 시 WebResource.axd 요청이 실패하는지 확인합니다. 해당 요청에서 문제가 있다면 서버의 이벤트 로그에 다음과 같이 CryptographicException 오류가 발생하였는지 확인해보세요.
Event code: 3005
Event message: 처리되지 않은 예외가 발생했습니다.
Event time: 2009-10-29 오후 10:05:45
Event time (UTC): 2009-10-29 오후 1:05:45
Event ID: 28188a45397841e499de7a4c38b4f4cd
Event sequence: 61
Event occurrence: 3
Event detail code: 0
Application information:
Application domain: /LM/W3SVC/1/ROOT/blog-1-129012944438577909
Trust level: Full
Application Virtual Path: /blog
Application Path: D:\Web\blog\
Machine name: MCAS02
Process information:
Process ID: 4460
Process name: w3wp.exe
Account name: NT AUTHORITY\NETWORK SERVICE
Exception information:
Exception type: CryptographicException
Exception message: 패딩이 잘못되었으며 제거할 수 없습니다.
Request information:
Request URL: http://web.hyok.kr/blog/WebResource.axd?d=9n4PyABCLnJPx4xoU3nxwC4Kt15K3u-a245UfT6hW8JSf4r6suGuS1kEScfmyvro0&t=633739595980000000
Request path: /blog/WebResource.axd
User host address: 166.125.33.55
User:
Is authenticated: False
Authentication Type:
Thread account name: NT AUTHORITY\NETWORK SERVICE
Thread information:
Thread ID: 10
Thread account name: NT AUTHORITY\NETWORK SERVICE
Is impersonating: True
Stack trace: 위치: System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast)
위치: System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)
위치: System.Security.Cryptography.CryptoStream.FlushFinalBlock()
위치: System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, Int32 length, IVType ivType, Boolean useValidationSymAlgo)
위치: System.Web.UI.Page.DecryptStringWithIV(String s, IVType ivType)
위치: System.Web.Handlers.AssemblyResourceLoader.System.Web.IHttpHandler.ProcessRequest(HttpContext context)
위치: System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
위치: System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Custom event details:
[패딩이 잘못되었으며 제거할 수 없습니다. (Padding is invalid and cannot be removed.)]
이 에러는 WebResource.axd 파일을 요청할 때 발생합니다. 이 파일은 ASP.NET의 컨트롤을 사용하는 경우 요청되는데요. 이 때 암호화 작업이 발생합니다. 암호화에 사용되는 Machine Key는 서버가 가지고 있습니다. Machine Key를 설정한적이 없다면 동적으로 생성되어 사용됩니다. 서버가 한 대일 경우는 상관 없지만, 여러 대이면서 Load Balancing을 하는 경우는 문제가 발생합니다. 요청마다 서버가 바뀌므로 암호화 키를 전달해준 서버가 아닌 서버가 암호화된 정보를 받는다면 해독할 수 없고, 위 처럼 오류가 발생하는 것이지요. 중국 사람, 일본 사람과 제가 대화 한다면 일본 사람에게 중국말을 하면 안되고 일본 사람에게 중국말을 하면 안되겠죠. 아마 위 에러처럼 깜짝 놀랄 겁니다. 모두가 이해할 수 있는 통일된 변환(여기서는 암호화)이 필요합니다. 아군도 암호를 해독 못하는 이 상황은 해결이 필요하네요.
이는 모든 웹 어플리케이션 서버의 Machine Key를 동일하게 함으로 해결할 수 있습니다. 새로운 Machine Key 키 생성은 다음의 사이트에서 도움을 받으세요.
http://www.orcsweb.com/articles/aspnetmachinekey.aspx
생성된 Machine Key는 web.config에 다음의 형태로 삽입하면 됩니다.
<?xml version="1.0"?>
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<machineKey
validationKey='123429A424239D13BE9B0AA06242A2984836A22AF64810C5DBC7857BED4F7D347C0F79302051DB271B44CB6D5D1EE47A1A001AD98F44A6F8162D833E2D612D0A'
decryptionKey='ABCD2F551DB337398AA5C4654DED3889604A593F68559FED'
validation='SHA1'/>
</system.web>
</configuration>
참고 자료는 다음과 같습니다.
http://blogs.msdn.com/paraga/archive/2006/07/03/655081.aspx
http://jagbarcelo.blogspot.com/2009/08/solution-padding-invalid-cannot-be.html
---
수정
2023.02.08, alidationKey validationKey
'.Net' 카테고리의 다른 글
HTML에서 특수 기호 인코딩의 필요성 (0) | 2009.08.19 |
---|---|
단일 프로세스 실행 (0) | 2008.09.04 |