출처 : http://boost.org/doc/html/boost_tr1/usage.html

boost 1.34 버전 이상 부터 지원

std::tr1 내용 :

Reference Wrappers.
Smart Pointers.
Class template result_of.
Function template mem_fn.
Function Object Binders.
Polymorphic function wrappers.
Type Traits.
Random Number Generators and Distributions.
Tuples.
Tuple Interface to std::pair.
Fixed Size Array.
Hash Function Objects.
Regular Expressions.
Complex Number Algorithm Overloads.
Complex Number Additional Algorithms.




Header Include Style

There are two ways you can include the Boost.TR1 headers, for example if you are interested in shared_ptr then you can either use:

#include <boost/tr1/memory.hpp>

or:

#include <memory>

The first option is the preferred method for other Boost libraries to use. The second option is standard-conforming, but requires that you add boost-install-path/boost/tr1/tr1 to your compiler's include search path. Note that you must not copy the headers in boost/tr1/tr1 into a directory called "include", doing so will cause them to cease working.


Important Note #1


The include path order is very important if you want this library to work correctly. If you get compiler errors then suspect the include paths. The correct order is:

1) boost-root/boost/tr1/tr1
2) boost-root
3) Any other standard library replacements (STLport for example).
4) Your regular standard library.

Important Note #2: Borland C++ Users


Borland's compiler has a particularly broken form of #include, that will actually look for a file named array.h if you #include <array>. In order to make this library work with Borland's compiler you will need to set up the include paths as follows:

1) boost-root/boost/tr1/tr1/bcc32
2) boost-root/boost/tr1/tr1
3) boost-root
4) Any other standard library replacements (STLport for example).
5) Your regular standard library.

Important Note #3: Sun C++ Users

Sun's compiler has a particularly interesting form of #include, that will actually look for a file named array.SUNWCCh if you #include <array>. In order to make this library work with Sun's compiler you will need to set up the include paths as follows:

1) boost-root/boost/tr1/tr1/sun
2) boost-root/boost/tr1/tr1
3) boost-root
4) Any other standard library replacements (STLport for example).
5) Your regular standard library.

'Dev > C++' 카테고리의 다른 글

main function  (0) 2008.05.01
tr1::regex (boost::regex) 샘플코드  (0) 2007.10.21
VC++ 2005 배포  (0) 2007.06.22
Unhandled C++ Exceptions  (0) 2007.06.19
OutputDebugString  (0) 2007.05.23
출처 : http://msdn2.microsoft.com/ko-kr/library/tc0204w0(VS.80).aspx


Interop 응용 프로그램 배포

Interop 응용 프로그램에는 일반적으로 .NET 클라이언트 어셈블리, COM 형식 라이브러리를 나타내는 하나 이상의 interop 어셈블리, 하나 이상의 등록된 COM 구성 요소 등이 포함됩니다. .NET Framework SDK에서는 형식 라이브러리를 interop 어셈블리로 가져오고 변환하는 도구를 제공합니다. interop 어셈블리는 응용 프로그램을 구성하는 다른 어셈블리와 함께 제공되어야 합니다.

어셈블리에는 강력한 이름을 지정할 수 있는데 강력한 이름의 어셈블리에는 고유하게 식별되는 게시자의 공개 키가 포함됩니다. 게시자는 /keyfile 옵션을 사용하여 형식 라이브러리 가져오기(Tlbimp.exe)로 생성된 어셈블리에 서명할 수 있습니다. 서명된 어셈블리는 전역 어셈블리 캐시에 설치될 수 있지만 서명되지 않은 어셈블리는 사용자의 컴퓨터에 전용 어셈블리로 설치되어야 합니다.

전용 어셈블리

전용으로 사용될 어셈블리를 설치하려면 응용 프로그램 EXE 및 가져온 COM 형식이 포함된 interop 어셈블리를 동일한 디렉터리 구조에 설치해야 합니다. 다음 예제에서는 서로 다른 응용 프로그램 디렉터리에 위치하는Client1.exe와 Client2.exe에서 전용으로 사용될 서명되지 않은 interop 어셈블리를 보여 줍니다. 이 예제에서 LOANLib.dll이라는 interop 어셈블리는 두 번 설치됩니다.

전용 배포 시 디렉터리 구조 및 레지스트리 항목


디렉터리 구조 및 Windows 레지스트리

응용 프로그램과 관련된 모든 COM 구성 요소는 Windows 레지스트리에 설치되어야 합니다. 예제의 Client1.exe와 Client2.exe는 서로 다른 컴퓨터에 설치되어 있기 때문에 COM 구성 요소를 두 컴퓨터에 모두 등록해야 합니다.

공유 어셈블리

여러 응용 프로그램에서 공유하는 어셈블리는 전역 어셈블리 캐시라고 하는 중앙 리포지토리에 설치되어야 합니다. 이렇게 하면, .NET 클라이언트에서는 서명되고 전역 어셈블리 캐시에 설치된 interop 어셈블리의 동일한 복사본에 액세스할 수 있습니다.

'Dev > .NET' 카테고리의 다른 글

SerializeToXML - C#  (0) 2009.08.10
C# Web Service -> REST  (0) 2009.08.09
Integrating WCF Services with COM+  (0) 2008.09.03
RCW, CCW  (0) 2007.10.04
&quot;The underlying connection was closed&quot; - WebServices  (0) 2005.10.13

출처 : http://www.microsoft.com/Korea/MSDN/MSDNMAG/ISSUES/2001/Interop/default.aspx


.NET에서 COM 개체 사용

새로눈 .NET 코드는 기존 COM 코드와 상호 운용되어야 하기 때문에 이 경우에 대해 먼저 설명하겠습니다. .NET 클라이언트는 그림?1과 같이 런터임 호출 가능 래퍼(RCW)를 통해 COM 서버에 액세스합니다. RCW는 COM 개체를 래핑하고 이 개체와 .NET 공통 언어 런타임(CLR) 환경을 서로 연결해 주는 역할을 합니다. 이로 인해 .NET 클라이언트 측면에서는 COM 개체를 기본 .NET 개체인 것처럼 인식하며, COM 개체 측면에서는 .NET 클라이언트를 표준 COM 클라이언트인 것처럼 인식합니다.

그림 1 RCW를 통한 클라이언트 액세스

그림 1 RCW를 통한 클라이언트 액세스

.NET 클라이언트 개발자는 두 가지 방법 중 하나를 사용하여 RCW를 만듭니다. Visual Studio .NET을 사용하는 경우에는 프로젝트의 참조 섹션을 마우스 오른쪽 단추로 클릭한 다음 바로 가기 메뉴에서 참조 추가를 선택하면 됩니다. 그러면 시스템에 등록된 모든 COM 형식 라이브러리를 선택할 수 있는 대화 상자가 나타나며, 등록하지 않은 형식 라이브러리를 찾아서 선택할 수도 있습니다(그림?2 참조). 그런 다음 RCW를 만들려는 COM 개체를 선택하면 Visual Studio .NET에서 RCW를 만들어 프로젝트에 추가해 줍니다.


그림 2 RCW 생성

그림 2 RCW 생성

Visual Studio .NET을 사용하지 않는 경우 .NET SDK에는 명령줄 도구(동일한 작업을 수행하는 도구로 TlbImp.exe라고도 함)가 포함됩니다. 형식 라이브러리를 읽고 RCW 코드를 만드는 논리는 System.Runtime.InteropServices.TypeLibConverter라고 불리는 .NET 런타임 클래스 내에 존재합니다. Visual Studio .NET과 TlbImp.exe는 내부적으로 이 클래스를 사용합니다.


그림 3 .COM을 사용하는 NET 클라이언트

그림 3 COM을 사용하는 .NET

