Visual Studio로 Azure Function 개발하기

Azure Function은 Azure App Service에 포함된 기능 중 하나인 Azure Web Job을 별도의 상품으로 분리하여 출시하였습니다. 하지만 아쉽게도 Visual Studio의 풍부한 IDE 지원을 아직까지도 직접 받을 수 있는 상태는 아닙니다. 또한 Microsoft Docs 등에 공개된 방법도 간접적으로 Azure Function의 설정을 이용한다거나, Node용 CLI를 활용하는 정도에서 언급되는 것이 전부입니다.

소개하려는 내용은 Visual Studio의 콘솔 프로젝트와 Azure Storage Emulator를 이용하여 C# Azure Function을 C# Script가 아닌 통상적인 C# Compiler 기반 프로젝트로 개발과 테스트를 진행하고, 이것을 C# Azure Function으로 마이그레이션하는 방법에 관한 것입니다. 만약 LINQPAD Premium Version을 구입하여 사용 중이라면, 같은 작업을 LINQPAD에서도 실행할 수 있으니 더 적극적으로 Azure Function을 개발하실 수 있을 것입니다.

시작하기

Azure Web Job 기반이기 때문에, 기존에 .NET용으로 출시한 Web Job SDK와 각종 Extension을 Azure Function 사이에는 어느 정도 호환성이 있습니다. 다시 말해서 C# 스크립트로 무언가 새로운 코드를 작성한다기 보다, 기존의 SDK를 C# 스크립트에서 사용할 수 있도록 포장한 것이 Azure Function의 본질에 가깝습니다. 아쉽게도 완전히 같은 코드 베이스는 아니지만, 호환성이 있기 때문에 취할 수 있는 이점이 있고, 그 부분을 활용하는 것입니다.

시작을 위하여 다음의 소프트웨어 스택이 설치되어있는지 점검합니다.

  • Azure Storage Emulator (Azure Cloud Service SDK에 포함되어있습니다.)
  • Visual Studio 2015 Community Edition 이상의 IDE
  • .NET Framework 4.6 이상

만약 Windows 개발 환경이 아닌 경우 Azure Storage Emulator는 제공되지 않기 때문에 어쩔 수 없이 실제 Azure Storage 계정을 만들어 연결해야 합니다. IDE의 경우 Visual Studio Code, Visual Studio for Mac, Rider를 대신 활용할 수 있습니다. 그리고 Mono를 설치하여 개발을 진행할 수 있습니다. 아쉽게도 .NET Core는 2017년 4월 현재 지원되지 않습니다.

선호하는 IDE로 콘솔 프로젝트를 만든 다음, 다음의 NuGet 패키지들을 설치합니다.

  • Microsoft.Azure.WebJobs (2.0.0 이상)
  • Microsoft.Azure.WebJobs.Extensions (2.0.0 이상)

그 다음 Main 메서드를 다음과 같이 코딩합니다.

var jobHostConfig = new JobHostConfiguration("UseDevelopmentStorage=true");
jobHostConfig.UseCore();
jobHostConfig.UseFiles();
jobHostConfig.UseTimers();
jobHostConfig.UseDevelopmentSettings();

using (var cts = new CancellationTokenSource())
using (var jobHost = new JobHost(jobHostConfig))
{
    jobHost.StartAsync(cts.Token);
    Console.WriteLine("Press Ctrl + C to stop the service.");
    Console.CancelKeyPress += (s, e) => cts.Cancel();
    cts.Token.WaitHandle.WaitOne(Timeout.Infinite);
}

Local Azure Storage Emulator를 사용할 수 있는 Windows 환경에서만 UseDevelopmentStorage=true 연결 문자열을 지정하고, 그 외 환경에서는 실제 Azure Storage Account의 연결 문자열을 해당 속성 블레이드에서 찾아 대입해야 합니다.

그리고 Azure Function에 호스팅하려는 함수를 다음과 같이 코딩합니다.

public static void Run(
    [TimerTrigger("* * * * * *", UseMonitor = true)]
    TimerInfo myTimer,
    TraceWriter log)
{
    log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
}

TimerTrigger가 TimerInfo 메서드 인자에 지정되는 것에 유의하여 위와 같이 코딩합니다. TimerTrigger에 지정되는 첫 인자는 타이머의 실행 간격을 나타냅니다. Crontab에 사용되는 반복 간격 표시 문법을 참조하여 값을 지정하도록 구성하는 것이 Azure Function으로 마이그레이션 할 때 편리하므로 해당 문법을 익히는 것을 권장합니다.

그리고 실행이 잘 되는지 확인하기 위하여, Azure Storage Emulator를 시작하고, F5 키를 눌러 샘플 프로그램을 실행합니다. 다음과 비슷하게 출력되면 정상적으로 실행되는 것입니다.

Press Ctrl + C to stop the service.
Development settings applied
Found the following functions:
TimerSample.Run
Singleton lock acquired (1ce1ebaf1e584866b90488a9e1b5d19f/TimerSample.Run.Listener)
The next 5 occurrences of the schedule will be:
2017-04-24 오전 12:16:59
2017-04-24 오전 12:17:00
2017-04-24 오전 12:17:01
2017-04-24 오전 12:17:02
2017-04-24 오전 12:17:03
Job host started
Executing 'TimerSample.Run' (Reason='Timer fired at 2017-04-24T00:16:59.0273081+09:00', Id=aa02dc0a-5a89-4ebd-bf08-8182cce53a0c)
C# Timer trigger function executed at: 2017-04-24 오전 12:16:59
Executed 'TimerSample.Run' (Succeeded, Id=aa02dc0a-5a89-4ebd-bf08-8182cce53a0c)
Executing 'TimerSample.Run' (Reason='Timer fired at 2017-04-24T00:17:00.0061625+09:00', Id=f8161e5d-c989-4d2d-9a49-cb5d9d269134)
C# Timer trigger function executed at: 2017-04-24 오전 12:17:00
Executed 'TimerSample.Run' (Succeeded, Id=f8161e5d-c989-4d2d-9a49-cb5d9d269134)
...

마이그레이션

이렇게 만들어진 Azure Function이 정말 잘 수행되는지 점검할 때 활용할 수 있는 유용한 서비스가 하나 있습니다. Try Azure App Service를 이용하면 실제 Microsoft Azure 구독과 무관하게, Microsoft 계정 이외에도 Google (GMAIL), Facebook, Github 계정으로 로그인하여 1시간짜리 테스트 Azure Function 계정을 발급받을 수 있습니다.

https://azure.microsoft.com/ko-kr/try/app-service/ 에 방문하여 새로운 계정을 하나 생성합니다.

그 다음, 위의 Run 메서드의 코드를 복사합니다. 단, 몇 가지 복사 전에 수정하거나 확인해야 할 부분이 있습니다.

  • 개발 중에 참조한 NuGet 패키지의 참조를 지정해야 합니다. project.json 파일은 기본적으로 만들어지지 않으므로 다음과 같은 뼈대를 만들고, 현재 개발한 프로젝트 내의 package.config 파일의 내용을 여기로 복사해서 넣어야 합니다. 종속 관계에 따라 자동으로 설치되는 패키지들은 제외하고, 실제로 추가했던 패키지만 지정해서 넣으면 됩니다.
{
  "frameworks": {
    "net46":{
      "dependencies": {
        "Microsoft.ProjectOxford.Face": "1.1.0"
      }
    }
   }
}
  • NuGet 패키지가 아닌 BCL 내 어셈블리 또는 개별 .NET DLL 파일을 참조했을 경우에는 C# 스크립트만의 고유 문법인 #r 지시자를 사용하여 참조를 지정합니다.
    • GAC에 설치했거나 별도로 수동 참조한 .NET DLL 파일은 bin 폴더로 직접 업로드해야 합니다.
    • x86용으로 명시하여 빌드한 DLL이거나, 설치 준비 및 사용 과정에서 시스템 레지스트리 변경 등의 작업이 필요한 경우에는 사용할 수 없습니다.
  • 함수를 옮겨 담기 전에는 메서드 이름과 시그니처가 처음 Azure Function을 만들었을 때와 동일한지 점검합니다. 만약 정상적으로 실행되지 않는다면 function.json 파일의 내용을 참고합니다.
{
  "disabled": false,
  "bindings": [
    {
      "name": "myTimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "0 */5 * * * *"
    }
  ]
}
  • 마지막으로 앞에서 TimerTrigger나 BlobTrigger, 혹은 ServiceBusTrigger와 같이 트리거에 지정한 인자의 값을 확인하여 function.json 파일을 수정하도록 합니다. 위의 예제의 경우 매 초 마다 실행되도록 하였으므로, function.json의 schedule 프로퍼티를 “* * * * * *”으로 바꾸어야 합니다.

마무리

이렇게 해서 만들어진 최종 버전의 CSX 파일을 실제 Azure Function 서비스로 배포하는 것은 자유롭게 할 수 있습니다. 연속성 있는 개발을 위해서, 버전 관리 저장소를 통하여 배포하도록 설정해두면 더욱 편리할 것입니다.

이 글을 작성하면서 좀 더 고민해볼 만한 주제가 있다면, 아래와 같은 부분들이 있을 것 같습니다.

  • HTTP Trigger, Web Hook Trigger는 Web Job과 사실 직접적인 상관이 없으며, ASP.NET Web API의 서브셋에 가깝습니다. 다만 TraceWriter 클래스를 사용하는 부분만이 온전히 Web Job에 관련이 있는 부분입니다. 이 부분을 감안하여 DummyTraceWriter 클래스를 만들어 단위 테스트를 하도록 할 수 있을 듯 합니다.
class DummyTraceWriter : TraceWriter
{
    public DummyTraceWriter() : base(default(TraceLevel)) { }
    public override void Trace(TraceEvent traceEvent) => Console.WriteLine(traceEvent);
}
  • LINQPAD용 스크립트 템플릿을 만들어 공유한다면 정식 SDK가 출시되기 전에 더 많이 Azure Function을 개발하고 테스트할 수 있을 것이라고 생각합니다.
  • 일부 네이티브 코드를 포함하는 NuGet 패키지는 아마도 64비트용으로 빌드된 패키지를 사용하는 것이 실행에 문제가 없을 것으로 예상합니다. 32비트 버전의 패키지도 별도 EXE 파일로 실행하는 경우에는 Windows-on-Windows 호환성 기능으로 실행은 보장될 수 있을 것입니다.

