레이블이 Silverlight인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Silverlight인 게시물을 표시합니다. 모든 게시물 표시

2011년 10월 30일 일요일

Silverlight 와 서버와의 객체 통신에서 압축 방식의 장점

통신 시 어떤 경우가 되었건, 같은 정보가 전달될 때에는 작은 양이 작은 횟수로 전달 되는 것이 가장 바람직합니다. 그래야 통신 비용이 절감되고, 통신에 따른 지연을 막을 수도 있습니다.

요즘 한창 Silverlight와 서버와의 통신 방식에 대해 개발하고 있습니다만, .NET이나 Microsoft 에서 제공하는 기본 방식의 경우는 브라우저와 같은 방식으로 Data 를 Client 로 다운로드 할 때에만, 옵션으로 압축을 제공합니다. 물론 WCF 에서 압축 모듈을 서로 사용하면 가능합니다만, 그게 바로 족쇄가 될 가능성이 있어, 자체적으로 일반적으로 많이 사용하는 Data 압축 방식을 이용한 통신을 수행하도록 해 봤습니다.

image

JSON 방식으로 객체를 Serialize 하고, 압축을 수행하였더니, 4MB 정보인 것이 246K 정도로 확 줄었습니다. 원본에 비해 5.67% 로 크기가 준 것이지요. 이렇게 되면 통신 속도가 엄청 좋아지겠죠?

BZip22 알고리즘을 사용하였으므로, GZip 보다는 압축률이 좋을 것입니다. LZMA 알고리즘의 경우는 더 좋을 수도 있지만, 수시로 압축/복원을 수행하는 통신 모듈에는 적당하지 않는 것 같습니다. 일반적으로 가장 적당한 방식은 GZip 이 되겠습니다.

이제 서버 단에서 압축을 풀고, 작업하고, 결과를 압축하여 반환하는 모듈을 제작하면, 통신 라이브러리가 완성됩니다.

2011년 10월 25일 화요일

왜 Silverlight 에는 압축관련 모듈이 없을까요?

Microsoft 관계자 분 중에 혹시 아시는 분 계신가요? Microsoft 사가 웹 통신시 압축이 유용하다는 것은 모를 리가 없을 텐데요… 그쵸?

어쩔 수 없이 찾다보니 다행히 Silverlight SharpZipLib 이 있군요.  이 라이브러리는 .NET 용으로 이미 유명한 #ZipLib 의 Silverlight 버전이라 할 수 있습니다.
이 놈이 있어서 다행이지, 기본적으로는 Silverlight에서 압축 관련 기능을 제공하지 않는 건가요?

이게 단순 통신만의 문제가 아니라, Silverlight 자체적으로 Isolated File Storage 에 뭔가를 저장할 때 압축해서 저장하고 싶을 때, 기본 Framework에서 제공해준다면, 상당히 편리한 기능인데, 아쉽군요…

Silverlight와 WCF 통신 시 압축 이용 글을 보면, 이건 뭐 그냥 WebClient 사용하라는 얘기고… 이거 말고… 개발자가 특정 암호화를 부가한다던가, 여러 가지 조작을 할 수 있도록 Class 로 제공해 줄 수는 없나요?

Silverlight와 통신용 WCF에 압축 기능 넣기 에도 결국 서버 쪽 IHttpHandler 나 Web Services, WCF 등에서 자체적으로 Data 를 압축해서 보내는 것인데… 그걸 Silverlight에서 어떻게 압축을 풀어서 사용하지요?

대부분의 글이 Silverlight 와 WCF 와의 통신 시에 WS-Compression 을 이용하던가, WebCliient 에서 HttpHeader에 Accept-Encoding=gzip, deflate 를 넣어서 데이터를 받으라고 되어있는데, 문제는 대용량 데이타를 Upload 할 때입니다…
이 때는 어쩔 수 없이 일반 데이타를 보내야 한다는 소리 아닌가요?