그림?3에서는 COM 개체 서버를 사용하는 .NET 클라이언트 프로그램을 예로 보여주고 있습니다. 본 기사 맨 위에 있는 링크를 따라 예제를 다운로드 하십시오. 이 예제에는 COM 서버, COM 클라이언트 및 .NET 클라이언트가 포함되어 있기 때문에 이 두 개를 비교해 볼 수 있습니다. 소스 코드는 그림?4에 표시되어 있습니다.
일단 RCW를 생성한 다음에는 짧은 이름을 사용하여 개체를 참조할 수 있도록 하기 위해, Imports 문을 사용해 RCW의 네임스페이스를 클라이언트 프로그램으로 가져오고 싶어할 것입니다. 이경우 새로운 연산자를 사용하면 RCW 개체를 쉽게 만들 수 있습니다. 일단 RCW 개체가 생성되면 RCW는 기본 COM 함수인 CoCreateInstance를 내부적으로 호출하고, 이 결과 RCW 개체에 의해 래핑되는 COM 개체가 만들어집니다. 그러면 .NET 클라이언트 프로그램은 RCW가 기본 .NET 개체인 것처럼 RCW에서 메서드를 호출하며, RCW는 각 호출을 COM 호출 규칙으로 변환합니다. 예를 들어 .NET 문자열은 COM이 필요로 하는 BSTR 문자열로 변환하여 해당 개체로 보냅니다. RCW는 COM 개체로부터 반환된 결과를 클라이언트로 반환하기 전에 기본 .NET 형식으로 변환합니다.
예제 COM 클라이언트 프로그램을 실행한 다음 단추를 클릭하면 제가 코드에 삽입해 놓은 대화 상자에 개체가 만들어지고 즉시 없어지는 것을 알 수 있을 것입니다. 예제로 제공한? .NET 클라이언트 프로그램을 실행한 다음 Get Time 단추를 클릭하면 개체가 만들어지지만 즉시 없어지지는 않습니다. 래퍼 개체가 시야에서 사라질 때 당연한 것으로 생각할 수 있지만 그렇지 않습니다. 개체 레퍼런스를 'nothing'으로 명시적으로 설정해 놓아도 마찬가지입니다. RCW가 범위를 벗어나서 프로그램에서 더 이상 액세스할 수가 없지만, 나중에 RCW의 가비지가 수집되거나 사라지기 전까지는 RCW가 래핑하는 COM 개체를 실제로 해제하지는 않습니다. 이것은 문제가 될 수 있습니다. 대부분의 COM 개체는 이러한 주기를 고려하지 않고 작성되기 때문에 클라이언트가 종료될 때 바로 해제되어야 하는 값비싼 리소스를 계속 사용하는 경우가 있을 수 있습니다.
이러한 문제는 두 가지 방법 중 하나로 해결할 수 있습니다. 첫 번째 방법은 System.GC.Collect 함수를 통해 고속 가비지 수집을 강제로 수행하는 것입니다. 이 함수를 호출하면 사용하고 있지 않은 모든 시스템 리소스와 범위 내에 존재하지 않는 RCW를 수집하여 다시 사용하게 됩니다. 이 방법의 단점은 전체 가비지 수집의 오버헤드가 높다는 것입니다. 마치 Julia Child가 전체 부엌을 청소하지 않고도 자신이 좋아하는 과도만을 닦아 낼 수 있는 것처럼, 하나의 개체를 버리기 위해 즉시 비용을 들일 필요는 없습니다. 다른 개체에 영향을 주지 않으면서 하나의 특정 COM 개체를 없애려면 System.Runtime.InteropServices.Marshal.ReleaseComObject 함수를 사용할 수 있습니다.
앞 단락에서 설명한 RCW 메커니즘을 위해서는 초기 바운드 개체가 필요합니다. 이것은 개발자가 개발 시점에서 래퍼 클래스를 구성하기 위해 형식 라이브러리가 제공하는 개체에 대해 근본적으로 이해하고 있어야 함을 의미합니다. 하지만 이것이 모든 디자인 시나리오에서 가능한 일은 아닙니다. 예를 들어, 클라이언트가 개체 및 메서드의 ProgID를 읽고 런타임 도중 이를 스크립트 코드로부터 읽는 경우, 스크립트 상황에서는 후기 바인딩이 필요합니다. 대부분의 COM 개체는 특별히 IDispatch 인터페이스를 지원하므로 이러한 형식의 후기 바운드 액세스를 사용할 수 있습니다. 이런 경우에는 RCW를 미리 만들 수 없습니다. 그렇다면 .NET은 이러한 시나리오를 어떻게 처리할 수 있을까요?


Figure 5 Late Binding

그림 5 후기 바인딩

.NET Framework는 대부분의 COM 개체가 지원하는 IDispatch 인터페이스에 대해 후기 바인딩을 지원합니다. 그림?5는 후기 바인딩 프로그램에 대한 예제이며 그림?6은 코드입니다. 정적 메서드인 Type.GetTypeFromProgID를 통해 개체의 ProgID를 기반으로 하는 .NET 시스템 형식을 만드십시오. ProgID 대신 이를 사용할 경우 정적 메서드인 Type.GetTypeFromCLSID(그림?6에는 없음)는 CLSID를 기반으로 하여 같은 역할을 합니다. 그런 다음 Activator.CreateInstance 메서드를 사용하여 COM 개체를 만들고 Type.InvokeMember 함수를 통해 메서드를 호출하여, 메서드의 매개 변수를 배열 형태로 전달합니다. 후기 바인딩의 경우 이 작업은 더 복잡하지만 어렵지 않게 수행할 수 있을 것입니다.


맨 위로


COM에서 .NET 개체 사용

반대로, 이미 COM과 통신하고 있는 클라이언트에서 .NET 개체를 사용하려는 경우를 가정해 봅시다. 이런 경우는 그 반대 상황보다 흔하지 않은 시나리오입니다. 왜냐하면 이 상황에서는 .NET 환경에서의 새로운 COM 개발을 미리 전제로 하기 때문입니다. 하지만 10개의 COM 개체를 사용하는 기존 COM 클라이언트에 .NET 개체로만 존재하는 기능 집합을 추가하려는 경우에 이러한 상황이 발생할 수 있습니다. 그림?7은 COM 호출 가능 래퍼(CCW)를 통해 이러한 상황을 지원하는 .NET Framework를 나타냅니다.
그림 7 COM 호출 가능 래퍼

그림 7 COM 호출 가능 래퍼

CCW는 .NET 개체를 래핑하고 이 개체와 CLR 환경을 연결해 주며 .NET 개체가 기본 .NET 개체인 것처럼 COM 클라이언트에 나타나도록 만듭니다. COM 호출이 가능한 래퍼와 함께 작동하도록 하려면 .NET 구성 요소의 어셈블리에 유효한 이름이 지정되어야 합니다. 그렇지 않으면 CLR 런타임에서는 이름을 명확하게 식별할 수 없게 됩니다. 이 이름은 표준 .NET 구성 요소의 위치 규칙을 따라야 하는데, 이는 이름이 글로벌 어셈블리 캐시(GAC)에 위치해야 하거나 또는 경우에 따라 클라이언트 응용 프로그램의 디렉터리 트리 내에 존재해야 함을 의미합니다. COM에서 만들려는 모든 .NET 클래스는 기본 생성자를 제공해야 하는데, 기본 생성자란 매개 변수가 필요하지 않은 생성자를 말합니다. COM 개체 생성 함수는 함수에서 만들어진 개체한테 매개 변수를 전달하는 방식을 알지 못하므로, 클래스에서 이러한 상황이 필요하지 않도록 만들어야 합니다. COM 클라이언트에 사용할 필요가 없는 생성자를 가지고 있는 한, .NET 클래스에서는 .NET 클라이언트에 사용하기 위해 매개 변수화된 생성자를 제한 없이 사용할 수 있습니다.
COM 클라이언트가 .NET 개체를 찾기 위해서는, 개체를 만들 때 클라이언트가 서버를 찾기 위해 COM에서 필요로 하는 레지스트리 항목을 만들어야 합니다. 이때 .NET SDK에 있는 RegAsm.exe라는 유틸리티 프로그램을 사용하시면 됩니다. 이 프로그램에서는 .NET 클래스에 있는 메타 데이터를 읽은 후 COM 클라이언트를 메타 데이터로 지정하는 레지스트리 항목을 만듭니다. 그림?8은 이 프로그램에서 만들어지는 레지스트리 항목입니다. 여기에 사용하는 COM 서버는 중개 DLL인 Mscoree.dll입니다. InProcServer32 키의 Class 값은 만들고 래핑하려는 .NET 클래스를 이 DLL에게 알려주며, Assembly 항목은 이 클래스를 찾을 .NET 어셈블리를 DLL에게 알려 줍니다.

GAC의 복잡한 디렉터리 구조 때문에 GAC에 있는 .NET 구성 요소를 등록하는 것은 어렵습니다. Explorer에는 사용자 지정 플러그인이 있어 GAC의 복잡성을 단순화할 수 있기 때문에, Explore에서는 복잡해 보이지 않지만 명령줄에서는 손대기 어려울 정도로 디렉터리가 중첩되어 있습니다. .NET 구성 요소를 표준 디렉터리에 같다 좋으면 아주 편리합니다. 여기서 regasm.exe를 실행한 다음 gacutil.exe를 사용하여 구성 요소를 GAC로 이동시킵니다. 등록한 다음 COM 구성 요소를 이동시키면 사용할 수 없게 될 수 있습니다. 그러나 .NET에서는 이런 경우가 없습니다. 사실, DLL Hell은 .NET 아키텍처가 해결하기 위해 특수하게 디자인되었던 문제 중의 하나입니다. 공유된 모든 구성 요소는 유효한 이름을 사용하여 이름이 충돌되지 않도록 지정된 상태에서 GAC에 저장됩니다. .NET 로더는 요청자의 디렉터리 트리에서 요청된 구성 요소를 검사한 다음 원하는 어셈블리를 찾을 수 없는 경우 GAC를 검사합니다.
COM 클라이언트는 .NET 개체가 기본 COM 개체인 것처럼 .NET 개체를 액세스합니다. 클라이언트가 CoCreateInstance를 호출하여 개체를 만들면 레지스트리는 등록된 서버인 Mscoree.dll로 요청을 보냅니다. 이 DLL은 요청된 CLSID를 검사하고 레지스트리를 읽은 다음, 만들려는 .NET 클래스와 해당 클래스가 포함된 어셈블리를 찾으며 해당 .NET 클래스를 기반으로 즉시 CCW을 수행합니다. 모든 DLL COM 서버는 이러한 목적으로 사용할 DllGetClassObject라는 글로벌 함수를 제공합니다. CCW는 기본 COM 형식을 자신의 .NET 형식으로 변환(예: BSTR을 .NET 문자열로 변환)한 다음 .NET 개체로 보냅니다. 또한 .NET의 결과와 오류를 COM으로 변환하기도 합니다. 이 기사에 대한 예제 코드에는 현재 시간을 제공하는 .NET 구성 요소와 현재 시간에 액세스하는 COM 클라이언트가 포함되어 있습니다.