더 세부적인 사항, 보충할 부분, 혹은 수정해야 할 부분에 대한 의견을 주시면 큰 도움이 될 것 같습니다.

Saturday Azure Live 1702 행사 후기

안녕하세요. Azure 한국 사용자 그룹 운영진 남정현입니다.

Saturday Azure Live 1702 행사에 함께해주신 청중 및 스피커 여러분들께 진심으로 감사드립니다. 추운 날씨에도 불구하고 참석해주셔서 성황리에 행사가 마무리될 수 있어서 기쁩니다. 행사 장소를 제공해주신 마이크로소프트 멜팅팟 프로그램 관계자 여러분들께도 깊은 감사의 인사를 드립니다.

발표 자료 및 행사 실황 공유

행사 사진

이 날 행사는 총 4개의 세션으로 구성되었습니다.

청중 사전 설문 (접수 시점)

행사에 참석해주신 분들께서 사전 응답해주신 내용은 다음과 같습니다. 총 46명께서 응답해주셨습니다.

  • 현재 어떤 포지션으로 일하고 계십니까?
    • 백엔드 개발: 15명
    • 시스템 엔지니어링: 8명
    • 웹 프론트엔드 개발: 7명
    • 모바일 앱 개발: 5명
    • 해당 없음: 5명
    • 스마트 클라이언트, 데스크탑, 패키지 SW 개발: 3명
    • 데이터베이스 관리: 2명
    • 임베디드 개발: 1명
  • 어떤 클라우드 컴퓨팅 플랫폼에 대한 경험을 해보셨습니까? (중복 가능)
    • Microsoft Azure: 23명
    • Amazon Web Service: 22명
    • 경험 없음: 9명
    • Google Cloud Platform: 5명
    • KT UCLOUD: 5명
    • 자체 데이터센터 또는 클라우드 플랫폼: 4명
    • IBM Bluemix: 2명
    • Aliyun Cloud: 2명
    • Softlayer: 1명
  • 회사가 어떤 업종에 속합니까? 학생이거나 대학원생이신 경우 “없음”으로 입력하여 주십시오. (중복 가능)
    • 정보통신일반 (SI, 컨설팅 포함): 22명
    • 학생/대학원생/기타: 8명
    • 소프트웨어 개발: 6명
    • 전자상거래 및 금융: 5명
    • 게임 개발: 3명
    • 헬스케어: 2명
    • 교육: 1명

설문지 응답 및 청중 세션 평가

아울러 이번 행사에서는 설문지를 배포하여 행사에 대한 청중 평가와 피드백을 처음으로 수집하였습니다. 아래는 평가와 의견을 정리한 내용입니다. 총 18분께서 응답해주셨습니다.

  • “Saturday Azure Live 1702” 행사 만족도 (중복 가능)
    • 대체적으로 괜찮았다: 8명
    • 다음에 다시 오겠다: 10명
    • 의견
      • 참석자와의 상호 교류가 아쉽습니다. 강의 위주로 구성된 것 같습니다. 유익한 내용이 많아 감사드립니다.
      • 좋은 내용으로 세션 열어주셔서 감사합니다.
      • 고생 많으셨습니다. SAL 파이팅입니다!!!
      • 대체로 만족합니다. 기본 지식이 없는 대상자에게도 맞는 행사도 열어주시면 좋을 것 같습니다.
      • 발표자분들 정말 고생 많으셨습니다.
      • Azure에 대한 새로운 소식이나 기본 Tutorial 짧게라도 하고 넘어가면 초보자에게 큰 도움이 되겠음
      • 좋은 세미나 감사합니다!!!
      • 고생하셨습니다.
      • AI 연동 서비스(에 관한 내용을 다루어주셨으면 좋겠습니다.)
  • 세션 1 “Azure와 C#으로 만드는 모바일 서비스” 에 대한 평가
    • 생각과 다르다: 1명
    • 어려웠다: 3명
    • 만족한다: 14명
    • 의견
      • 유익했습니다.
      • 강의 너무 좋았습니다. PowerBI와 Azure, UWP, Xamarin 크로스플랫폼 부분에 대한 세션도 좋은 것 같습니다.
      • 디버깅 – 출력 창에서 정확히 뭘 했는지 모르겠음. Push 설명 자세하고 좋음
      • 감사합니다. 많은 정보 얻어갑니다!
      • Azure 세션이긴 하나, UWP 개발의 가장 기본 내용 조금만 더 설명해주세요!
      • Demo가 어려웠음
      • C#을 이용한 윈도 모바일 + 윈도 앱에 대해서 잘 보았습니다.
      • 너무 많은 주제를 전달하려 하다보니 강의 시간과 일관성이 떨어져 아쉬웠습니다.
  • 세션 2 “Event Sourcing on Azure” 에 대한 평가
    • 생각과 다르다: 2명
    • 어려웠다: 2명
    • 만족한다: 14명
    • 의견
      • 핵심 내용 설명이 부족했습니다.
      • 모르고 있었던 CQRS 잘 설명해주셔서 감사합니다. 서비스 구현에 정말 도움이 많이 될 것 같습니다.
      • 감사합니다. 많은 정보 얻어갑니다!
      • Event Sourcing과 CQRS에 대해서 이해하기 쉽게 설명해주셔서 감사합니다. Azure의 서비스와 매칭되는 것도 좋았습니다.
      • 듣고 싶은게 많았는데 시간이 모자라 아쉬웠습니다.
  • 세션 3 “공연 스타트업에서의 Azure 사용하기 by 1인 개발자”에 대한 평가
    • 생각과 다르다: 1명
    • 어려웠다: 1명
    • 만족한다: 16명
    •  의견
      • 실용적인 지식이 도움되었습니다.
      • WebApp이나 Page Publishing 부분에도 관심이 많았는데, 잘 설명해주셔서 감사합니다.
      • 다음엔 좀 더 유려하게.. 화이팅입니다.
      • 감사합니다. 많은 정보 얻어갑니다!
      • WordPress Plugin 부분 따라하기 어려웠음
      • Project Nami에 대해서 알 수 있어서 좋았습니다. 쪠 super Cache에 대해서도 알 수 있었습니다. KISA Whitelist도 알 수 있어서 좋았습니다. (Sendgrid)
      • 수고 하셨습니다. Live Demo는 위험합니다. ^^
  • 세션 4 “Azure Microservice를 위한 API Management with Functions” 에 대한 평가
    • 어려웠다: 1명
    • 만족한다: 17명
    •  의견
      • 사용자 입장에서 리뷰하는 것이 유익했습니다.
      • Functions에 대해 관심이 많은데요, 잘 설명해주셔서 장단점 잘 파악해서 사용할 수 있을 것 같습니다.
      • IoT 세션은 처음인데 너무 재미있엇습니다.
      • 감사합니다. 많은 정보 얻어갑니다!
      • Azure Functions, BLOB Storage에 대해서 잘 알 수 있었습니다.
      • 재미있었습니다.

의견 주신 내용을 수렴하여 차후 세미나에서 더 많은 분들께 만족을 드릴 수 있도록 하겠습니다.

행사 회고

총 46명의 신청자 중에서 실제로 참석하신 분은 절반인 23명에 채 못 미치는 18명 내외였던 것으로 확인됩니다. 지난 3회의 Saturday Azure Live 진행 시에도 50% 미만의 참석률 문제가 있었지만 문제가 개선되지 않아 많은 안타까움을 느끼고 있습니다. 무료 세미나이기는 하나, 참석을 희망함에도 접수 상황을 보고 발걸음을 돌리시는 분들도 계셨을 것을 생각해보면 매우 바람직하지 않은 현상이라고 생각합니다.

이와 같이 No-Show가 발생하는 일이 개선되지 않고 반복되면 행사를 준비하는 주최측은 물론 참석자 분들 모두에게 좋지 않은 결과를 야기합니다. 이와 같은 현상이 왜 문제가 되는지에 관해서는 http://channy.creation.net/blog/517 에 소개된 아티클을 일독하시는 것을 권해드립니다.

고민 끝에, 차회 행사인 1703 행사부터는 소정의 실비 접수료를 참가 접수 시 온라인상으로 수납하고, 당일 행사에 참석하신 분들 중 끝까지 세션을 들으시고 익명 설문지를 제출하시는 분께 실비 접수료에 상응하는 간단한 도서문화상품권을 되돌려드리는 형태로 유료 세미나로 전환하기로 방침을 정하였습니다.

갑작스럽게 방침을 전환한 것에 대한 점 때문에 놀라셨다면 죄송합니다. 하지만 더 윤택하고 더 나은 세미나를 준비하여 보다 많은 분들과 함께 할 수 있도록 매사 최선을 다하겠습니다.

고맙습니다.

 

Saturday Azure Live 1701 행사 후기

안녕하세요. Azure 한국 사용자 그룹 운영진 남정현입니다.

Saturday Azure Live 1701 행사에 함께해주신 청중 및 스피커 여러분들께 진심으로 감사드립니다. 추운 날씨에도 불구하고 참석해주셔서 성황리에 행사가 마무리될 수 있어서 기쁩니다. 행사 장소를 제공해주신 마이크로소프트 멜팅팟 프로그램 관계자 여러분들께도 깊은 감사의 인사를 드립니다.

행사 사진

이날 행사는 총 3개의 세션으로 구성되었습니다.

  • Microsoft Conversation as a Platform 소개 – 한국 마이크로소프트 오일석 에반젤리스트님
  • Azure WebApp 개념원리 – Microsoft Azure MVP, Azure 한국 사용자 그룹 운영진, (주)바풀 CTO 김영재님
  • DevOps와 Hybrid Cloud – Azure 한국 사용자 그룹 운영진, SDDC 한국 사용자 그룹 운영진 김세준님