어떻게 외부 통신 시 WCF 를 사용하게 되면, 압축 및 암호화가 가능하다 하더라도, 로컬 저장소에 저장하기 위해서는 필히 압축 기능이 기본으로 제공되었으면 합니다.

Silverlight Data 통신 시의 암호화

Silverlight 등 Client 모듈과의 통신 시에 고려해야 할 사항을 살펴보면,

  1. 통신 프로토콜 및 포맷을 결정해야 합니다.
    HTTP 통신이 대세므로 논외로 하고, 포맷은 XML, JSON, Byte Array 등을 결정해야 합니다.
  2. 그 다음으로 서버 쪽 통신 Daemon 을 IHttpHandler, Web Services, WCF 등을 선택해야 합니다.
    1. WCF 의 경우는 Binding 방식, Protocol 등의 설정 방법이 무지 많으므로, 더 많은 확장성이 있습니다.
    2. Data 처리 방식으로 동기/비동기 방식을 결정해야 합니다.
  3. 압축을 지원할 것인가? 한다면, 어떤 압축 알고리즘을 지원할 것인가?
    1. GZip (NET 기본)
    2. Deflate (NET 기본)
    3. ISharpCode.SharpZipLib.dll 에 있는 GZip, BZip2 알고리즘
    4. 7Zip 알고리즘
  4. 암호화를 지원할 것인가? 어떤 암호 알고리즘을 지원할 것인가?
    1. .NET에는 대칭형 알고리즘 중에 상당히 많은 알고리즘을 제공합니다. DES, RC2, TripleDES, Rijndael 등
    2. Silverlight 에서 제공하는 대칭형 알고리즘은 AES 클래스로 대응되는 것 달랑 한 개?

자 이제 실버라이트의 통신 관련 결정 사항이 많다는 것을 아실 것입니다.
뭐 닥치고, OData 나 Microsoft 의 Dynamic Data 등 DataContext 사용 방식이 있겠습니다만, 내부적으로는 HTTP 웹서비스에 JSON 포맷의 데이터 전송 방식이라 하겠습니다.

오늘은 위의 여러 가지 결정사항 중 가장 늦게 결정해도 되는 (SSL 이 있으니, 안 해도 됩니다!!! 라고 주장하시면 할 말 없습니다.) 암호화 관련 사항에 대해 짚어보겠습니다.

위에서 보셨듯이 .NET Framework 2.0 이상부터 상당히 다양한 암호 알고리즘을 제공하고, 양방향 통신 시에 가장 많이 쓰이는 대칭형 알고리즘은 AES 기반으로 발전된 많은 알고리즘을 제공합니다. 근데 왜!!! 실버라이트에서는 AesManaged 라는 클래스 달랑 하나만 지원하냐구요? Rijndael 은 내부에 숨어서 사용도 못하고 (물론 사용하려면 하겠지만)

그래서 암호화 지원을 할 수 있는 방법은 .NET에서 제공하지 않지만, 한국에서는 꼭 써야 할 ARIA 알고리즘을 적용하기로 했습니다.
뭐 결론이 이미 있는데, 뭐하러 다른 걸 시도하지? 라고 하실지 모르지만, 누가 알겠습니까… 제가 만든 제품이 외국에도 팔리고, 암호화 알고리즘을 미국 규격인 AES 를 따라야 한다라고 한다면… ㅋㅋ

어쨌든 ARIA 알고리즘을 이용하여, 제품에 적용하기 위해, 사전에 단위 테스트를 수행해 봤습니다.


AriaEncryptor_for_Silverlight

AriaEncryptor_for_Silverlight_Log

제대로 Silverlight 에서도 암호화 및 복호화가 제대로 되는군요^^. 이제 Silverlight 와의 통신 시에는 ARAI 알고리즘 을 이용한 데이타 암호화를 기본으로 사용하려고 합니다.


더 좋은  방안이 있는 분께서는 의견 주시기 바랍니다.