.NET 개발자는 COM 클라이언트 상에서 일부 메서드, 인터페이스 및 클래스는 사용하고 다른 메서드, 인터페이스 및 클래스는 사용하지 않도록 얼마든지 원할 수 있습니다. 따라서 .NET에서는 System.Runtime.InteropServices.ComVisible라는 메타 데이터 속성을 제공합니다. 이 속성은 어셈블리, 클래스, 인터페이스, 개별 메서드 등에 사용될 수 있습니다. CCW는 런타임 도중 이 메타 데이터 특성을 읽은 다음 이 특성이 False로 설정된 요청에 대해 COM으로부터 오는 모든 액세스를 거부할 수 있습니다. 단 하위 계층에서 만들어진 설정은 상위 계층에서는 무시됩니다.

예를 들어, 인터페이스에서 ComVisible을 False로 설정하고 해당 인터페이스의 메서드 중 하나를 True를 설정하면, 클라이언트는 해당 인터페이스에서 해당 메서드를 호출할 수 있지만 다른 메서드에는 액세스할 수 없습니다. 예제 프로그램에서는 다음 코드에 나타난 것처럼 클래스에 대해 이 속성을 True로 설정했습니다. 따라서 COM에서는 이 항목을 볼 수 있습니다.

<System.Runtime.InteropServices.ComVisible(True)>
Public Class Class1
현재 CLR 기본 설정이 True이므로 이 특성이 False로 특별히 설정되어 있지 않으면 이 항목이 COM에 표시됩니다. 그러나, 어셈블리에 대한 Visual Studio .NET의 현재 기본 동작은 프로젝트의 AssemblyInfo.vb 파일에서 이 특성을 False로 설정하게 되어 있습니다. 이것은 사용자가 특별히 표시하도록 지정하지 않는 한 어셈블리 내에서 COM에 아무 것도 표시되지 않는다는 것을 의미합니다.?

개인적으로는 시스템 기본값을 완전히 반대되는 값으로 재정의하는 개발 도구의 관행에 전혀 동의하지는 않습니다. 사용자를 깜짝 놀라게 하는 것은 일반적으로 좋지 않은 것이므로 가능한 한 피해야 할 일입니다. 시스템 설명서를 참조하는 모든 프로그래머는 ComVisible의 기본값이 True임을 알고 있을 것입니다. 그러나 Visual Studio를 사용하여 간단한 구성 요소를 작성할 때 COM은 그 구성 요소를 찾을 수 없으며 프로그래머는 그 이유를 알 수 없을 것입니다. 기본값이 특별히 옳다거나 잘못되었다고 말하는 것은 아닙니다. 각각의 기본값에는 장점과 단점이 있으며 두 기본값이 모두 옳을 수 있다고 생각합니다. 그러나, 운영 체제와 기본적인 개발 환경에서 서로 다른 값을 사용하는 경우 제품이 출시되기 전에 둘 중의 한 기본값을 변경(둘 다 변경하면 결과가 동일)하지 않으면 Microsoft에 수많은 전화 문의가 쇄도할 것입니다.

 

'Dev > .NET' 카테고리의 다른 글

SerializeToXML - C#  (0) 2009.08.10
C# Web Service -> REST  (0) 2009.08.09
Integrating WCF Services with COM+  (0) 2008.09.03
Interop 응용 프로그램 배포  (0) 2007.10.05
&quot;The underlying connection was closed&quot; - WebServices  (0) 2005.10.13

달라진 기능 (IIS 6.0)

IIS 4.0, IIS 5.0, IIS 5.1 및 IIS 6.0의 기본 동작과 설정에는 몇 가지 중요한 차이점이 있습니다.

이 항목에서는 다음 정보를 설명합니다.

핵심 기능 및 서비스

메타베이스 구성

관리

프로그래밍을 이용한 관리

ASP(Active Server Pages)

ASP 정체 감지

보안

성능

IIS 유틸리티 구성 요소

64비트 버전의 Windows Server 2003 제품군에서의 IIS


다음 표에는 IIS 버전 간의 중요한 차이점이 요약되어 있습니다.

 * IIS 4.0 IIS 5.0 IIS 5.1 IIS 6.0

플랫폼

Windows NT 4.0

Windows 2000

Windows XP Professional

Windows Server 2003 제품군

아키텍처

32비트

32비트

32비트 및 64비트

32비트 및 64비트

응용 프로그램 프로세스 모델

TCP/IP 커널

MTX.exe

TCP/IP 커널

DLLhost.exe(중급 또는 고급 응용 프로그램 격리에서의 다양한 DLL 호스트)

TCP/IP 커널

DLLhost.exe(중급 또는 고급 응용 프로그램 격리에서의 다양한 DLL 호스트)

HTTP.sys 커널

IIS 5.0 격리 모드에서 IIS를 실행할 경우: Inetinfo.exe(In-process 응용 프로그램의 경우) 또는 DLLhost.exe(Out-of-process 응용 프로그램의 경우)

Worker Process Isolation Mode에서 IIS를 실행할 경우: W3wp.exe(여러 개의 작업자 프로세스)

메타베이스 구성

이진

이진

이진

XML

보안

Windows 인증

SSL

Windows 인증

SSL

Kerberos

Windows 인증

SSL

Kerberos

보안 마법사

Windows 인증

SSL

Kerberos

보안 마법사

Passport 지원

원격 관리

HTMLA

HTMLA

HTMLA 없음

터미널 서비스

원격 관리 도구(HTML)

터미널 서비스

클러스터 지원

Windows NT 4.0 사용

IIS 클러스터링

Windows 지원

Windows 지원

WWW 서비스

Windows NT 4.0의 IIS

Windows 9x의 개인 웹 관리자

Windows 2000의 IIS

Windows XP Professional의 IIS(선택 사항)

Windows Server 2003 제품군 구성원의 IIS


핵심 기능 및 서비스

IIS 6.0은 기본 Windows 커널인 HTTP.sys를 사용할 수 있도록 재설계되었습니다. 이로 인해 기본 제공된 응답/요청 캐시와 큐를 사용할 수 있으며 응용 프로그램 프로세스 요청을 작업 프로세스들로 직접 전달하여 안정성과 성능을 개선했습니다.

IIS 6.0에는 응용 프로그램 환경 구성을 위한 두 가지 작업 모드인 작업자 프로세스 격리 모드와 IIS 5.0 격리 모드가 도입되었습니다. IIS 6.0을 설치할 때 기본으로 지정되는 격리 모드는 새로 설치할 것인지, 아니면 기존 설치된 것에서 업그레이드할 것인지에 따라 다릅니다.

IIS 6.0을 새로 설치하면 IIS는 작업자 프로세스 격리 모드에서 실행됩니다.

이전 버전의 IIS 6.0에서 업그레이드하면 격리 모드는 이전에 설치한 IIS 6.0의 구성을 그대로 유지합니다.

IIS 5.0 또는 IIS 4.0에서 업그레이드하면 IIS 6.0은 기존 응용 프로그램과의 호환성을 유지하기 위해서 기본적으로 IIS 5.0 격리 모드에서 실행됩니다.

격리 모드 간 전환에 대한 자세한 내용은 격리 모드 구성을 참조하십시오.

IIS 5.0 격리 모드

IIS 5.0 격리 모드에서는 IIS 5.0의 프로세스 관리 방식과 비슷하게 응용 프로그램 프로세스가 관리됩니다. 즉 모든 in-process 응용 프로그램이 Inetinfo.exe에서 실행되고 out-of-process 응용 프로그램은 별도의 DLL 호스트에서 실행됩니다. 기존의 몇몇 응용 프로그램들은 동시에 실행되거나 응용 프로그램과 별도로 세션 상태를 저장하는 것을 고려하지 않고 설계되었을 수 있습니다. 그러므로 IIS 5.0 격리 모드에서의 프로세스 실행은 대부분의 기존 응용 프로그램과의 호환성을 보증할 수 있습니다. 다음 그림은 IIS 5.0 격리 모드에서 응용 프로그램 프로세스가 처리되는 방법을 보여 줍니다.

IIS6 Core arc_ 2c graphic

작업자 프로세스 격리 모드

작업자 프로세스 격리 모드의 경우 모든 응용 프로그램 코드가 격리된 환경에서 실행됩니다. 따라서 기존에 발생하던 병목 현상이 일부 사라졌습니다. 작업자 프로세스 격리 모드를 사용하여 개개의 웹 응용 프로그램의 기능을 독립적인 작업자 프로세스를 사용하는 여러 개의 사이트에 격리할 수 있습니다. 이렇게 하면 한 응용 프로그램이나 사이트로 인해 다른 응용 프로그램이나 사이트가 중지되지 않습니다. 또한 응용 프로그램이나 사이트를 자체 프로세스 공간으로 분리하면 다시 시작(시스템에서 실행되는 다른 모든 사이트나 응용 프로그램과 관계없이), 응용 프로그램에 사용되는 구성 요소 변경, 디버깅, 카운터 모니터링, 리소스 조절 등의 관리 작업이 줄어듭니다. 다음 그림은 IIS 작업자 프로세스 격리 모드로 설정된 IIS가 응용 프로그램을 관리하는 방법을 보여 줍니다.