아울러 이번 행사에서는 설문지를 배포하여 행사에 대한 청중 평가와 피드백을 처음으로 수집하였습니다. 아래는 평가와 의견을 정리한 내용입니다.

  • “Saturday Azure Live 1701” 행사 만족도 (중복 가능)
    • 만족스럽지 않다: 1명
    • 대체적으로 괜찮았다: 8명
    • 다음에 다시 오겠다: 7명
    • 의견
      • 처음이라 낯설어서 아직은 없습니다. 참, Azure 관련 자료 감사합니다.
      • 인공지능 (Machine Learning, Deep Learning 등)에 대한 세미나도 가능하시면 부탁드립니다.
      • Azure에서 서비스하고 있는 내용이 광범위 하긴 하지만, 전체 세션간에 주제에 대한 연관성이 있었으면 좋겠습니다. 개발자를 위한, 운영 엔지니어를 위한 주제를 통일하고 Deep Dive 세션 진행을 통해 레벨업할 수 잇었으면 좋겠습니다.
  • 세션 1 “Microsoft Conversation as a Platform 소개” 평가
    • 좀 어려웠다: 4명
    • 만족한다: 10명
    • 의견
      • LUIS에 한국어 추가되면 Azure 사용자 그룹에 알려주세요.
      • 이해하기 쉽게 설명해주셔서 감사합니다.
      • 짧은 시간에 많은 내용을 하기 힘들겠지만 Practice 비중이 조금 더 늘었으면 좋겠습니다.
      • Azure의 기본적인 개념에 대해 더 자세히 알려주셨으면 좋겟어요.
      • 좋았습니다.
  • 세션 2 “Azure WebApp 개념원리” 평가
    • 좀 어려웠다: 4명
    • 만족한다: 10명
    • 의견
      • 실무에서 적용된 Service들이라던지 그런 개념이 많이 담겨있어서 어느정도만 이해할 수 있었지만, 준비에 감사드립니다. 🙂
      • 정기 세미나로 계획 중이시면 기본적인 Overview 보다는 구체적인 기능들을 Review 할 수 있는 심화 세션으로 진행되었으면 좋겠습니다.
      • 설명보단 시연이 좀 더 많은 시간이 있었다면 좋을 것 같아요.
      • 더 많은 (Azure WebApp 활용 및 적용) 사례도 궁금합니다.
  • 세션 3 “DevOps와 Hybrid Cloud” 평가
    • 좀 어려웠다: 1명
    • 만족한다: 12명
    • 의견
      • SE (System Engineer)에 대한 이해가 되었습니다.
      • Hybrid Cloud를 검토중인상황에 많은 부분을 생각해볼 수 있는 유용한 시간이었습니다.
      • 초반에 설명이 장황해 잘 이해가…

의견 주신 내용을 수렴하여 차후 세미나에서 더 많은 분들께 만족을 드릴 수 있도록 하겠습니다.

고맙습니다.

[ClouDeveloper News – Azure Edition] 2017년 1월 5일

클라우드 컴퓨팅을 중심으로 관련된 여러 기술과 업계 소식을 매주 전하는 ClouDeveloper News를 시작합니다. 파일럿 프로그램으로 구상하여 운영 중에 있으며 추후 여러 피드백과 의견 수렴을 통하여 프로그램의 틀을 갖추어 나갈 예정이오니 많은 관심과 구독을 부탁드립니다.

이번주 포커스/주요 소식

Saturday Azure Live 1701 (등록 바로가기)

Saturday Azure Live 1701이 1월 14일(토) 오후 2시부터 서울 강남 토즈1호점에서 열립니다. Microsoft Azure Korea 페이스북 그룹에서 진행하는 Saturday Azure Live는 매월 둘째 주 토요일마다 진행하는 Microsoft Azure의 기술 정보를 함께 공유하는 정기 세미나입니다. Azure에 관해 정보를 얻을 수 있을 뿐 아니라, 발표하고 싶은 주제가 있다면 스피커로! 경험담을 공유하고 싶다면 라이트닝 토크까지! 함께 하실 수 있습니다.

Agenda
Overview – 세션 소개 (발표자: Azure MVP 남정현)
Session 1 – Microsoft Conversation as a Service 소개 (발표자: 한국 마이크로소프트, 오일석 에반젤리스트)
Session 2 – Azure WebApp 개념원리 (발표자: (주)바풀 CTO, Azure MVP 김영재)
Session 3 – DevOps와 Hybrid Cloud (발표자: 한국 Azure 사용자 그룹, 김세준)

Azure Functions deprecating preview versions – 구 버전의 Azure Function을 사용하시는 경우 2017년 2월 1일 전에 1.0 버전 이상으로 업그레이드해야 합니다.

General availability: Larger block blobs in Azure Storage – Azure Storage에 더 큰 크기의 Block BLOB 업로드가 지원됩니다. 195GB에서 최대 4.77TB까지 업로드가 가능하며, 모든 Azure 리젼에서 사용할 수 있습니다.

MSRT December 2016 addresses Clodaconas, which serves unsolicited ads through DNS hijacking – Microsoft 악성 코드 제거 도구의 새 버전이 업데이트되면서, DNS 하이재킹을 통한 MITM 공격을 유발할 가능성이 있는 악성 코드를 제거할 수 있는 기능이 새로 추가되었습니다.

Several New Azure Services now available in UK – 영국 Azure 리젼에서 다수의 Azure 서비스를 새롭게 사용할 수 있게 되었다는 소식입니다. 이 중에는 Azure Function, Power BI, Power BI Embedded, DocumentDB 도 포함되어있습니다.

Mark Russinovich Azure CTO에게 Sysinternals를 이용하여 성공적으로 문제를 해결했던 사례를 스크린샷과 로그를 포함하여 보내면, Sysinternals 책을 저자 서명과 함께 배송해주는 이벤트를 진행하고 있습니다. 트위터 전문

커뮤니티 소식

Azure 서비스 공지 사항

아티클, 기고

새로운 제품 및 서비스

활용 및 노하우

웹 캐스트

ClouDeveloper 페이스북 페이지에 댓글로 의견을 남겨주시면 뉴스 발행 및 각종 정보 전달에 반영하도록 하겠습니다. 고맙습니다.

의견 남기기: https://fb.com/cloudeveloper

[ClouDeveloper News – Azure Edition] 2016년 12월 15일

클라우드 컴퓨팅을 중심으로 관련된 여러 기술과 업계 소식을 매주 전하는 ClouDeveloper News를 시작합니다. 파일럿 프로그램으로 구상하여 운영 중에 있으며 추후 여러 피드백과 의견 수렴을 통하여 프로그램의 틀을 갖추어 나갈 예정이오니 많은 관심과 구독을 부탁드립니다.

이번주 커뮤니티 소식

Azure 서비스 공지 사항

  • General availability: Package Management extension for Visual Studio Team Services
    • Visual Studio Team Service에서 NuGet Package와 NPM Package를 관리할 수 있는 익스텐션 서비스가 새로 출시되었습니다. Visual Studio Marketplace에서 청약할 수 있는 상품입니다.
  • General availability: Azure IoT Gateway SDK
    • 기존 하드웨어나 인프라를 교체하지 않고, 게이트웨이 장치를 개발하여 Azure IoT와 자연스럽게 연동될 수 있도록 만들 수 있습니다. 오픈 소스로 공개된 Azure IoT Gateway SDK를 사용하여 기존 장치가 Azure IoT Hub와 직접 통신할 수 있는 여건이 되지 않더라도 원격에서 장치를 제어하거나 상태를 보고하는 대행 게이트웨이 하드웨어를 더 쉽게 개발할 수 있습니다.
  • With general availability, enhancements abound in Azure IoT Hub Device Management
    • Azure IoT Hub에서 그동안 강조되지 않았거나 샘플 코드 수준으로만 제공되어오던 “장치 관리”에 관련된 기능과 API가 GA로 전환되었습니다. 예약 작업, 다이렉트 메서드, 쿼리, 디바이스 트윈 API를 사용하여 좀 더 많은 장치 제어 시나리오를 커버할 수 있게 되었습니다.
  • Latest update of Azure Analysis Services preview brings scale up and down
    • Azure Analysis Service의 인스턴스 크기를 조정할 수 있는 기능이 포털에서 새롭게 제공됩니다. 상황에 따라 강력한 성능 발휘를 위하여 인스턴스 등급이나 규모를 늘리고, 사용하지 않는 때에는 최소한으로 낮추어 경제적으로 Azure Analysis Service를 활용할 수 있게 됩니다.

교육 자료

새로운 제품 및 서비스

  • Introducing Windows Server & SQL Server Premium Assurance
    • 지원이 중단될 예정인 Windows Server와 SQL Server에 대한 보안 업데이트 제공 서비스가 유상으로 제공됨에 따라 기존 라이프사이클에서 최대 6년까지 지원이 연장됩니다. 신규 플랫폼과 서비스로 이행을 하기에 시간적 여유가 없는 경우 선택할 수 있는 옵션입니다. Windows Server 2008, Windows Server 2008 R2, SQL Server 2008, SQL Server 2008 R2가 첫 지원 대상입니다.
  • Announcing SQL Server Management Studio – 16.5.1 Release
    • SQL Server Management Studio의 최신 버전인 16.5.1이 릴리스되었습니다. 제품 출시 후 발견된 문제점들을 수정한 패치 성격의 업데이트 버전입니다.

활용 및 노하우

웹 캐스트

  • SQL Server + Java: What’s new
    • 새 Microsoft JDBC 드라이버를 통해 Java 기반 애플리케이션에서 SQL Server에 접속하여 쓸 수 있는 새로운 기능들을 소개하는 웹 캐스트입니다. 최근 JDBC 드라이버의 소스 코드를 GitHub 리포지터리에 게시하여 오픈소스화 하였으며, Maven 리포지터리를 통하여 JDBC 드라이버에 대한 종속성을 간편하게 추가할 수 있게 되었습니다.
  • Azure Media Indexer 2: Japanese support, punctuation improvements, no more time limit
    • 동영상에서 화자가 말하는 언어를 음성 인식하여 자막을 만들고 동영상 검색의 기본 데이터를 형성하는데 도움을 주는 Azure Media Indexer의 새 버전에서는 Microsoft Research의 연구 성과를 바탕으로 지속적으로 품질과 성능을 개선하고 있으며, 이번 릴리스에서는 일본어 음성 인식 지원, 10분 길이 제한 해제, 발음과 문법 품질 향상을 주안점으로 두고 있습니다.
  • Get Started with Azure Functions
    • Azure Function에 대한 튜토리얼 웹 캐스트입니다.
  • Digital marketing solutions on Azure
    • Orchard, Umbraco와 같은 유명 CMS 솔루션을 Azure 위에서 기술적인 지식 없이 손쉽게 구축하여 디지털 마케팅 전략에 활용할 수 있는 방안을 소개하는 웨비나 세션을 소개합니다.
  • Dev and test better in the cloud
    • Azure 및 클라우드 환경에서 개발과 테스트 전략을 더 효율적으로 수행할 수 있는 방법을 소개하는 무료 웹 캐스트입니다.