IIS6 core arc 01c graphic

HTTP 요청은 올바른 응용 프로그램 풀의 큐로 전달되는데, 이는 응용 프로그램 풀 기능을 수행하는 사용자 모드 작업자 프로세스가 커널로부터 요청을 직접 가져오며 out-of-process DLL 호스트로 요청을 보낼 때 발생하는 필요 없는 프로세스 홉을 제거한다는 의미입니다. IIS 6.0에는 더 이상 in-process 응용 프로그램이라는 개념이 사용되지 않습니다. ISAPI 확장 지원과 같은 모든 필수 HTTP 응용 프로그램 런타임 서비스는 모두 응용 프로그램 풀에서 똑같이 사용할 수 있습니다. 이 설계는 컴퓨터의 다른 프로세스에서 처리되는 다른 HTTP 응용 프로그램 또는 다른 웹 사이트의 중단으로 인해 HTTP 응용 프로그램이나 웹 사이트가 중단되는 것을 방지해 줍니다. 격리된 응용 프로그램 프로세스를 사용하면 필요할 경우 다른 콘텐트나 다른 프로세스의 응용 프로그램에 영향을 주지 않고 프로세스를 종료하여 모든 리소스를 언로드할 수 있으므로 구성 요소를 언로드하는 것이 더 쉽습니다. 또한 응용 프로그램 풀마다 프로세스 수준에서 사용할 수 있는 다른 운영 체제 서비스(예: CPU 조절)를 활용할 수 있어 도움이 됩니다.

뿐만 아니라 World Wide Web 게시 서비스(WWW 서비스)의 전체적인 기능을 유지하는 작업자 프로세스 격리 모드의 중요한 부분은 완전히 작업자 프로세스의 외부에서 실행됩니다. Windows에 사용되는 범용 HTTP 프로세서인 IIS 6.0 커널 모드 드라이버 HTTP.sys와 WWW 서비스 관리 및 모니터링 구성 요소는 핵심 웹 서버의 핵심적인 부분을 격리합니다. 두 구성 요소 모두 보호되므로 이들 구성 요소에 타사 코드를 로드할 수 없습니다. 따라서 오류가 있는 HTTP 응용 프로그램이 서버의 WWW 서비스를 방해하지 않습니다.

격리 모드에 대한 자세한 내용은 Application Isolation Modes를 참조하십시오.

메타베이스 구성

IIS 6.0의 메타베이스는 이전 버전의 IIS와 달리 이진 형식이 아니라 XML 파일로 저장됩니다. 위치는 동일하지만 업데이트, 롤백, 복원, 확장 등의 조작 방법은 변경되었습니다. 하나가 아닌 두 개의 MetaBase.xml과 MBSchema.xml이 핵심입니다.

관리

IIS 4.0에서는 응용 프로그램이 인터넷 서비스와 같은 프로세스나 별도의 프로세스에서 실행될 수 있습니다. IIS 5.0과 5.1에서는 성능 및 확장성 향상을 위해 응용 프로그램을 합동 프로세스로 그룹화할 수 있습니다. 자세한 내용은 응용 프로그램 구성를 참조하십시오. IIS 6.0 작업자 프로세스 격리 모드에서는 여러 개의 응용 프로그램 풀로 응용 프로그램을 그룹화할 수 있습니다.

응용 프로그램 매핑 속성 시트에는 특정 파일 형식에 매핑된 응용 프로그램에서 처리하는 HTTP(Hypertext Transport Protocol) verb 목록이 들어 있습니다. 이 verb 목록은 IIS 4.0에서 변경된 것입니다. IIS 4.0의 경우 제외되거나 처리되지 않는 verb가 목록에 포함되어 있습니다. 프로토콜에 새로 추가되는 HTTP verb를 수용하기 위해 이러한 변경이 이루어졌습니다. 응용 프로그램 매핑에 대한 자세한 내용은 IIS 6.0의 응용 프로그램 매핑 설정을 참조하십시오.

클러스터링은 IIS 6.0의 기능이 아닙니다. IISsynche.exe가 지원되지 않습니다. 클러스터링은 Windows Server 2003 제품군 기능입니다. Windows 클러스터링(MSCS)에 대한 자세한 내용은 Windows Server 2003 제품군 도움말을 참조하십시오.

IIS 5.0에서는 IIS 4.0의 사용자 지정 파일 위치가 변경되었습니다.

웹 기반 인터넷 서비스 관리자(HTML)가 원격 관리(HTML) 도구라고 하는 웹 응용 프로그램으로 대체되었습니다. 원격 관리(HTML) 도구를 사용하여 IIS를 원격으로 관리하려면 IIS 6.0에서 원격으로 서버 관리를 참조하십시오.

프로그래밍을 이용한 관리

이전 버전의 IIS에서는 컴파일된 C++ 응용 프로그램에서 ABO(관리 기본 개체)를 사용하거나, C++ 또는 스크립트 파일에서 ADSI(Active Directory 서비스 인터페이스)를 사용하여 IIS를 프로그래밍 방식으로 관리할 수 있었습니다. IIS 6.0에는 관리자가 프로그래밍 방식으로 모든 서비스와 응용 프로그램을 제어할 수 있는 기술인 WMI(Windows Management Instrumentation) 공급자가 포함되어 있습니다. WMI에 대한 자세한 내용은 MSDN에서 IIS SDK(Software Development Kit)의 "IIS Administration Technologies"를 참조하십시오.

Active Server Pages

IIS 6.0에서는 Microsoft ASP(Active Server Pages)와 Microsoft ASP.NET을 함께 사용할 수 있습니다. ASP.NET 응용 프로그램을 실행하기 위한 IIS 구성에 대한 자세한 내용은 ASP.NET 정보를 참조하십시오. IIS 6.0에서 변경된 새로운 ASP 기능은 ASP의 중요 변경 사항을 참조하십시오.

작업자 프로세스(W3wp.exe)가 IIS 6.0 작업자 프로세스 격리 모드에서 네트워크 서비스 계정으로 실행되기 때문에 스크립트 디버거 및 Visual InterDev에 ASP 디버깅을 사용하려면 시작 권한 및 액세스 권한을 구성해야 합니다. 자세한 내용은 ASP 디버깅 사용을 참조하십시오.

ASP 정체 감지

IIS 웹 사이트의 사용량이 많을 경우 순간적으로 허용할 수 있는 최대 ASP 스레드 수에 도달하게 되면 몇몇 ASP 스레드가 정체되어 성능이 저하될 수 있습니다. IIS 6.0에는 ASP ISAPI 확장인 ASP.dll의 특정 인스턴스를 호스트하는 작업자 프로세스를 재생하여 스레드 중단 문제를 해결할 수 있는 기능이 있습니다. IIS 6.0에서 ASP 스레드가 중단되면 ASP.dll이 ISAPI 서버 지원 함수인 HSE_REQ_REPORT_UNHEALTHY를 호출하고 WWW 서비스는 ASP.dll을 호스트하는 작업자 프로세스를 재생하여 이벤트 로그에 항목을 만듭니다.

ISAPI 서버 지원 함수에 대한 자세한 내용은 MSDN® Online의 ISAPI 확장 참조에서 ServerSupportFunction을 참조하십시오.

보안

IIS 6.0의 중요한 변경 사항 중 하나로 웹 서버 보안을 들 수 있습니다. 악의적인 사용자의 침입을 예방하기 위해 Microsoft Windows Server 2003 제품군의 구성원에서는 IIS가 기본적으로 설치되지 않습니다.

  중요:

공격 대상이 될 수 있는 서버의 취약점을 최소화하기 위해 IIS 6.0은 Windows Server 2003에 기본적으로 설치되지 않습니다. IIS 6.0을 처음 설치할 때 이 서비스는 잠겨 있습니다. 즉, 정적 웹 페이지에 대한 요청 처리만 사용 가능하며 World Wide Web 게시 서비스(WWW 서비스)만 설치됩니다. ASP, ASP.NET, CGI 스크립팅, Microsoft의 FrontPage® 2002 Server Extensions 및 WebDAV 게시 등 IIS를 기반으로 하는 기능은 아무것도 설정되지 않습니다. 이러한 기능을 사용하지 않으면 IIS에서 404 오류가 반환됩니다. IIS 관리자에서 웹 서비스 확장 노드를 통해 이러한 기능을 사용하도록 설정할 수 있습니다. 404 오류와 그 밖의 문제를 해결하는 방법에 대한 자세한 내용은 IIS 6.0에서 문제 해결을 참조하십시오.

웹 서버 인증서 마법사와 CTL 마법사를 사용하여 웹 및 NTFS 보안 설정을 동기화하고, 서버 인증서를 받아 설치하며, 인증서 신뢰 목록을 만들고 수정할 수 있습니다. 또한 CSP(암호화 서비스 공급자)를 선택하여 인증서로 데이터를 암호화할 수도 있습니다.