서드파티 소식

  • Kafka Connect for Azure IoT Hub
    • Azure IoT Hub에 연결하여 데이터를 Kafka로 보낼 수 있는 Connector의 오픈 소스 버전이 새롭게 공개되었습니다.

ClouDeveloper 페이스북 페이지에 댓글로 의견을 남겨주시면 뉴스 발행 및 각종 정보 전달에 반영하도록 하겠습니다. 고맙습니다.

의견 남기기: https://fb.com/cloudeveloper

[ClouDeveloper News – Azure Edition] 2016년 12월 8일

클라우드 컴퓨팅을 중심으로 관련된 여러 기술과 업계 소식을 매주 전하는 ClouDeveloper News를 시작합니다. 파일럿 프로그램으로 구상하여 운영 중에 있으며 추후 여러 피드백과 의견 수렴을 통하여 프로그램의 틀을 갖추어 나갈 예정이오니 많은 관심과 구독을 부탁드립니다.

이번주 커뮤니티 소식

  • 무료 Azure 교육 커리큘럼 공개
    • 2017년 6월 30일까지 다음의 커리큘럼이 무료로 제공됩니다.
      • Azure202x – Microsoft Azure Virtual Machines
      • Azure203x – Microsoft Azure Virtual Network
      • Azure204x – Microsoft Azure Identity
      • Azure205x – Microsoft Azure Storage
      • Azure214x – Microsoft Azure Fundamentals
      • Azure213x – Microsoft Azure for AWS Experts
  • Korea Embedded Linux Project 연합 세미나
    • 12월에는 KELP 커뮤니티 연합 세미나에 참여하게 되어 세션을 하나 발표하게 되었습니다. 행사는 12월 10일 토요일에 열리며, 오전 세션 (아침 10시 ~ 오후 2시), 오후 세션 (오후 2시 ~ 오후 5시)으로 나누어 선택하여 신청하실 수 있습니다.
    • 이번 KELP 연합 세미나는 우분투한국사용자모임, 자바카페 커뮤니티, Django Girls Seoul, 그리고 Microsoft Azure Korea가 함께 하는 세미나로 IoT를 공통 주제로 발표하는 세미나입니다.
      행사에 대한 세부적인 아젠다 및 참가 신청은 http://onoffmix.com/event/84425 에서 진행하실 수 있습니다.

Azure 서비스 공지 사항

행사 및 이벤트

  • Microsoft Tech Summit 2016-17
    • 전세계에서 열리는 Microsoft Tech Summit 행사 중, 한국에서는 2017년 4월 27일부터 28일까지 이틀 간 열립니다. 행사는 서울 잠실 롯데호텔월드에서 열릴 예정입니다.

교육 자료

새로운 제품 및 서비스

  • Sysmon v5, Process Explorer v16.20, Procdump v8.2, LiveKd v5.6
    • Sysinternals 유틸리티 중 인기있는 유틸리티인 Sysmon, Process Explorer와 함께 Procdump, LiveKd 유틸리티의 새 버전이 릴리스되었습니다. Windows OS를 기반으로 애플리케이션을 개발하거나 시스템을 모니터링할 때에는 꼭 필요한 필수 유틸리티들입니다.
  • Announcing a new book, Troubleshooting with the Windows Sysinternals Tools
    • Sysinternals 유틸리티의 사용법을 잘 알아두면 시스템이나 Windows OS에서 발생하는 문제를 해결하는데 큰 도움을 얻을 수 있습니다. 실제로 Sysinternals 유틸리티를 어떻게 활용하면 좋은지 상세한 가이드 북이 나와있습니다. 이 책은 Sysinternals 유틸리티의 개발자이자 Microsoft Azure 팀 사업부의 수장인 Mark Russinovich가 직접 집필하였습니다.
  • Announcing Microsoft BizTalk Server 2016 general availability
    • Visual Studio 2015, Windows Server 2016, SQL Server 2016 등 최근 출시된 개발 도구와 백엔드 서버 플랫폼들에 대한 호환성을 강화하고 클라우드 컴퓨팅 플랫폼에 좀 더 능동적으로 대응할 수 있도록 개선된 새 버전의 BizTalk Server가 정식으로 출시되었습니다.
  • Azure Mobile Apps for Apache Cordova reaches GA
    • Apache Cordova 개발 플랫폼에서 Azure Mobile Apps를 활용할 수 있는 SDK 및 도구가 정식 버전으로 릴리스되었습니다.
  • WMF 5.1 Releasing January 2017
    • Windows Management Framework 5.1 업데이트가 2017년 1월 중에 출시됩니다. Windows Server 2016에 포함된 것과 같은 버전입니다.
  • Sneak peek: A new Azure Cloud Console
    • Azure 포털에 웹 브라우저에서 바로 쓸 수 있는 콘솔 기능이 내장될 예정입니다. 현재 이 기능은 프리뷰 버전으로, 어떻게 콘솔을 활용할 수 있는지 상세한 내용과 데모 동영상이 같이 들어있습니다.

활용 및 노하우

웹 캐스트

서드파티 소식

  • Frame + Microsoft Azure = The Fastest Graphics in the Cloud!
    • 웹 브라우저 기반으로 Windows 애플리케이션을 스트리밍하는 엔터프라이즈 클라우드 플랫폼인 Frame이 Microsoft Azure의 N 시리즈 인스턴스를 기반으로 서비스를 제공하기 시작하였다는 소식입니다.

ClouDeveloper 페이스북 페이지에 댓글로 의견을 남겨주시면 뉴스 발행 및 각종 정보 전달에 반영하도록 하겠습니다. 고맙습니다.

의견 남기기: https://fb.com/cloudeveloper

Windows Azure Virtual Machine을 위한 FileZilla Server 방화벽 설정법

안녕하세요. Windows Azure MVP 남정현입니다.


오늘 살펴보려는 내용은 Windows Azure Virtual Machine 환경에서 FileZilla Server를 구축하려는 경우 어떻게 해야 파일 전송 채널들을 열 수 있는지 그 방법을 살펴보려고 합니다. FileZilla Server는 기본적으로 FTP (File Transfer Protocol)를 구현하는 서버이며 무료로 사용 가능한 서버이고 다양하고 풍부한 기능을 제공하면서도 안정적으로 작동해서 많은 곳에서 널리 사용되고 있습니다.


우선 FTP 서버가 어떻게 동작하는지 잠시 상기해볼 필요가 있습니다. FTP 서버는 기본적으로 명령어를 주고 받기 위한 채널 포트인 21번 포트가 가장 핵심이 됩니다. 최초의 연결도 이 21번 포트를 시작으로 이루어지고 이후에 모든 데이터 전송은 별도의 포트를 통해서 이루어지게 됩니다. FTP 서버를 방화벽 뒤에 배치하는 것이 왜 까다로운가 하면 바로 이러한 FTP의 설계 때문입니다. 데이터 전송을 위한 포트를 FTP 서버의 사용량에 맞추어 개방을 해야 하기 때문입니다. 그래서 서버가 사전에 TCP 포트 대역을 정해놓고 지정된 범위에서만 데이터 전송을 위한 채널을 제공하는 Passive Mode가 많이 사용됩니다.


1단계: FileZilla Server Passive Mode 설정


기본적으로 Passive Mode를 사용하는 것은 특이 사항이 없습니다만, Windows Azure Virtual Machine의 경우 Windows Azure Virtual Machine이 제공하는 기본 방화벽과 Windows Server의 기본 방화벽, 그리고 FileZilla Server만을 위한 특별한 설정이 더해져야 하기 때문에 따로 아티클로 정리할 필요가 있어 이번 글을 작성하게 되었습니다.


FileZilla 서버에 사용자 계정을 등록하고 홈 디렉터리를 설정하는 방법은 생략하겠습니다. 이 과정이 되어있어야 실제 접속과 테스트가 가능하니 설정되어있지 않은 경우 반드시 사용자 계정과 홈 디렉터리 설정을 먼저 해주셔야 합니다. 이 설정이 끝난 상태에서, FileZilla Server Options 페이지로 들어가서 아래 그림과 같이 Passive Mode Settings 항목을 클릭하여 주십시오.




위의 그림에 나타난 것 처럼, 다음의 설정 사항들을 확인하여 적절히 수정해야 합니다.



  • Use Custom Port Range: 체크하시고 적절한 포트 대역을 지정합니다. Windows Server 및 Windows Azure Virtual Machine의 방화벽 설정에 모두 등록되지 않은 대역을 지정합니다. Windows Azure Virtual Machine의 방화벽 설정은 범위 설정이 아니라 1개 포트씩 따로 등록하도록 되어있고 등록과 할당에 시간이 걸리니 이를 감안하시어 2개~3개 정도의 포트만 개방하는 것이 작업 시간 단축에 도움이 됩니다.

  • IPv4 specific 아래의 Retrieve external IP address from: 기본값은 이 항목으로 설정되어있습니다. 그러나 간혹 이 설정으로 IP 주소를 얻어올 수 없는 경우, Use the following IP 항목의 라디오 버튼을 체크하고 이 서비스에 접속할 수 있는 외부 IP 주소 (Virtual IP)를 직접 설정하거나 FQDN을 지정하여 문제를 해결할 수 있습니다.

  • Don’t use external IP for local connections: 이 항목도 체크합니다.

2단계: Windows Server 방화벽 구성

위와 같이 설정이 끝나면, Windows 방화벽 설정으로 이동하여 방화벽에 FileZilla Server 프로그램 자체를 허용 대상에 추가하여 주십시오. Windows Server 64비트 버전을 사용하게 되실 것이므로 아래 경로를 지정하시면 됩니다.


%PROGRAMFILES(X86)%FileZilla ServerFileZilla server.exe


정상적으로 등록이 되면 아래 그림과 같이 속성에 나타날 것입니다.



3단계: Windows Azure Virtual Machine 방화벽 설정


1단계에서 설정한 포트 대역의 각 포트 번호들과 TCP 21번 포트를 빠짐없이 Windows Azure Virtual Machine 방화벽 설정으로 가서 개방해야 밖에서 데이터 전송이 가능합니다.