IIS 6.0의 기타 보안 변경 내용은 다음과 같습니다.

업그레이드 시 사용 안 함: 다음 중 하나의 조건이 만족하지 않을 경우 World Wide Web 게시 서비스(WWW 서비스)는 Windows Server 2003 제품군 업그레이드 시에 사용 안 함으로 설정됩니다.

업그레이드를 실행하기 전에 Windows 2000 Server에 IIS 잠금 마법사가 이미 실행된 경우입니다. IIS 잠금 마법사는 불필요한 기능을 사용 중지하여 외부 공격을 줄이고 사이트에서 사용할 기능을 사용자가 결정할 수 있게 합니다. IIS 잠금 마법사는 IIS Lockdown Tool에서 사용할 수 있습니다.

  중요:

WWW 서비스를 사용하는 경우 제품을 Windows Server 2003 제품군으로 업그레이드하기 전에 먼저 Windows 2000 Server에 IIS 잠금 마법사를 실행하는 것이 좋습니다. IIS 잠금 마법사는 Windows 2000 Server를 설치할 때 나타나는 기능 중 필요 없는 기능을 사용 중지하거나 제거하여 컴퓨터 보안 유지를 돕습니다. 이렇게 하지 않으면 이런 기능은 업그레이드 후 시스템에 남아 서버가 공격에 취약해집니다.

그룹 정책을 통해 IIS 사용 안 함: Windows Server 2003 제품군에서는 사용자가 컴퓨터에 IIS를 설치하지 못하도록 도메인 관리자가 제한할 수 있습니다.

액세스 권한 수준이 낮은 계정으로 실행: IIS 작업자 프로세스가 액세스 권한이 적은 사용자 컨텍스트에서 실행되도록 합니다. 그러면 공격 받을 가능성이 대폭 줄어듭니다.

ASP 보안: 기본으로 제공된 모든 ASP 함수가 항상 액세스 권한이 매우 낮은 IUSR_computername 계정으로 실행되도록 합니다.

실행 파일 실행 제한: 일반적으로 시스템 폴더에 있는 cmd.exe와 같은 실행 파일을 실행하려면 Administrators 그룹, LocalSystem, Interactive 또는 Service 계정의 구성원이어야 합니다. 이 제한을 사용하면 Administrators에 대한 원격 액세스가 제한되어 익명 사용자는 실행 파일을 실행할 수 없습니다.

패치 관리: 패치 관리를 사용하면 관리자가 서비스를 중단하지 않고도 최신 보안 패치를 설치할 수 있습니다.

알려진 확장명: IIS에서 알려진 확장명의 파일만 요청을 처리하도록 합니다. 파일 확장명이 알려지지 않은 파일 형식이나 서비스에서 해당 파일 형식을 요청하는 응용 프로그램에 매핑되는 경우 서버가 콘텐트 요청을 거부합니다.

  참고:

확장은 동적 콘텐트를 제공하는 페이지(예: .asp 또는 .aspx)를 사용하는 웹 서비스 확장을 의미하며 확장명은 .exe, .txt, .inc 등과 같은 파일 형식을 나타냅니다.

성능

ASP 페이지에 할당할 메모리 양을 제한하기 위해 AspScriptFileCacheSize 메타베이스 속성 기본값은 250개의 ASP 페이지로 설정되고, AspScriptEngineCacheMax 메타베이스 속성 기본값은 125개의 스크립트 엔진으로 설정되었습니다. 자주 요청되는 ASP 페이지 수가 많은 사이트에서는 ASPScriptFileCacheSize를 더 높게 설정할 수 있습니다. 그러면 캐시에서 페이지를 검색하는 것이 ASP 페이지를 컴파일하는 것보다 훨씬 빠르기 때문에 성능이 향상됩니다. 자주 요청되는 ASP 페이지 수가 적은 사이트의 경우 이 값을 낮게 설정하여 메모리를 절약할 수 있습니다.

IIS 유틸리티 구성 요소

CDONTS: CDONTS(Collaboration Data Objects for Windows NT Server)가 Windows Server 2003 제품군에서 제거되었습니다. 웹 응용 프로그램에서 CDONTS를 사용할 경우 Microsoft CDO(Collaboration Data Objects)로 변환할 수 있습니다. 대부분의 CDONTS 메서드는 CDO의 메서드와 일치하지만 이름이 다를 수 있습니다. PSDK(Platform Software Developer Kit)에 있는 DCO 참고 자료를 보려면 MSDN Online의 Overview of CDO를 참조하십시오.

IIS 유틸리티 구성 요소 설치 안 함: Ad Rotator, Browser Capabilities, Content Linker, Content Rotator, Counters, Logging Utility, My Info, Page Counter, Status 도구는 IIS 6.0과 함께 설치되지 않습니다. 그러나 이전 버전의 IIS에서 웹 서버를 업그레이드할 경우 이들 유틸리티 구성 요소가 제거되지는 않습니다.

64비트 Windows Server 2003 제품군에서의 IIS

64비트 버전 Windows Server 2003 제품군이 설치된 운영 체제에서는 IIS가 64비트 응용 프로그램으로 실행됩니다. 즉 64비트 버전 Windows Server 2003 제품군에서는 32비트 응용 프로그램을 호출할 수 없습니다. 예를 들어 Jet 데이터베이스 엔진이 64비트 응용 프로그램으로 변환되지 않으므로 ADO(ActiveX® Data Objects)를 사용하여 ASP 페이지의 Microsoft Access 데이터베이스를 열 수 없습니다. 그러나 ADO를 사용하여 SQL이나 Exchange 같은 다른 드라이버에 계속 액세스할 수 있습니다.


©2007 Microsoft Corporation. All rights reserved.  사용약관 | 상표 | 개인정보보호 | 법적정보
 Microsoft

'Dev > Windows' 카테고리의 다른 글

ffmpeg  (0) 2008.04.09
벤치마킹  (0) 2007.10.17
SQLOLEDB Provider 의 특이한 동작  (0) 2007.09.20
COM+ Queued Components  (0) 2007.08.09
SWC (Services Without Components)  (0) 2007.08.08
 
SQLOLEDB의 경우 SQLOLEDB의 버그인지는 모르겠지만
Select 의 결과 뿐만 아니라 Print문 혹은 Update나 Delete 에 의한 영향받은 레코드의 개수가
각각 1개의 커서로 인식해 Recordset 이 생성됩니다.
 
 
--************************************
ALTER Procedure Proc_Test
As
 
Print '123'                       -- (1)
Update tbl Set a = 1              -- (2)
Select 'Second' As Result         -- (3)
--************************************
 
위의 프로시저의 경우 MSDASQL Provider로 실행된 결과는 레코드셋이 1개가 생성되고
(3)의 결과만 나타납니다.
 
허나 SQLOLEDB Provider로 실행할 경우 (1), (2)의 결과도 하나의 레코드셋으로 인식을해서
레코드셋이 3개가 생성되고 NextRecordset 메쏘드를 2번더 호출해야 (3)의 결과가 나옵니다.
 
그래서 그 해결 방법이 set nocount on 을 실행하여 (1), (2)의 결과를 없애야 비로서
MSDASQL Provider처럼 동작을 합니다.
 
이 이상한 결과는 버그인지, 의도된 동작인지는 모르겠지만..
(버그라고 추측이..)
 
ADO의 SQLOLEDB Provider에서만 나타나고..
ADO.NET의 System.Data.SqlClient 나 System.Data.OleDb(Provider=SQLOLEDB) 에서는 나타나지 않습니다.
 
 
ps.
이와 비슷한 내용의 KB을 찾아볼려고 검색해 봤는데 아래와 같은 내용이 나왔는데
아래의 링크 내용은 위의 결과와 반대의 결과로 얘기를 하고 있어서..
 
이 미스터리는 계속 이어집니다. 냠..
 

'Dev > Windows' 카테고리의 다른 글

벤치마킹  (0) 2007.10.17
달라진 기능 (IIS 6.0)  (0) 2007.09.28
COM+ Queued Components  (0) 2007.08.09
SWC (Services Without Components)  (0) 2007.08.08
RestartService  (0) 2007.07.19

출처 : http://blog.naver.com/arternis74/150016954638



SSL Protocol


웹을 이용한 전자 상거래, 인터넷 뱅킹 등이 더욱더 증대되면서 이제 인터넷은 정보의 바다가 아니라 하나의 커다란 시장이라 부를 수도 있는 상황이다. 온라인 입금이나 최근에는 소액의 경우 휴대폰 결재를 선택하기도 하지만 뭐니뭐니 해도 국내 인터넷 쇼핑 이용자들이 가장 선호하는 수단은 신용 카드다. 그런데 바로 이점이 보안적인 허점을 가져오는 주 원인이 될 수 있다.


실제로 신용카드로 결제하는 경우 인터넷이라는 공용망을 타고 서버에 전송되는 고객의 신용카드 정보는 신용카드 번호, 유효기간 등을 포함하고 있기 때문에 실제 전자 상거래 시 필요한 대부분의 데이터가 언제 어떻게 도용될지도 모르는 위험에 노출되어 있는 것이다. 그렇다면 개인의 금융정보를 공용망인 인터넷상에서 보호할 것인가?


이 질문에 대한 답으로 현재 가장 많이 사용되는 방법이 SSL(Secure Socket Layer)이다.


1. SSL(Secure Socket Layer) 개념


SSL은 Netsape에서 개발된 프로토콜로서 1995년 히크만(Hickman)에 의해서 개발되었으며 현재 인터넷 사용자들에게 안전한 개인 정보를 교환하기 위한 사실상의 표준 프로토콜로 인정되어 많은 온라인 상거래에 사용되고 있다. SSL은 실제로 다양한 장점을 지닌 암호화 기법들을 사용해 세계 각국에서 사용되는 대부분의 암호화 기법들을 지원할 수 있다.


SSL은 버전 3.0 이후 IETF(Internet Engineering Task Force)에서 표준화되어 TLS(Transport Layer Security)로 명명되었지만 실제 그 내용은 SSL 3.과 TLSv1.0이 같으며 MS Explorer나 Netscape 등 대부분의 브라우저에서 지원하고 있다. SSL 프로토콜에서 사용되어질 수 있는 다양한 애플리케이션 프로토콜이 있지만 주로 사용되는 부분은 WEB(HTTP)이라고 볼 수 있다.


SSL 은 크게 3가지 기능들을 제공함으로 공개되어 있는 인터넷상에서 일어나는 트랜잭션의 기밀성(Privacy)을 보장한다.


○ Site Authentication

User가 선택한 상대편 Web Site를 인증한다는 의미다. 우리가 인터넷 뱅킹이나 인터넷 쇼핑몰을 사용할 때 상대편이 실제 신뢰할 수 있는 은행이나 쇼핑몰의 웹서버 인지를 인증한다는 것으로, 상대 사이트에 대한 신뢰성 있는 인증이 없다면 우리는 불확실한 누군가에게 우리의 금융정보를 넘기는 위험에 처하게 된다.


○ Data Privacy(기밀성)

전달되는 데이터가 도중에 누군가에 의해 판돈되지 않는 다는 것을 보장한다. SSL은 다양한 암호화 알고리즘을 사용하여 인터넷을 통해 전송되는 개인의 사적인 정보를 외부로부터 불법적인 판독을 막는다.


○ Data Integrity(무결성)

사용자의 브라우저로부터 상대방 웹서버까지 전달되는 동안 데이터가 도중에 누군가에 의해 변경되지 않도록 보장한다.


SSL은 위와 같은 요소들을 보장하여 보다 안전한 커뮤니케이션을 할 수 있도록 도와주며 또한 MS 익스플로러나 넷스케이프 등과 같이 널리 보급된 대부분의 웹브라우저와 웹서버들에서 지원된다. 웹브라우저가 SSL 통신을 하는지 여부는 브라우저 오른쪽 하단의 잠금쇠 표시를 가지고 판별할 수 있는데 경우에 따라서는 브라우저 대신에 다른 보안 애플리케이션이 대신하기도 한다.


HTTPS 는 SSL상에서 HTTP 를 구현한 형태로 실제 HTTP 가 기본 포트 80 을 사용하는 대신 HTTPS 는 433 포트를 사용한다.


SSL은 다양한 어플리케이션들을 지원하기 위해 각각의 응용된 어플리케이션 프로토콜을 가지고 있는데, 이는 SSL의 구조를 보면 이해하기 쉽다. SSL은 OSI 7 계층에서 5 계층인 Session Layer에 속하며, 지원 가능한 프로토콜은 어플리케이션 레이어 상에 위한 하부 프로토콜로 한정될 수 밖에 없는데 HTTP, IMAP, FTP, NNTP 등이다.


2. SSL 동작 원리



SSL이 수행되는 단계는 총 3가지로 분류된다.


○ SSL Server Authentication

사용자의 웹브라우저가 상대방의 웹서버를 인증하는 단계이다.

SSL을 지원하는 웹브라우저는 표준 공용키 암호화 기법을 사용하여 서버의 인증서와 공용 ID를 실제로 브라우져가 신뢰하는 인증기관(Trusted CA)으로부터 발급받았는지 여부를 인증하는 기능을 내장하고 있다.


○ SSL Client Authentication

웹서버가 자신에게 요청한 클라이언트를 인증하는 단계이다.

서버 인증 시에 사용했던 동일한 기법으로 인증하는데 서버에 내장된 SSL 지원 소프트웨어나 서버 앞에 배치된 SSL 하드웨어는 클라이언트의 인증서와 공용 ID 를 실제로 서버가 신뢰하는 인증기관(Trusted CA)으로부터 발급 받았는지 여부를 인증하는 기능을 내장하고 있다.


○ Encrypt Connection

서로에 대한 인증단계 이후 정상적으로 종결되면 클라이언트와 서버사이에 교환되는 모든 데이터는 사적인 내용을 보호하기 위한 암호화를 요구받는다. 또한 SSL커넥션을 통해 암호화된 데이터 역시 전송 중 변경을 방지(Message Integrity)하기 위해 Hash 알고리즘이라고 불리는 기술에 의해 보호된다.


위의 3가지 단계를 기반으로 실제로 구현되는 순서는 다음과 같으며, 다음 순서를 진행하기에 앞서 SSL 또한 TCP 프로토콜에 기반을 두고 있으므로 반드시 TCP 3 Handshake는 이루어져 있어만 한다.


A. 클라이언트는 서버에게 Client Hello Message를 전송


일반적으로 브라우저를 통해 서버에게 SSL 연결 요청을 하기 위한 초기 단계이다.


B. 서버는 클라이언트로 Server Hello Message와 서버 인증서를 전송하며, 만약 클라이언트 인증서가 필요한 경우에 인증서 요청도 함께 전송


서버는 클라이언트가 자신이 적합한 서버인지를 인증할 수 있도록 공신력 있는 기관으로부터 발급받은 자신의 공인 인증서를 발송한다. 이때 일반적으로 서버 인증서와 함께 서버의 공용키가 클라이언트측에 전달된다. 만약 클라이언트에 대한 인증을 필요로 하는 트랜잭션이라면 이에 대한 요청도 함께 발송한다.


C. 클라이언트는 암호화에 사용되는 세션 키와 함께 클라이언트에서 지원하는 Cipher Suite를 서버로 전송하며, 서버가 인증서를 요청한 경우에는 클라이언트의 인증서도 함께 전송


서버의 인증서에 대해 클라이언트는 브라우저내에 저장되어 있는 신뢰기관으로부터의 발급여부를 확인하고 암호화에 사용될 Session Key를 생성해 서버 공용키로 Session Key를 암호화 하여 서버에게 전달한다. 또한 암호화된 Session Key와 함께 브라우저가 지원할 수 있는 Chiper Suite, 즉 암호화 기법 리스트와 함께 서버측에서 클라이언트의 인증서를 요청한 경우 스스로의 인증서를 발송한다.


D. 서버는 Chiper Suite를 받아들이고(또는 거부하고) Finished message를 클라이언트로 전송한 후 데이터 전송단계로 이동


서버는 클라이언트로부터 클라이언트 브라우저가 지원하는 암호화 기법 리스트를 받고 클라이언트에게 종결 메시지를 보내고 데이터 전송단계로 돌입한다. 여기까지 정상적으로 완료가 되면 클라이언트가 생성한 Session Key를 클라이언트와 서버가 모두 공유하게 된다.


E. 클라이언트는 최종메시지를 서버로 전송하고 데이터 전송단계로 이동


위 단계까지 정상적으로 완료되면 클라이언트는 종결 메시지를 서버에 보내고 실제 데이터를 전송하기 위한 단계로 돌입한다.


F. 상호 합의한 사이퍼 수트에 의해서 암호화된 메시지를 교환


앞 단계에서 서로 나누어 가진 Session Key로 암호화 된 데이터를 교환하게 된다.


3. SSL 암호화


SSL이 수행되는 단계에 보면 Session Key라는 것이 등장한다. Session Key는 한마디로 클라이언트 측에서 생성하여 서버로 전달된 하나의 키로, 하나의 동일한 키를 클라이언트와 서버가 각각 보관함으로 이후 전달되는 암호화된 데이터를 복호화 할 수 있도록 한다. 이 Session Key의 생성 및 전달 과정에 대한 보다 깊은 이해는 사실상 암호화 기법에 대한 이해를 그 바탕으로 한다.


이번에는 주로 SSL에 대한 개략적인 부분만 다루고 있기 때문에 암호화에 대한 부분은 간단하게만 살펴보도록 하겠다.


SSL 수행단계에서 교환되는 Session Key는 비밀키 암호화(Secret key cryptography). 즉, 대칭적 암호화에서 사용되는 키로서 하나의 키를 양쪽 상대방이 각기 나누어 가짐으로써 하나의 키로 암호화한 데이터를 송신측에서 전송하면 수신측에서 암호화 시 사용한 동일한 키로 복호화하는 단순한 구조를 가진다.


비밀키 암호화 기법은 그 사용이 간단하고 속도가 빠른 반면 크게 두 가지 문제를 가지고 있다.