위 그림에서 보시는 것과 같이 Passive 포트 대역을 모두 TCP 포트 번호로 지정하여 공용 포트와 개인 포트 번호를 일치시켜주고, 최종적으로 21번 포트를 지정하면 됩니다. 여기서는 Secured FTP를 위하여 별도 포트 번호를 지정하였습니다만 상황에 맞게 설정해주시면 문제 없습니다.


4단계: 접속 및 파일 송수신 테스트


정상적으로 접속과 파일 송수신이 이루어지는지 다시 한 번 확인합니다. 클라이언트의 경우 아래 그림과 같은 모습으로 진행이 이루어져야 합니다.



서버의 경우 아래 화면처럼 로그가 나타나게 될 것입니다.




다른 FTP 서버에 대한 설정도 지금 설명한 사항들을 점검하여 설정을 업데이트하면 Virtual Machine에서 정상적인 FTP 서비스 구축이 가능할 것입니다.

Azure BLOB 저장소 레시피 – 모바일 홈페이지 만들기

안녕하세요. Windows Azure MVP 남정현입니다.


Windows Azure를 가지고 무엇을 할 수 있을까? 이 점에 대해서 궁금해하시는 많은 분들을 위하여 레시피 강좌 시리즈를 지속적으로 업로드하려고 합니다.


이번에 소개해드리려고 하는 내용은 요즈음 유행하는 HTML5 기반의 앱과 관련된 내용입니다. 서버의 렌더링을 필요로하지 않고 스스로 동작할 수 있는, 마치 앱과 같은 특성을 지닌 지능적인 HTML 페이지를 Windows Azure BLOB Storage위에서 호스팅하는 방법입니다.


사실 지금 소개해드리려는 내용은 굉장히 간단한 내용이지만, 활용하기에 따라서는 굉장히 유용한 레시피가 될 수 있습니다. 이벤트나 행사 웹 사이트와 같이 단순하지만 기간 내에 액세스가 폭증하는 페이지들을 호스팅해야 하는 요구 사항이 종종 있는데 이럴 때 활용하시면 일을 매우 단순하게 만들 수 있습니다.


정적 웹 사이트에 담을 내용 준비하기


정적 웹 사이트란 문자 그대로 웹 디자이너가 작업을 끝마친 시안 형태의 웹 페이지에서부터 ASP, PHP, ASP.NET, CGI, Python, Perl 등 생각할 수 있는 서버측 구성 요소를 하나도 들여오지 않고 jQuery나 Dojo 같은 자바스크립트 프레임워크들, 그리고 외부의 Open API만을 활용해서 온전하게 작동하는 웹 앱에 이르기까지 운영해야 할 서버 측의 비용을 고려하지 않고 만들 수 있는 모든 종류의 웹 사이트 및 웹 앱을 뜻합니다. 자바스크립트 세계의 발전에 따라 정적 웹 사이트의 의미도 크게 확장되었다고 볼 수 있습니다.


여기서는 jQuery Mobile을 이용하여 만든 간단한 웹 사이트를 Windows Azure Storage를 이용해서 호스팅하도록 해보겠습니다. 소개하는 내용이 아니더라도 여러분이 손수 만든 개인 모바일 홈페이지도 괜찮고 무엇이든 시험해볼 수 있는 것이면 됩니다.



  • 준비물 1: CloudBerry Client for Windows Azure BLOB Storage (Pro 버전 대신 Freeware를 설명합니다.)

  • 준비물 2: jQuery Mobile 패키지 파일

  • 준비물 3: 여러분이 올릴 간단한 웹 페이지 파일 및 이미지 파일

CloudBerry Client for Windows Azure BLOB Storage 설치하기


CloudBerry Client는 여러 종류의 Windows Azure BLOB Storage 클라이언트 중 다루기 쉽고 간편한 인터페이스를 제공하는 무료 클라이언트입니다. CloudBerry Client는 Windows Azure 이외에도 KT UCLOUD Biz Storage 클라이언트와 같은 OpenStack Client도 지원합니다.



http://www.cloudberrylab.com/ 웹 사이트에 방문하시면 메인 페이지에 CloudBerry Explorer Freeware라는 이름의 다운로드 링크 컬렉션이 보일 것입니다. 여기서 for Windows Azure를 선택하여 이번 레시피에서 설명하는데 필요한 도구를 다운로드하고 설치합니다.


프리웨어이지만 사용자 등록을 권하는 부분이 있는데, 지속적으로 이 도구를 사용하게 될 것을 감안하여 재량껏 등록하여 사용하기 바랍니다. 등록하지 않고 진행해도 사용에는 큰 지장은 없을 것입니다.


설치 후 아래와 같이 프로그램이 나타나는지 확인합니다.



계정 정보 등록하기


새로운 계정 정보를 등록하려면 아래 그림과 같이 File 메뉴의 Azure Blob Storage Accounts 메뉴를 선택합니다.



아래와 같이 대화 상자가 나타날 것입니다. Add 버튼을 클릭합니다.



아래와 같이 계정 정보 입력 대화상자가 나타나는지 확인합니다.




  • Display name: 이 프로그램 상에서 나타낼 항목 이름으로 자유롭게, 알아보기 쉬운 이름으로 입력합니다.

  • Account: Windows Azure 저장소의 ID를 입력합니다. URL을 보면 <계정 이름>.blob.core.windows.net와 같은 형태로 구성되어있는데 여기서 <계정 이름>에 해당하는 ID를 입력합니다.

  • Shared Key: Windows Azure 관리 포털에서 나타나는 이 저장소에 대한 Shared Key를 입력합니다. Primary Key나 Secondary Key 중 하나를 입력하면 됩니다. 보안 향상을 위하여, 서비스 구성을 위해 활용하는 Key와는 다른 여분의 Key를 이곳에 설정하는 것이 좋습니다. 이렇게 하여 불시에 이 Key를 갱신하여 유출 사고 등에 유연하게 대처할 수 있게 됩니다.

  • Use SSL: SSL 통신을 사용할 지의 여부를 결정합니다.

  • Development Storage: 실제 서비스가 아니라 Windows Azure Storage Emulator로 연결할 경우 이 항목을 체크합니다.

계정 정보를 확인하려면 http://manage.windowsazure.com/ 으로 이동하여 저장소 계정 화면에 대한 대시 보드를 아래와 같이 확인합니다. 그 다음 하단의 도구 모음에서 Manage Keys 버튼을 클릭합니다.



아래와 같이 모달 대화 상자가 나타나면 Storage Account Name을 복사하시고, Primary Access Key 또는 Secondary Access Key 중 하나를 복사하여 위의 대화 상자에 입력하도록 합니다.



모든 설정이 완료되면 Test Connection 버튼을 클릭하여 연결이 잘 되는지 확인합니다. 연결에 성공하면 아래와 같이 대화 상자가 나타날 것입니다.



jQuery Mobile 패키지 준비하기


기본적으로 jQuery Mobile 패키지 파일을 CDN에서 받아서 이용하는 방법이 편리합니다. 이렇게 하면 jQuery Mobile 다운로드에 관한 트래픽을 우리쪽 서버가 아닌 다른 위치의 CDN으로 분산시킬 수 있으므로 트래픽 관련 비용 절감에 도움이 되기도 합니다. 여기서는 jQuery Mobile 패키지를 우리쪽 서버에 업로드하는 것을 기준으로 예제를 만들어 보도록 하겠습니다.


http://jquerymobile.com/download/ 웹 페이지에 접속하여 아래와 같이 Latest Stable Release를 찾아 JavaScript와 CSS 파일 패키지를 Minified Version으로 다운로드하기 바랍니다. 링크를 클릭하면 저장이 아니라 파일이 열리는 동작으로 다운로드가 발생할 수 있으므로 링크를 오른쪽 버튼으로 클릭하고 다른 이름으로 저장 기능을 사용하여 저장하기 바랍니다.



그리고 jQuery Mobile이 필요로하는 jQuery 라이브러리 파일도 가져와야 합니다. http://jquery.com/download/ 웹 페이지에 접속하여 아래와 같이 Minified Version을 다운로드합니다.



NOTE: 최근에 릴리즈한 1.9.x 버전의 경우 jQuery Mobile과 호환성 문제가 있을 수 있으므로 1.8.x 릴리즈를 다운로드해야 할 수 있습니다. 1.9.x 버전이 작동하지 않을 경우 1.8.x 버전을 사용하여 진행할 수 있습니다.


컨테이너를 만들고 권한 설정하기


이제 컨테이너를 만들고 여기에 파일을 업로드할 차례입니다. 다시 CloudBerry Storage Explorer로 되돌아가서 오른쪽 패널의 Source 드롭 다운 상자에서 방금 추가한 계정을 선택하여 접속을 시도합니다. 



Windows Azure Storage는 전통적인 웹 호스팅 환경과는 다르며, 기본적으로 1계층의 컨테이너만을 지원합니다. 그리고 컨테이너보다 더 깊이있는 레벨의 폴더 계층을 형성하려면 올리는 파일의 이름에 경로 구분을 위한 문자 (‘/’)를 포함시켜 폴더처럼 보이게 하는 방법을 사용하게 됩니다.


API에서 폴더를 탐색한다는 것은 이러한 특성에 따라 실제 폴더로 스택 자료 구조를 이용해서 탐색하는 방식이 아니라, Where Clause를 이용할 때 사용할 수 있는 Prefix Matching 기법을 사용하게 됩니다. 즉, 같은 Prefix를 보유하는 컨테이너 내의 파일들은 논리적으로 같은 폴더에 있는 것으로 취급이 가능합니다.


컨테이너를 만들기 위해서는 아래 그림과 같이 오른쪽 편의 도구 모음을 클릭합니다.



아래와 같이 대화 상자가 나타나면 컨테이너의 이름을 입력하고 권한을 설정합니다.



위의 권한들에 대해 각각 내용을 살펴보면 다음과 같습니다.



  • Full public read access: 이 컨테이너의 URL로 접속하면 컨테이너 안에 무슨 파일이 들어있는지 목록을 조회할 수 있는 기능과 더불어 모든 파일에 대해 다운로드 기능을 제공함을 의미합니다.

  • Public read access for blobs only: 이 컨테이너의 URL로 접속하면 권한이 없다는 오류 메시지가 나타나고, 대신 이 컨테이너 안의 정확한 파일의 URL을 알고 있는 경우 해당 파일은 다운로드가 가능함을 의미합니다.

  • No public read access: 컨테이너이든 그 안에 들어있는 파일이든 인증을 거치지 않고는 읽을 수 없도록 보호함을 의미합니다.