첫번째는 어떻게 동일한 키를 서버와 클라이언트가 서로 공유하여 가질 것인가이며,

두번째는 서버측에서 볼 때 하나의 클라이언트당 각기 다른 세션키가 필요하기 때문에 어떻게 키를 관리할 것인가다.


위와 같은 문제 때문에 등장한 것이 공개키 암호화 즉 비대칭키 암호화 기법이다. 이 암호화 기법은 비밀키와 공개키라고 불리는 각기 다른 키로 구성된 한 쌍의 키를 클라이언트와 서버가 나누어 가지고 비밀키로 암호화된 데이터는 그와 같은 쌍이 공개키로만 복호화되는 알고리즘을 제공하고 있다.  이 암호화 기법은 비밀키 암호화 시 발생하는 키 교환의 문제를 해결해 주었다. 그러나 각기 나누어 갖은 한 쌍의 키를 가진 상대방에 대한 인증에 대한 문제와 암호화/복호화 과정에 많은 부하가 걸리는 단점을 가지고 있다. 따라서 실제로 SSL 수행의 경우 이 두 가지 암호화 기법과 PKI 기반의 디지털 인증서를 사용한 인증을 혼합하여 사용할 수 있다.


먼저 디지털 인증서(Digital Certificate) 교환을 통해 상대방을 인증, 공개키 암호화의 약점을 줄였으며 서버에서 클라이언트로 전달된 서버의 공개키로 클라이언트에서 생성된 세션키를 암호화하여 서버로 전달하는 공개키 암호화 기법을 사용하여 비밀키 암호화의 키 교환 문제를 없앴고 세션키가 전달된 후 세션키를 통해 실제 데이터를 암호화/복호화함으로 공개키 암호화 시 발생하는 부하로 인한 서비스 지연현상을 방지할 수 있다.


참고로 SSL에서 세션키를 통해 암호화하는 암호화 기법으로는 DES, 3DES, RC2, RC4등이 있고 40비트부터 168비트까지 사용된다. 메시지 무결성(Message Integrity) 보장을 위해 사용되는 Hash 알고리즘으로는 MD5나 SHA1.등이 주로 사용 된다.

'Dev > Network' 카테고리의 다른 글

tcpdump 옵션  (0) 2013.04.08
TCP Connection Establishment Procedure & Connection Termination Procedure  (0) 2012.03.30
network protocol  (0) 2007.07.23
MSMQ를 이용해서 비동기로 컴포넌트를 호출방법

COM+ 컴포넌트
- 해당 컴포넌트는 [out] 파라미터가 없어한다
  [out] 파라미터가 있으면 인터페이스 대기 속성이 disable 되어 있다

- COM+의 패키기의 대기화 속성에 "대기"가 체크되어야한다
  당연히 MSMQ가 설치되어야 한다.

- 수신처리하기 위해서는 "수신처리"를 체크하여 큐에 쌓인 내용을 처리함

- 해당 구성요소의 인터페이스 속성에서 대기화의 "대기"를 체크하여 인터페이스를 대기 시킨다



호출방법
- CoGetObject 함수를 이용해서 Queued Component의 인스턴스를 생성하여 사용한다.
   "queue:/new:QCom.Test"


// C++
IUnknown *pUnknown;
HRESULT hr = CoGetObject(L"queue:/new:QCom.Test", NULL, IID_IUnknown, (void**)&pUnknown);
if (FAILED(hr)) {
    cout << "CoGetObject failed " << endl;
}

// pUnknown 를 해당 인터페이스로 변환하여 사용
// 혹은 직접 인터페이스의 IID_ 및 인터페이스 포인터로 접근하여 사용



http://msdn2.microsoft.com/en-us/library/ms683468.aspx
http://msdn2.microsoft.com/en-us/library/ms686762.aspx

'Dev > Windows' 카테고리의 다른 글

달라진 기능 (IIS 6.0)  (0) 2007.09.28
SQLOLEDB Provider 의 특이한 동작  (0) 2007.09.20
SWC (Services Without Components)  (0) 2007.08.08
RestartService  (0) 2007.07.19
MultiMedia Timer  (0) 2007.05.14

/////////////////////////////////////////////////////////////////////
// C#
using System.EnterpriseServices;

ServiceConfig sc = new ServiceConfig();
sc.TrackingEnabled = true;
sc.Transaction = TransactionOption.Required;
sc.TrackingAppName = "cdecl";
sc.TrackingComponentName = "cdeclcom";

ServiceDomain.Enter(sc);

try {
    Run();
    ContextUtil.SetComplete();
}
catch (Exception ex) {
    ContextUtil.SetAbort();
}

TransactionStatus st = ServiceDomain.Leave();


/////////////////////////////////////////////////////////////////////
// C++ (native)
#include <windows.h>
#include <comsvcs.h>

IUnknown *pUnknown;
HRESULT hr = CoCreateInstance(CLSID_CServiceConfig, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pUnknown);

IServiceInheritanceConfig *pInher;
hr = pUnknown->QueryInterface(IID_IServiceInheritanceConfig, (void**)&pInher);
hr = pInher->ContainingContextTreatment(CSC_Inherit);

IServiceTrackerConfig *pTracker;
hr = pUnknown->QueryInterface(IID_IServiceTrackerConfig, (void**)&pTracker);
hr = pTracker->TrackerConfig(CSC_UseTracker, L"CDECL_APP", L"CDECL_COM");

IServiceTransactionConfig *pTran;
hr = pUnknown->QueryInterface(IID_IServiceTransactionConfig, (void**)&pTran);
hr = pTran->ConfigureTransaction(CSC_NewTransaction);
hr = pTran->IsolationLevel(COMAdminTxIsolationLevelReadUnCommitted);

CoEnterServiceDomain(pUnknown);

IObjectContext *ctx;
hr = GetObjectContext(&ctx);

try {
    Run();
    ctx->SetComplete();
}
catch (...) {
    ctx->SetAbort();
    cout << "Unknown Exception " << endl;
}

ctx->Release();

CoLeaveServiceDomain(pUnknown);

pTran->Release();
pTracker->Release();
pInher->Release();
pUnknown->Release();



'Dev > Windows' 카테고리의 다른 글

SQLOLEDB Provider 의 특이한 동작  (0) 2007.09.20
COM+ Queued Components  (0) 2007.08.09
RestartService  (0) 2007.07.19
MultiMedia Timer  (0) 2007.05.14
.NET Enterprise Services 성능 ( vs COM+)  (0) 2007.05.14

IP Header

Octet Bits Len Name Notes
0 0-3 - Version 4 bits. IP version number. Current version is 4.
0 4-7 - Hdr length 4 bits. Length of IP header in 32 bit words (4 octets). Minimum valid is 5 (20 octets).
1 - 1 ToS 1 octet. Type of Service. Rarely used, often misused or abused.
bit 0-2: Precedence
bit 3: Delay 0 = normal 1 = low
bit 4: Throughtput 0 = normal 1 = high
bit 5: Reliability 0 = normal 1 = high
bit 6-7: Reserved
Precedence
111 Network Control
110 Internetwork Control
101 CRITIC/ECP
100 Flash override
011 Flash
010 Immediate
001 Priority
000 Routine
When used with Explicit Congestion Notification (ECN) (RFC 3168) may take values defined here and here.
2-3 - 2 Total Length 2 Octets. Total length in octets of this packet starting from octet 0 of this header.
4-5 - 2 Identification 2 Octets. Sequence number used when fragmenting IP packets for a given media type.
6 0-3 - Flags 3 bits. Usage
bit 0 - not used = 0
bit 1 (DF) = 1 do not fragment
bit 2 (MF) = 1 more fragments to come
6-7 4-15 - Version 13 bits. Fragment start offset measured in 8 octet (64 bit) units. First fragment is zero.
8 - 1 TTL 1 octet. Time to Live. See notes.
9 - 1 Protocol 1 octet. Protocol. Some common values:
0 (0x00) IPv6 Hop-by-Hop Option
1 (0x01) ICMP protocol
2 (0x02) IGMP protocol
4 (0x04) IP over IP
6 (0x06) TCP protocol
17 (0x11) UDP protocol
41 (0x29) IPv6 protocol
Definitive list is here
10-11 - 1 Checksum 2 octets. See RFCs 1141 & 1624. Covers IP header ONLY.
12-15 - 4 Source 4 octets. Source IP address.
16-19 - 4 Destination 4 octets. Destination IP address.
20+ - ? IP Options Optional. If present must be padded to 32 bit multiples. Definitive list of options is here.
Notes:
  1. Time to Live originally involved a sense of time. It is now used as a simple, but very effective, count to prevent routing errors and loops. Every router that handles the packet decrements the TTL value and if it reaches zero the packet is returned with a ICMP Time Exceeded message. A trace route comand (tracert) is usually a series of ping commands with increasing values of the TTL parameter such that the packet will be returned from each successive router. Called a hop limit in IPv6 to clarify its use.


 

ICMP Header

Internet Control Message Protocol (ICMP) is used to perform many network 'housekeeping' tasks. Each ICMP message has a slightly different format but the first 4 bytes are ALWAYS the same.