위의 세 가지 옵션 중에서 지금 우리가 선택하려는 것은 두 번째 옵션으로, 정적 웹 호스팅에서 어떤 파일이 들어있는지 사용자가 확인할 필요 없이 개별 URL에 대해서만 안다면 자동으로 모든 서비스가 제공되므로 파일에 대해서만 공개하도록 만들 것입니다.


파일 업로드하기


여기서는 정적 웹 호스팅을 간단하게 테스트해볼 목적으로 1계층 컨테이너 안에 같은 파일들을 넣어보려고 합니다. 여러분의 컴퓨터에서 아래와 같이 파일을 준비하시면 됩니다.



그리고 위의 index.html 파일의 소스 코드는 아래와 같습니다.


[#M_더보기|접기|<!DOCTYPE html>
<html>
    <head>
        <meta charset=”utf-8″ />
        <meta name=”viewport” content=”width=device-width, initial-scale=1″ />
        <meta name=”apple-mobile-web-app-capable” content=”yes” />
        <meta name=”apple-mobile-web-app-status-bar-style” content=”black” />
        <title>
        </title>
        <link rel=”stylesheet” href=”jquery.mobile-1.2.0.min.css” />
        http://jquery-1.8.3.min.js
        http://jquery.mobile-1.2.0.min.js
       
            try {

    $(function() {


    });


  } catch (error) {
    console.error(“Your javascript has an error: ” + error);
  }
       
    </head>
    <body>
       

<

div id=”page1″>
           

               

                    Seoul
               

           

           

               

                    Welcome!
               

                https://maps.googleapis.com/maps/api/staticmap?center=서울&zoom=14&size=288×200&sensor=false” width=”288″ height=”200″ />
           

           

<

div>
               

                   

                           

  •                            
                                    Seoul
                               

                           
  •                        

  •                             http://www.google.co.kr/” data-transition=”fade” data-theme=”” data-icon=””>
                                    Google
                               
                           
  •                        

  •                             http://m.naver.com/” data-transition=”fade” data-theme=”” data-icon=””>
                                    NAVER
                               
                           
  •                    

               

            </div>
        </div>
    </body>
</html>

_M#]

이제 위의 소스 코드를 Azure Blob Storage로 업로드합니다. 아래와 같이 파일이 업로드된 것을 확인합니다.



결과 확인하고 QR코드로 만들어 배포하기


이제 마지막으로 올라간 파일이 잘 작동하는지 확인할 차례입니다. 위의 파일들 중 index.html 파일을 오른쪽 버튼으로 클릭하여 URL을 확인합니다.



아래와 같이 대화 상자가 나타나면 Copy to clipboard 버튼을 클릭하여 주소를 복사하고 웹 브라우저에서 열어보도록 합니다. (혹은 Open link 버튼을 눌러도 됩니다.)



웹 브라우저에서 아래와 같이 잘 나타나는지 확인합니다.



이제 이 URL을 QR코드로 만들기 위하여 http://qr.naver.com/ 으로 접속하여 QR코드를 만들면 모바일 웹 사이트 구축이 완료됩니다.


더 나아가기


만약 폴더 구조를 유지하면서 파일 업로드를 하기 원한다면, Storage Explorer에서는 폴더를 직접 생성하는 기능이 없지만, 미리 로컬에서 만든 폴더째로 한꺼번에 업로드하면 자동으로 폴더를 생성하게 됩니다.


그리고 Windows Azure CDN 노드를 추가하면 이 상태 그대로 CDN 서비스를 받을 수 있습니다. CDN 엣지 노드 형성은 2013년 2월 현재 신규 포털이 아닌 구 버전의 포털 http://windows.azure.com/ 에서 관리할 수 있습니다.

Visual Studio 2012 Express 출시

안녕하세요. Windows Azure MVP 남정현입니다. 오늘은 Visual Studio 2012 출시와 더불어서 Express Edition의 업그레이드에 대한 이야기를 전해드리려고 합니다.



개인적으로 매우 좋아하고 아끼는 Visual Studio 제품 라인 업 중에 Express Edition이 있습니다. 무료로 제공되는 개발 도구임에도 기능에서나 활용 면에서 부족함이 전혀 없고, 제 스스로에게 있어서 작업 시간을 줄여주고 시행 착오를 최소화하는데에 지대한 공헌을 하는 멋진 개발 툴입니다.


이번 2012 라인 업에서는 아래와 같이 구성이 변경되었습니다.



  • Visual Studio 2012 Express for Web: 기존의 Visual Web Developer 2010을 이어서 업그레이드된 버전으로 ASP.NET 4.5와 Windows Azure 최신 개발 툴킷, Silverlight 개발 환경등을 포함하고 있습니다.

  • Visual Studio 2012 Express for Desktop: 기존의 Visual C# Express 2010, Visual Basic .NET Express 2010, Visual C++ Express 2010을 통합하여 데스크탑 응용프로그램 개발에 최적화된 버전으로 업그레이드되었습니다.

  • Visual Studio 2012 Express for Windows 8: Windows 8에서 새로 추가된 Windows Store 앱을 만들기 위하여 필요한 개발 도구로 동시에 Expression Blend for Windows 8이 같이 설치됩니다.

  • Visual Studio Team Foundation Server 2012 Express: 고가의 상용 버전 제품으로만 알려져있었던 Team Foundation Server도 Express 버전을 새로 출시하게 되었습니다. 소규모 개발 팀을 운영 중인 경우 한 번즈음 고려해볼 수 있는 형상 관리, 작업 관리, 빌드 자동화를 제공합니다.

언어 별로 나누어져 있었기 때문에 장점이자 단점으로 동시에 작용하던 작고 가벼움은 아쉽게도 더 이상 존재하지는 않습니다. 그렇지만 Express Edition 특유의 한계를 극복하고 더 강력한 기능을 더하고 단순히 학습용이 아닌 소규모 개발 팀을 위한 배려를 모두 포함하고 있다는 것은 매우 기쁜 일입니다.


그리고 실제로 Visual Studio 2012 전체 버전을 구입하시기 전에 제품의 표면적인 기능만을 제한된 시간 내에 평가해야 하는 트라이얼 버전 대신, 실제 업무에도 자연스럽게 반영해볼 수 있는 Express Edition을 통해서 충분한 시간을 가지면서 활용하시면 좀 더 좋은 부분을 많이 보실 수 있을 것이라고 기대합니다.


Web과 Desktop 버전은 Windows 운영 체제 버전과 관계없이 사용이 가능하며, Windows 8 버전의 경우에는 실제로 Windows 8 운영 체제 위에서 실행되어야만 개발 환경 구축이 가능합니다. 그리고 이전과 마찬가지로, 무료로 사용이 가능하고 상용으로도 활용이 가능하지만 설치 후 기간 내에 Microsoft 등록 페이지에 가서 제품에 대한 25자리 등록 번호를 받아서 등록해야 하는 절차는 변함 없습니다.


2012 Express Edition과 2010 Express Edition을 다운로드하시려면 http://www.microsoft.com/visualstudio/kor/downloads 페이지로 가시면 됩니다. 🙂

클라우드 시대의 피아식별: Access Control #3

지난번 글에 이어서 Access Control을 실제 ASP.NET 응용프로그램에 연동하는 방법을 살펴보도록 하겠습니다. Access Control을 연동하기 위해서는 .NET의 경우 Windows Identity Foundation이라는 새로운 기술을 필요로 합니다. Windows Identity Foundation은 여러 버전의 런타임으로 나누어져 있으며, Windows Server 2003부터 Windows Server 2012까지 지원되지만, 보통은 Windows Server 2008 이후의 OS를 사용하는 것이 구성이나 배포가 단순합니다.


이 글에서는 Visual Studio 2010과 WIF 3.5를 사용하는 것을 기준으로 가이드를 쓰려고 합니다. 역시 나중에 기회가 되면 Visual Studio 2012와 WIF 4.5기준의 업데이트를 한 번 더 소개하겠습니다.


글에 있는 내용을 따라서 시작하기 전에 ACS를 이용하는 웹 사이트를 배포할 서버와 개발자 컴퓨터에 다음의 런타임을 버전에 맞추어 선택적으로 미리 설치하여 구성하셔야 합니다.


운영 체제 버전 별 런타임 설치하기



개발 도구 (SDK) 설치하기


개발 도구의 경우 한국 Microsoft 홈페이지에는 3.5 버전의 SDK만 게시되어있는데, .NET Framework 3.5가 아닌 4.0을 타겟으로 하는 경우에는 영어 홈페이지로 이동해서 직접 다운로드해야 합니다. 아래는 패키지 파일 다운로드 경로를 직접 걸어놓은 것으로 필요한 패키지를 골라 설치하면 됩니다.



SDK 또한 Windows Server 2003 SP2 부터 설치가 가능합니다.


Windows 8 및 Windows Server 2012에서 WIF 3.5 런타임 설치하기


Windows Identity Foundation 4.5 대신 3.5 버전을 사용해야 할 경우 아래 절차를 거쳐 설치할 수 있습니다.


제어판의 프로그램 및 기능 – 또는 – 프로그램 빠른 검색이나 Windows + R 단축키로 사용 가능한 실행 대화 상자에서 appwiz.cpl 제어판 애플릿을 시작합니다.



그 다음 Windows 기능 켜기/끄기 마법사를 시작합니다.



여러 항목들 중에서 Windows Identity Foundation 3.5 항목을 체크하고 확인 버튼을 클릭합니다.



잠시 기다리면 아래와 같이 완료 대화 상자가 나타납니다.



이제 여기에 WIF SDK 3.5 – 또는 – 4.0 버전을 설치하면 됩니다.


Visual Studio 2008 및 Visual Studio 2010의 경우 – FEDUTIL.EXE 사용하기


런타임의 경우 Windows Identity Foundation의 실행을 위한 클래스 라이브러리 및 네이티브 구성 요소들을 배포하기 위한 목적으로 사용하는 것이고, 기존에 만든 응용프로그램의 환경 설정 파일을 변경하거나 클래스 라이브러리 도움말 등을 포함하는 것이 SDK의 구성입니다. 그리고 부가적으로 SDK의 경우에는 Visual Studio와 연동하는 기능도 제공합니다만 이 기능은 제대로 설치가 될 수도 있고 그렇지 않을 수도 있어서 신경쓸 필요는 없는 부분입니다. SDK에서 진짜 중요한 부분은 FEDUTIL.EXE 라는 마법사형 프로그램으로 이 프로그램을 사용하여 여러분의 asp.net 응용프로그램을 WIF, ACS와 연결시킬 때 필요한 복잡한 설정을 자동화할 수 있습니다.


시스템 사용 환경에 따라 FedUtil.exe 파일의 설치 위치에 다소 차이가 있지만 아래와 같이 요약할 수 있습니다.



  • 32비트 버전 설치 시: %programfiles%Windows Identity Foundation SDKv4.0FedUtil.exe

  • 64비트 버전 설치 시: %programfiles(x86)%Windows Identity Foundation SDKv4.0FedUtil.exe

FedUtil.exe 프로그램을 실행시키고 잠시 기다리면 아래와 같이 마법사가 시작됩니다.



UI 언어는 환경에 따라 한국어가 나올 수도, 영어가 나올 수도 있습니다. 응용프로그램 설정 파일의 위치를 묻는 부분에는 여러분이 WIF를 적용하려는 ASP.NET 웹 프로젝트의 기본 web.config 파일 경로를 지정하는 곳이며, Visual Studio로 해당 프로젝트를 편집 중에 있더라도 안전하게 적용할 수 있습니다.


노트: Visual Studio와 연동된다는 것은 이 유틸리티를 프로젝트 실행 도중 즉시 호출할 수 있도록 “STS 추가 마법사”라는 이름으로 솔루션 탐색기 컨텍스트 메뉴에 추가하는 정도의 편의 제공이기 때문에 이 유틸리티를 직접 호출해도 무방합니다.


그리고 Application URI에는 지난번 글에서 소개했던 것과 같이 Ad-hoc 서버의 포트 번호를 확인하여 얻을 수 있는 localhost 주소를 이곳에 기재해야 합니다. 프로덕션 환경에서 적용하려면 당연히 이 부분이 실제 프로덕션 웹 사이트의 주소가 되어야 합니다.


Application URI에 HTTPS대신 HTTP 주소를 지정할 경우 아래와 같은 경고 메시지가 나타나지만, Access Control 테스트를 위한 것이므로 지금은 무시하고 넘어갑니다.



계속 진행하면 보안 토큰 서비스의 주소를 물어보는 단계가 나타납니다. 이 단계에서 실제로 Azure Access Control Service의 웹 서비스 주소를 지정하여 WIF와 ACS간에 연동을 이루게 됩니다.



여기에 어떤 주소를 넣어야 할까요? 다시 Azure Access Control 관리자 웹 서비스로 되돌아가봅니다. 관리자 웹 서비스 페이지 좌측 제일 하단의 응용프로그램 통합 링크를 클릭하면 페이지 하단에 STS 서비스를 위한 WS-Federation Metadata Endpoint URL이 보이는데 이 주소를 그대로 Copy & Paste합니다.



다음 단계로 진행하면 ACS 서비스가 제시한 인증서가 올바른 인증서가 아니라는 오류를 표시합니다. 이전에 언급한대로 Azure ACS가 프로덕션 환경에서 제대로 작동하려면 정식 서버 인증서를 필요로 합니다. 여기서는 마법사가 기본으로 제안하는 인증서 체인 검사 비활성화를 선택하고 진행하겠습니다.



토큰 암호화에 대한 설정을 지정하는 페이지가 나타납니다. ACS 설정에서 토큰 암호화에 대한 부분을 구성하였다면 이 단계에서도 호환 가능한 설정을 같이 지정해야 합니다.



웹 서비스가 던져줄 수 있는 클레임의 종류에 대한 설명이 열거됩니다. 다음 버튼을 클릭합니다.



이제 마침 버튼을 눌러 web.config 파일을 업데이트합니다.



별다른 이상이 없다면 아래와 같이 성공 메시지 상자가 나타나고 FedUtil.exe 프로그램이 종료될 것입니다.



NOTE: Visual Studio를 실행 중이었다면 web.config 파일을 열어둔 상태였을 경우 파일이 변경되었음을 감지하고 다시 읽어들일 것인지 물어볼 수 있습니다. 이 경우 꼭 바뀐 파일 내용을 다시 읽도록 해주어야 하며, 편집기 버퍼에 남아있는 컨텐츠를 저장하면 FedUtil.exe로 변경한 내용이 소실되므로 유의해야 합니다. 편집기 버퍼에서 바꾼 내용이 FedUtil.exe 실행 전에 많이 존재한다면 변경된 web.config 파일을 별도로 백업받아놓고 두 파일을 적절하게 병합해야 합니다.


변경된 web.config 파일 내용 살펴보기


이제 FedUtil.exe 프로그램에서 어떤 일을 해주었는지 살펴볼 차례입니다. 우선 여러분의 웹 프로젝트 디렉터리에 새로운 디렉터리와 파일들이 나타나는데, 아래와 같습니다. 



FederationMetadata 폴더에 ACS 서비스와 상호대조를 위한, ACS로부터 복제한 메타데이터 파일이 들어있습니다. 실제 서비스가 제대로 작동하기 위해서는 이 파일이 개발자 환경이나 프로덕션 서버로 정확하게 배포되어야 합니다. 버전 관리 시스템을 사용하는 경우 이 파일이 버전 관리 대상에 포함될 수 있도록 해야 합니다.


그리고 web.config 파일이 변경된 것과 더불어 이전 파일에 대한 백업도 들어있습니다. 백업 파일은 확인 후 필요없으면 삭제해도 무방합니다.


그렇다면 web.config 파일은 어떻게 바뀌었는지 한 번 살펴보도록 할까요?우선 파일을 열었을 때 가장 먼저 눈에 띄는 것은 새로운 Configuration Handler를 추가한 부분인데, 아래와 같습니다.


  <configSections>
    <section name=”microsoft.identityModel” type=”Microsoft.IdentityModel.Configuration.MicrosoftIdentityModelSection, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ />
  </configSections>


새로운 Configuration Handler를 지정하고 있으므로 설정 파일 어딘가에 새로운 설정 섹션이 하나 더 추가되어있겠군요. 그리고 appSettings 태그 아래에는 메타데이터 원본 경로에 대한 설정이 들어있습니다.


  <appSettings>

    <add key=”FederationMetadataLocation” value=<A href="https://.accesscontrol.windows.net/FederationMetadata/2007-06/FederationMetadata.xml”>https://<네임스페이스>.accesscontrol.windows.net/FederationMetadata/2007-06/FederationMetadata.xml />

  </appSettings>


그리고 직전에 살펴본 FederationMetadata 폴더를 위한 특권이 하나 들어있습니다. 인증 세션을 거치지 않았어도 누구나 FederationMetadata 폴더는 접근할 수 있도록 열어놓았군요.


  <location path=”FederationMetadata”>
    <system.web>
      <authorization>
        <allow users=”*” />
      </authorization>
    </system.web>
  </location>


반면에 웹 응용프로그램의 모든 영역에 대해서는 보호가 걸리게 됩니다.


  <system.web>

    <authorization>
      <deny users=”?” />
    </authorization>
    <authentication mode=”None” />

    <!–Commented out by FedUtil–>
    <!–<authentication mode=”Forms”><forms loginUrl=”~/Account/LogOn” timeout=”2880″ /></authentication>–>
  </system.web>


달리 표현하면 web.config이 관할하는 모든 영역에 대해서는 ACS를 통한 로그인을 거치지 않을 경우 자동으로 ACS측 로그인 페이지로 리디렉션됨을 의미합니다. 이 부분에 대한 조율이 필요하다면 ASP.NET MVC의 경우 영역으로 별도 영역을 파티셔닝하거나, Location 태그를 적극 활용해야 합니다. 그리고 중요한 차이점이 하나 더 보이는데 WIF의 인증 체계는 기존의 ASP.NET이 제공하던 Form 인증, AD 인증, Windows 인증 및 Passport 인증 어디에도 속하지 않는다는 것입니다.


그리고 당연한 이야기이지만 어셈블리 참조가 걸려있습니다. web.config 파일 및 동적 컴파일 호출 시 유효한 대상으로 걸려있는 것이고, Visual Studio 프로젝트나 별도 컴파일 호출 시 WIF를 사용하려면 프로젝트 참조에서 Microsoft.IdentityModel 어셈블리를 직접 추가해야 합니다.


  <system.web>
    <compilation debug=”true” targetFramework=”4.0″>
      <assemblies>

        <add assembly=”Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″ />

      </assemblies>
    </compilation>

  </system.web>


ASP.NET 차원에서는 마지막으로 HTTP 모듈이 대체되는 부분이 있습니다. WIF가 기존 ASP.NET 인증 체계를 완전히 재정의해야 하므로 아래의 모듈이 새로 추가됩니다.


    <httpModules>
      <add name=”WSFederationAuthenticationModule” type=”Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ />
      <add name=”SessionAuthenticationModule” type=”Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ />
    </httpModules>


같은 설정이지만 IIS 7 이후의 서버들을 위해서는 <system.webServer> 태그 설정도 동일하게 추가됩니다.


  <system.webServer>
    <validation validateIntegratedModeConfiguration=”false” />
    <modules runAllManagedModulesForAllRequests=”true”>
      <add name=”WSFederationAuthenticationModule” type=”Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ preCondition=”managedHandler” />
      <add name=”SessionAuthenticationModule” type=”Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ preCondition=”managedHandler” />
    </modules>
  </system.webServer>


이제 끝으로 제일 서두에 언급된 새로운 설정 핸들러가 web.config 끝자락에 보입니다.


  <microsoft.identityModel>
    <service>
      <audienceUris>
        <add value=”http://localhost:50086/” />
      </audienceUris>
      <federatedAuthentication>
        <wsFederation passiveRedirectEnabled=”true” issuer=”https://rkttuacs.accesscontrol.windows.net/v2/wsfederation” realm=”http://localhost:50086/ ” requireHttps=”false” />
        <cookieHandler requireSsl=”false” />

      </federatedAuthentication>
      <applicationService>
        <claimTypeRequired>
          <!–Following are the claims offered by STS ‘https://rkttuacs.accesscontrol.windows.net/’. Add or uncomment claims that you require by your application and then update the federation metadata of this application.–>
          <claimType type=”http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name” optional=”true” />
          <claimType type=”
http://schemas.microsoft.com/ws/2008/06/identity/claims/role” optional=”true” />
          <!–<claimType type=”http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier” optional=”true” />–>
          <!–<claimType type=”
http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider” optional=”true” />–>
        </claimTypeRequired>
      </applicationService>
      <issuerNameRegistry type=”Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″>
        <trustedIssuers>
          <add thumbprint=”CE5BF1CE19528FEDA7FA9F3ECF87A85E3B1B6AED” name=”https://rkttuacs.accesscontrol.windows.net/” />
        </trustedIssuers>
      </issuerNameRegistry>
      <certificateValidation certificateValidationMode=”None” />
    </service>
  </microsoft.identityModel>


위의 내용들 가운데에서 굵게 강조 표시한 항목들이 변경의 여지가 있고 제어가 가능한 부분들입니다. 지금으로서는 테스트를 목적으로 하는 것이므로 따로 변경할 것은 없겠습니다.


잘 작동할까요?


워낙에 중요하고 어려운 부분들만 수정해놓은 것이라 불안하게 보입니다. 잘 작동할까요? 한 번 실행해보겠습니다. 



설정 파일에서 변경한대로 사이트에 접속하자마자 ACS 로그인 페이지로 이동합니다. 이후에 다시 살펴보겠지만 이 페이지의 디자인은 얼마든지 재정의 가능합니다. 여기서 Google ID를 시험삼아 로그인에 사용하도록 해보겠습니다.



로그인을 거치고나니 이런 오류 메시지가 나타납니다. 이 문제를 어떻게 해결해야 할까요?


WIF 3.5의 호환성 문제 해결하기


전통적인 로그인 및 사용자 인증 모델에서는 고려할 수 없었던 동작을 수행해야 하는데 안타깝게도 ASP.NET은 이러한 부분에 대해서 다소 부정적인 면모를 보입니다. 이 문제를 해결하는 방법 자체는 단순합니다. 입력 폼으로 들어오는 XML 데이터를 무시하도록 설정을 완화시키면 가능합니다. 그렇지만 그냥 그렇게 프로덕션 환경에 설정을 풀어놓은채로 올리기에는 너무 안일합니다. 뭔가 좋은 방법이 없을까요?


유효성 검사를 풀지 않으면서도 안전하게 WIF와 ACS 사이의 통신을 인정할 수 있는 방법으로 Custom Validation Handler를 추가하는 방법이 있습니다. 이 코드는 아래의 웹 페이지의 코드를 인용한 것입니다.
http://undefinedbroker-config.js?1344170599926


http://social.technet.microsoft.com/wiki/contents/articles/1725.windows-identity-foundation-wif-a-potentially-dangerous-request-form-value-was-detected-from-the-client-wresult-t-requestsecurityto.aspx


C# 소스 코드



//—————————————————————————–
//
// THIS CODE AND INFORMATION IS PROVIDED ‘AS IS’ WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
//—————————————————————————–


using System;
using System.Collections.Specialized;
using System.Web;
using System.Web.Helpers;
using System.Web.Util;
using Microsoft.IdentityModel.Protocols.WSFederation;


/// <summary>
/// This SampleRequestValidator validates the wresult parameter of the
/// WS-Federation passive protocol by checking for a SignInResponse message
/// in the form post. The SignInResponse message contents are verified later by
/// the WSFederationPassiveAuthenticationModule or the WIF signin controls.
/// </summary>
public class SampleRequestValidator : RequestValidator
{
    protected override bool IsValidRequestString(
        HttpContext context, string value, RequestValidationSource requestValidationSource,
        string collectionKey, out int validationFailureIndex)
    {
        validationFailureIndex = 0;


        if (requestValidationSource == RequestValidationSource.Form &&
            !String.IsNullOrEmpty(collectionKey) &&
            collectionKey.Equals(WSFederationConstants.Parameters.Result, StringComparison.Ordinal))
        {
            NameValueCollection unvalidatedFormValues = Validation.Unvalidated(context.Request).Form;
            SignInResponseMessage message = WSFederationMessage.CreateFromNameValueCollection(
                WSFederationMessage.GetBaseUrl(context.Request.Url),
                unvalidatedFormValues) as SignInResponseMessage;


            if (message != null)
                return true;
        }


        return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
    }
}


Visual Basic .NET 코드



‘—————————————————————————–

‘ THIS CODE AND INFORMATION IS PROVIDED ‘AS IS’ WITHOUT WARRANTY OF
‘ ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
‘ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
‘ PARTICULAR PURPOSE.

‘ Copyright (c) Microsoft Corporation. All rights reserved.


‘—————————————————————————–


Imports System
Imports System.Collections.Specialized
Imports System.Web
Imports System.Web.Helpers
Imports System.Web.Util
Imports Microsoft.IdentityModel.Protocols.WSFederation


”’ <summary>
”’ This SampleRequestValidator validates the wresult parameter of the
”’ WS-Federation passive protocol by checking for a SignInResponse message
”’ in the form post. The SignInResponse message contents are verified later by
”’ the WSFederationPassiveAuthenticationModule or the WIF signin controls.
”’ </summary>
Public Class SampleRequestValidator
    Inherits RequestValidator


    Protected Overrides Function IsValidRequestString( _
        context As HttpContext, value As String, requestValidationSource As RequestValidationSource, _
        collectionKey As String, ByRef validationFailureIndex As Integer) As Boolean


        validationFailureIndex = 0


        If requestValidationSource = Util.RequestValidationSource.Form AndAlso _
            String.IsNullOrEmpty(collectionKey) = False AndAlso _
            collectionKey.Equals(WSFederationConstants.Parameters.Result, StringComparison.Ordinal) Then


            Dim unvalidatedFormValues As NameValueCollection = Validation.Unvalidated(context.Request).Form
            Dim message As SignInResponseMessage = TryCast(WSFederationMessage.CreateFromNameValueCollection( _
                WSFederationMessage.GetBaseUrl(context.Request.Url), _
                unvalidatedFormValues), SignInResponseMessage)


            If message IsNot Nothing Then
                Return True
            End If
        End If
        Return MyBase.IsValidRequestString(context, value, requestValidationSource, collectionKey, validationFailureIndex)
    End Function
End Class


위의 코드가 이상 없이 컴파일이 잘 되는지 프로젝트에 클래스를 새로 하나 추가하여 확인하고, web.config으로 이동하여 아래와 같이 설정을 수정합니다.


C#의 경우



<system.web>
  …
  <httpRuntime requestValidationType=”SampleRequestValidator” />
  …
</system.web>


VB.NET의 경우



<system.web>
  …
  <httpRuntime requestValidationType=”[프로젝트 이름].SampleRequestValidator” />
  …
</system.web>


VB.NET의 경우 네임스페이스의 경로가 상대성을 가지기 때문에 정확한 것은 개체 탐색기 등을 이용하여 확인해보는 것이 필요합니다. 대개는 위와 같이 기술했을 때 문제가 없습니다.


이제 다시 로그인을 시도하면 아래 그림과 같이 인증이 통과되는 것을 볼 수 있습니다. 



한 가지 더 – 로드 밸런싱에 대응하기


아직 모든 것이 완벽하게 마무리 되지 않았는데, 로드 밸런싱에 대한 부분이 해결되지 않았습니다. 기본적으로 ASP.NET과 마찬가지로 컴퓨터 상태에 의존하여 난수를 생성하는 DPAPI (Data Protection API)를 기반으로 하므로 로드 밸런싱 환경에서는 아래와 같은 유형의 오류 메시지가 나타납니다.


Key not valid for use in specified state


위의 오류를 해결하기 위해서는 DPAPI 기반의 암호화 대신 로드 밸런싱이나 웹 팜에 참여하는 노드들 간의 키를 일치시켜야 합니다. Global.asax 파일이 없을 경우 하나 추가하여 Application_Start 메서드 혹은 이벤트 처리기에 아래의 코드 조각을 추가합니다.


C# 코드


FederatedAuthentication.ServiceConfigurationCreated += OnServiceConfigurationCreated;


VB.NET 코드


AddHandler FederatedAuthentication.ServiceConfigurationCreated, OnServiceConfigurationCreated()


이어서 추가된 이벤트 처리기의 코드 내용을 아래와 같이 프로그래밍합니다.


C# 코드



using System.Collections.Generic;
using Microsoft.IdentityModel.Tokens;
using Microsoft.IdentityModel.Web;
using Microsoft.IdentityModel.Web.Configuration;

    private void OnServiceConfigurationCreated(object sender, ServiceConfigurationCreatedEventArgs e)
    {
       List<CookieTransform> sessionTransforms = new List<CookieTransform>(
           new CookieTransform[] {
               new DeflateCookieTransform(),
               new RsaEncryptionCookieTransform(e.ServiceConfiguration.ServiceCertificate),
               new RsaSignatureCookieTransform(e.ServiceConfiguration.ServiceCertificate) 
           });
       SessionSecurityTokenHandler sessionHandler = new SessionSecurityTokenHandler(
          sessionTransforms.AsReadOnly());
       e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(sessionHandler);
    }


VB.NET 코드



Imports System.Collections.Generic
Imports Microsoft.IdentityModel.Tokens
Imports Microsoft.IdentityModel.Web
Imports Microsoft.IdentityModel.Web.Configuration

    Private Sub OnServiceConfigurationCreated(sender As Object, e As ServiceConfigurationCreatedEventArgs)
        Dim sessionTransforms As New List(Of CookieTransform)(New CookieTransform() { _
            New DeflateCookieTransform(), _
            New RsaEncryptionCookieTransform(e.ServiceConfiguration.ServiceCertificate), _
            New RsaSignatureCookieTransform(e.ServiceConfiguration.ServiceCertificate)
            })
        Dim sessionHandler As New SessionSecurityTokenHandler( _
            sessionTransforms.AsReadOnly)
        e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace( _
            sessionHandler)
    End Sub


마지막으로 Azure Cloud Service나 VM, 혹은 여러분의 웹 팜 환경에서 실행되는 컴퓨터에 동일한 인증서를 사용하도록 배포하면 로드밸런싱 환경에서도 안전하게 ACS 기반 인증을 처리할 수 있게 됩니다.


좀 더 많은 자료들과 글 작성에 도움이 된 자료들