Octet Len Name Notes
0 1 ICMP Type ICMP Message Type
0 = echo reply(ping)
3 = destination unreachable
4 = source quench
5 = redirect (route change)
8 = echo request(ping)
11 = time exceeded
12 = Parameter problem
13 = timestamp request
14 = timestamp reply
17 = address mask request
18 = address mask reply
1 1 Code Code values are message specific.
2-3 2 Checksum -

Notes:

  1. Checksum is IP one's complement standard (RFCs 1141 and 1624).

ICMP Echo Request/Response (Ping)

In a ping operation the entire packet is echo'd (or pinged as in ping-pong) back to the sender. A trace route comand (tracert) is usually a series of ping commands with increasing values of the TTL parameter (in IP header) such that it will be returned from each successive router.

Octet Len Name Notes
0 1 ICMP Type Message Type
8 = Echo request
0 = echo reply
1 1 Code Code = 0
2-3 2 Checksum -
4-5 2 Identifier Used by sender to identify operation.
6-7 2 Sequence Used by sender to identify operation.
8+ ? Data Optional Data field.

ICMP Unreachable

The code field specifies the type of error.

Octet Len Name Notes
0 1 ICMP Type Message Type
1 = Host unreachable
1 1 Code 0 = Network unreachable
1 = Host unreachable
2 = Protocol unreachable
3 = Port unreachable
4 = Frag needed but DF set
5 = Source route failed
6 = Destination network unknown
7 = Destination host unknown
8 = Source host isolated
9 = Network access prohibited
10 = Host access prohibited
11 = Network unreachable for ToS
12 = Host unreachable for ToS
2-3 2 Checksum -
4-5 2 Not used Must be zero
6-7 2 Not used Must be zero
8+ ? User Packet IP header plus first 64 bits (8 octets) of failing datagram.

ICMP Source Quench

Great idea but most implementations seem to ignore this polite request to stop sending so much data.

Octet Len Name Notes
0 1 ICMP Type Message Type
4 = Source Quench
1 1 Code Always 0
2-3 2 Checksum -
4-5 2 Not used Must be zero
6-7 2 Not used Must be zero
8+ ? User Packet IP header plus first 64 bits (8 octets) of last datagram.

ICMP Redirect

Indicates the host should use the specified gateway to reach the IP address contained in the returned message.

Octet Len Name Notes
0 1 ICMP Type Message Type
5 = ICMP redirect
1 1 Code May take one of the following values 0 = redirect datagrams for net (obsolete)
1 = redirect datagrams for host
2 = redirect datagrams for ToS and net
3 = redirect datagrams for Tos and host
2-3 2 Checksum -
4-7 4 Gateway IP Specifies that, for the destination host in the returned datagram, this gateway should be used.
8+ ? User Packet IP header plus first 64 bits (8 octets) of failing datagram.

ICMP Time Exceeded

Message returned by the discovering router when the TTL count reaches 0 in the IP header or timeout problem with fragmentation.

Octet Len Name Notes
0 1 ICMP Type Message Type
11 = ICMP Time Exceeded
1 1 Code May take one of the following values 0 = Time to Live count = 0 (exceeded)
1 = fragment reassembly time exceeded
2-3 2 Checksum -
4-7 4 Unused must be zero.
8+ ? User Packet IP header plus first 64 bits (8 octets) of failing datagram.


 

UDP Header

UDP (User Datagram Protocol) is a connectionless protocol and represents a lightweight method of sending and receiving data.

Octet Len Name Notes
0-1 2 Source port -
2-3 2 Destination Port Reserved (well-known) port numbers are here
4-5 2 UDP Length Length of UDP packet starting from Octet 0.
6-7 2 Checksum Optional. 0 = no checksum. The value 0xFFFFFFFF is a computed checksum of 0. See also UDP pseudo header
Notes
  1. UDP Checksum. If a UDP checksum is present (optional for IPv4, mandatory for IPv6) it is assumed to have a 'psuedo header' field of the following format prepended to the data:
    Octet Len Name Notes
    0-3 4 Source Source IP address
    4-7 4 Destination Destination IP address
    8 1 Zero Always zero
    9 1 Protocol Always 17 for UDP
    10-11 2 Length Length of UDP packet (excluding this psuedo header)

    The UDP checksum is computed by including the above 'pseudo header' plus the total UDP packet including the 'real' UDP header.

  2. Checksum is IP one's complement standard (RFCs 1141 and 1624).


 

TCP Header

TCP (Transmission Control Protocol) is a connection-oriented protocol (it has opens and closes and stuff) and provides secure data transfer (the protocol includes ACKs and stuff). You can get the same level of service using UDP but you have to 'hand-carve' the opening, closing and ACK processes. TCP is incredibly efficient and its windowing mechanism especially provides very fast network performance adaptive feedback.

Octet Bits Len Name Notes
0-1 - 2 Source port -
2-3 - 2 Destination Port -
4-7 - 4 Sequence number position of last octet we sent.
8-11 - 4 Acknowledge Number Next octet number we expect from the peer.
12 0-3 - HLEN 4 bits. The number of 32 bit multiples (4 octets) in the TCP header including any 'options' fields.
12 4-7 - Reserved should be zero
13 - 1 Code bits 8 bits (6 used) valid if 1
bit 0 (URG) Urgent
bit 1 (ACK) Acknowledgement
bit 2 (PSH) Requests PUSH
bit 3 (RST) Reset connection
bit 4 (SYN) Sync sequence numbers
bit 5 (FIN) sender finished
14-15 - 2 Window Specifies the amount of data we can accept.
16-17 - 2 Checksum Standard IP checksum. Includes a TCP pseudo header.
18-19 - 2 Urgent pointer Points to end of urgent data.
TCP Options
TCP data
NOTES:
  1. The TCP checksum is assumed to have a 'psuedo header' field of the following format prepended to the data:
    Octet Len Name Notes
    0-3 4 Source Source IP address
    4-7 4 Destination Destination IP address
    8 1 Zero Always zero
    9 1 Protocol Always 6 for TCP
    10-11 2 Length Length of TCP packet (excluding this psuedo header)

    The TCP checksum is computed by including the above pseudo header plus the total TCP packet including the real TCP header.

  2. Checksum is IP one's complement standard (RFCs 1141 and 1624).

TCP Options

TCP allows a number of options sent with the SYN command. Option list MUST be padded with zeros (end of list option) to a multiple of 32 bits. Options may be one byte or multiple bytes (TLD format) in this case octet 2 is always the length value, octet 3+ contains data.

Currently defined options are (exhaustive list is here):

Octet 0 Type Len Data Name
0 One byte 1 - End of option list
1 One byte 1 - Padding (MAY be used to align data)
2 TLD 4 max segment size Segment size option


 

'Dev > Network' 카테고리의 다른 글

tcpdump 옵션  (0) 2013.04.08
TCP Connection Establishment Procedure & Connection Termination Procedure  (0) 2012.03.30
SSL Protocol  (0) 2007.09.08

void RestartService(std::string strServiceName)
{
    SC_HANDLE hSCM = NULL;
    SC_HANDLE hDns = NULL;

    try {
        hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
        if (!hSCM) {
            cout << "OpenSCManager Error" << endl;
            throw -1;
        }

        hDns = OpenService(hSCM, strServiceName.c_str(), SERVICE_ALL_ACCESS);
        if (!hDns) {
            cout << "OpenService Error" << endl;
            throw -1;
        }

        SERVICE_STATUS schStatus = {0, };

        BOOL bStop = ControlService(hDns, SERVICE_CONTROL_STOP, &schStatus);

        if (bStop) {
            cout << strServiceName << " Stop" << endl;
        }

        BOOL bStart = StartService(hDns, 0, NULL);

        if (bStart) {
            cout << strServiceName << " Start" << endl;
        }
    }
    catch (...) {}

    if (hDns) {
        CloseServiceHandle(hDns);
    }
   
    if (hSCM) {
        CloseServiceHandle(hSCM);
    }
}

'Dev > Windows' 카테고리의 다른 글

COM+ Queued Components  (0) 2007.08.09
SWC (Services Without Components)  (0) 2007.08.08
MultiMedia Timer  (0) 2007.05.14
.NET Enterprise Services 성능 ( vs COM+)  (0) 2007.05.14
DLL 파일 찾는 순서  (0) 2007.05.14

'Dev > C++' 카테고리의 다른 글

tr1::regex (boost::regex) 샘플코드  (0) 2007.10.21
boost 를 이용한 TR1 Library 사용하기  (0) 2007.10.10
Unhandled C++ Exceptions  (0) 2007.06.19
OutputDebugString  (0) 2007.05.23
C++0x  (0) 2007.05.16
#include <iostream>
using namespace std;
void term_func()
{ cout << "term_func was called by terminate." << endl; exit( -1 ); }
int main()
{ try { set_terminate( term_func ); throw "Out of memory!"; // No catch handler for this exception } catch( int ) { cout << "Integer exception raised." << endl; }
return 0; }

'Dev > C++' 카테고리의 다른 글

boost 를 이용한 TR1 Library 사용하기  (0) 2007.10.10
VC++ 2005 배포  (0) 2007.06.22
OutputDebugString  (0) 2007.05.23
C++0x  (0) 2007.05.16
GRETA  (0) 2007.05.14

+ Recent posts