suyeongpark

지성을 추구하는 디자이너/ suyeongpark@abyne.com

C# 6.0 완벽 가이드/ 보안

  • .NET에서 권한(permission)은 운영체제가 강제하는 것과는 독립적인 하나의 보안 계층을 제공한다. .NET Framework에서 권한의 주된 용도는 다음 두 가지 이다.
    • 모래상자 적용
      • 부분적으로 신뢰된 .NET 어셈블리가 수행할 수 있는 연산 종류를 제한한다.
    • 권한 부여(인가)
      • 누가 무엇을 할 수 있는지를 제한한다.
  • .NET의 암, 복호화(cryptography) 기능은 고가 자료의 저장 및 교환, 정보 유출 방지, 메시지 위변조 검출, 패스워드 저장을 위한 단방향 해시 생성, 디지털 서명 생성 등에 쓰인다.

권한

  • .NET Framework는 권한 기능을 모래상자와 권한 부여(authorization; 인가)에 사용한다.
    • .NET Framework에서 하나의 권한은 어떤 코드의 실행을 조건에 따라 금지하는 일종의 관문으로 작용한다.
    • 모래상자 적용에는 코드 접근 권한들이 쓰이고, 권한 부여에는 신원(identity) 권한들과 역할(role) 권한들이 쓰인다.
  • 이들은 모두 비슷한 모형을 따르지만 사용해보면 그 느낌이 상당히 다르다. 부분적인 이유는 관점이 정반대라는 것이다.
    • 일반적으로 코드 접근 보안에서는 독자의 코드가 신뢰받지 않는 쪽, 즉 불신의 대상(untrusted party)이다.
    • 그러나 신원 및 역할 보안에서는 독자의 코드가 다른 어떤 코드를 신뢰하지 않는 쪽, 즉 불신의 주체(unstrustig party)이다.
    • 대부분의 경우 코드 접근 보안은 CLR이나 호스팅 환경(ASP.NET이나 Internet Explorer)이 독자의 코드에 강제하지만, 권한 부여 관련 보안은 독자의 코드가 다른 어떤 단위에 강제한다(독자의 코드에 함부로 접근하지 못하도록)
  • 권한이 제한된 환경에서 실행될 어셈블리를 작성하는 응용 프로그램 개발자라면 누구나 코드 접근 보안(code access security, CAS)을 숙지할 필요가 있다.
    • 예컨대 어떤 구성요소 라이브러리를 작성해서 판매하는 경우, 고객이 독자의 라이브러리를 SQL Server CLR 호스트 같은 모래상자 안의 환경에서 호출할 수도 있음을 간과한다면 좋은 평가를 받기 어려울 것이다.
  • 다른 어셈블리들을 모래상자 안에서 실행하는 호스팅 환경을 직접 만들 때도 CAS를 숙지할 필요가 있다.
    • 예컨대 서드파티 개발자들이 작성한 플러그인 구성요소를 실행할 수 있는 응용 프로그램을 만든다고 하자. 그런 플러그인들을 권한이 제한된 응용 프로그램 도메인에서 실행하면 잘못된 플러그인 때문에 응용 프로그램이 불안정해지거나 보안이 손상될 확률이 줄어든다.
  • 신원/역할 보안은 주로 중간층(middle-tier) 서버나 웹 응용 프로그램 서버를 작성할 떄 쓰인다. 그런 경우 흔히 일단의 역할들을 정해 두고, 서버가 노출하는 메서드마다 그 메서드를 어떤 역할의 구성원들이 호출할 수 있는지 설정한다.

Continue reading

C# 6.0 완벽 가이드/ 동적 프로그래밍

DLR(동적 언어 런타임)

    • C#은 DLR(dynamic language runtime; 동적 언어 런타임)에 의존해서 동적 바인딩(dynamic binding)을 수행한다.
    • 이름이 주는 느낌과는 달리 DLR은 CLR의 동적 버전이 아니다. DLR은 System.Xml.Dll 같은 다른 모든 라이브러리와 마찬가지로 그냥 CLR 위에 놓인 하나의 라이브러리이다. DLR의 주된 역할은 정적 형식 언어와 동적 형식 언어 모두에서 동적 프로그래밍의 통합을 위한 실행시점 서비스들을 제공하는 것이다.
      • DLR 덕분에 C#이나 VB, IronPython, IronRuby 같은 여러 언어는 동적으로 함수를 호출할 때 동일한 규약을 따른다.
      • 결과적으로 이 언어들은 같은 라이브러리를 공유할 수 있으며, 다른 언어로 작성된 코드를 호출할 수 있다.
    • 또한 .NET에서 새로운 동적 언어를 작성하기가 비교적 쉬운 것도 DLR 덕분이다. 동적 언어를 작성할 때 IR 코드를 직접 산출하는 코드를 작성하는 대신, 표현식 트리를 다루는 코드를 작성하면 된다.
    • 더 나아가서 DLR은 모든 소비자가 호출 사이트 캐싱(call-site caching)의 혜택을 받게 한다. 호출 사이트 캐싱은 동적 바인딩 과정에서 잠재적으로 비싼 멤버 환원 결정을 되풀이 하지 않기 위해 DLR이 사용하는 하나의 최적화 기법이다.
  • DLR은 .NET Framework 4.0에서 처음으로 .NET Framework 자체에 포함되었다. 그 전에는 Codeplex에서 따로 내려받아야 하는 라이브러리였다. 지금도 Codeplex 사이트에는 동적 언어 작성자에 유용한 몇 가지 추가 자원이 있다.

Continue reading

C# 6.0 완벽 가이드/ 반영과 메타자료

  • 앞장에서 보았듯이, C# 프로그램 소스 코드를 컴파일하면 어셈블리가 만들어진다. 어셈블리는 컴파일된 코드와 메타자료(metadata) 그리고 기타 자원들로 구성된다. 컴파일된 코드와 메타자료를 실행시점에서 조사하는 것을 가리켜 반영(reflection)이라고 한다.
  • 어셈블리 안에 담긴 컴파일된 코드에는 원 소스 코드의 내용이 거의 다 들어 있다. 지역변수 이름이나 주석, 전처리기 지시문 등의 일부 정보는 컴파일 과정에서 사리지지만 그 나머지의 상당 부분은 반영 기능을 이용해서 접근할 수 있다.
    • 실제로 반영 기능을 이용해서 역컴파일러(decompiler)를 작성하는 것도 가능하다.
  • .NET Framework가 제공하는 그리고 C#을 통해서 노출되는 여러 서비스(동적 바인딩, 직렬화, 자료 바인딩, Remoting 등)는 메타자료가 있어야 작동한다.
    • 독자가 작성하는 프로그램 역시 메타자료를 활용할 수 있으며 심지어는 커스텀 특성을 이용해서 메타자료에 새로운 정보를 추가할 수도 있다.
    • 반영 API는 System.Reflection 이름공간에 들어 있다. System.Reflection.Emit 이름공간에 있는 클래스들을 이용하면 새 메타자료와 실행 가능한 IL(Intermediate Language; 중간 언어) 코드를 동적으로 생성하는 것도 가능하다.
  • 이번 장에서 뭔가를 ‘동적으로’ 수행한다는 것은 형식 안전성이 오직 실행시점에서만 강제되는 어떤 작업을 반영 긴으을 이용해서 수행하는 것을 뜻한다.
    • 구체적인 메커니즘과 기능성은 다르지만 원칙적으로 이는 C#의 dynamic 키워드를 통한 동적 바인딩과 비슷하다.
    • 둘을 비교하자면 동적 바인딩이 반영 기능보다 훨씬 사용하기 쉽다. 그리고 동적 바인딩은 동적 언어 상호운용성을 위해 DLR(Dynamic Language Runtime)을 활용한다.
    • 반영은 사용하기가 비교적 번거롭고 오직 CLR만 고려한다. 그러나 CLR로 할 수 있는 것의 관점에서 본다면 좀 더 유연하다.
    • 예컨대 반영 기능을 이용해서 형식들과 멤버들의 목록을 얻을 수 있고, 형식의 이름을 문자열로 지정해서 그 인스턴스를 생성할 수 있으며, 즉석에서 어셈블리를 구축할 수 있다.

Continue reading

C# 6.0 완벽 가이드/ 어셈블리

  • 어셈블리(Assembly)는 .NET의 기본 배치(deployment) 단위이다. 모든 형식은 어셈블리 안에 담긴다. 하나의 어셈블리는 컴파일된 형식과 해당 IL(Intermediate Language) 코드, 실행시점 자원, 그리고 보조 정보(버전 관리, 보안, 다른 어셈블리 참조 등을 위한)로 구성된다.
    • 어셈블리는 또한 형식 결정과 보안 권한 부여의 경계선을 정의하는 역할도 한다.
  • 보통의 경우 하나의 어셈블리는 하나의 Windows PE(Portable Executable) 파일인데, 응용 프로그램 실행 파일(executable)에 해당하는 어셈블리 파일의 확장자는 .exe이고 재사용 가능한 라이브러리의 확장자는 .dll이다.
    • 단 WinRT 라이브러리는 확장자가 .winmd이다. WinRT 라이브러리 파일은 .dll과 비슷하나, 메타자료만 있고 IL 코드가 없다는 점이 다르다.
  • 이번 장에 등장하는 형식들은 대부분 다음 이름공간들에 정의되어 있다.
    • System.Reflection
    • System.Resources
    • System.Globalization

어셈블리의 구성

  • 어셈블리를 구성하는 요소는 다음 네 가지이다.
    • 어셈블리 매니페스트
      • 어셈블리 매니페스트(Manifest)는 .NET 런타임에 관한 정보를 제공한다. 예컨대 어셈블리의 이름, 버전, 어셈블리가 요청한 권한들, 그리고 어셈블리가 참조하는 다른 어셈블리들의 목록이 어셈블리 매니페스트에 들어 있다.
    • 응용 프로그램 매니페스트
      • 응용 프로그램 매니페스트는 운영체제에 필요한 정보를 제공한다. 예컨대 어셈블리를 배치하는 방법이나 관리자로의 권한 상승이 필요한지의 여부 등이 응용 프로그램 매니페스트에 들어 있다.
    • 컴파일된 형식
      • 어셈블리가 정의하는 형식들을 컴파일해서 나온 IL 코드와 형식들의 메타자료(metadata)
    • 자원
      • 이미지나 현지화용 텍스트 등의 기타 자료
  • 이들 중 필수인 것은 어셈블리 매니페스트 뿐이다. 그러나 WinRT 참조 어셈블리가 아닌 한 어셈블리에는 거의 항상 컴파일된 형식들이 들어 있다.
  • 실행 파일 어셈블리와 라이브러리 어셈블리의 구조는 거의 같다. 주된 차이는 실행 파일 어셈블리에는 진입점(entry point)이 정의되어 있다는 점이다.

Continue reading

모두 거짓말을 한다

각종 사회 현상에 대해 일반적으로 알지 못했던 혹은 잘못 알고 있었던 여러 사안들에 대해 데이터 분석을 이용하여 ‘실제는 이렇다’ 라고 이야기하는 책.

구글 트렌드와 페이스북, PornHub의 같은 빅 데이터를 이용하여 사람들이 흥미로워 할만한 여러 이야기들을 잘 잡아내고 있다. 가볍게 읽어볼만한 내용인 듯.

기존에 측정하지 못했던 데이터 –측정이 어려웠는데 측정이 가능해진 것들 또는 사람들이 솔직하게 대답하지 않은 민감한 이슈들에 대한 데이터들 등– 를 바탕으로 현실에 대한 올바른 이해를 얻는 것은 좋으나, 빅데이터라는 개념이 뜨기 전에도 샘플링을 바탕으로 데이터 분석은 있었고 –책에서는 빅데이터의 장점이 부분별 스케일링이 가능하다는 것으로 이야기 함– , 수 많은 데이터 중에 올바른 데이터를 보는 것이 중요하며, 수치로 드러나는 데이터에만 종속되면 안되는 –세이버메트릭스가 MLB의 주류가 되었지만, 숫자로는 드러나지 않는 정보를 얻기 위해 스카우팅은 여전히 중요하다– 것 또한 책에서 강조되고 있으니, 빅데이터가 모든 것을 해결해 줄 것이라는 맹신은 하지 않는 것이 좋다. –같은 맥락에서 딥러닝 또한 마찬가지.

C# 6.0 완벽 가이드/ 직렬화

직렬화 개념

  • 직렬화(serialization)는 메모리 안의 객체 하나 또는 객체 그래프(서로 참조하는 객체들의 집합)를 저장 또는 전송에 적합한 바이트 스트림 또는 XML 노드들로 평탄화(flattening)하는 연산을 뜻한다.
    • 그 반대는 역직렬화(deserialization), 즉 자료 스트림을 해석해서 메모리 안의 객체 또는 객체 그래프를 재추축하는 연산이다.
  • 직렬화와 역직렬화의 주된 용도는 다음 두 가지이다.
    • 객체를 네트워크나 응용 프로그램 경계 너머로 전송한다.
    • 객체를 파일이나 데이터베이스에 저장한다.
  • 그보다 덜 자주 쓰이는 용도는 객체들을 깊게 복제하는 것이다. 또한 직렬화 및 역직렬화 기능을 제공하는 자료 계약(data contract) 직렬화 엔진과 XML 직렬화 엔진을 XML 파일(구조가 알려진)의 저장과 적재를 위한 범용 도구로 사용할수도 있다.
  • .NET Framework는 직렬화 및 역직렬화를, 객체들의 직렬화/역직렬화를 원하는 클라이언트의 관점에서는 물론 자신의 직렬화 방식을 어느 정도 제어하고자 하는 형식의 관점에서도 지원한다.

직렬화 엔진

  • .NET Framework는 다음과 같은 네 가지 직렬화 메커니즘을 제공한다.
    • 자료 계약 직렬화기
    • 이진 직렬화기(데스크톱 응용 프로그램에서)
    • (특성 기반) XML 직렬화기(XmlSerializer)
    • IXmlSerializable 인터페이스
  • 이 중 처음 셋은 직렬화 작업의 대부분 또는 전부를 실제로 수행하는 직렬화 ‘엔진’이다. 마지막은 XmlReader와 XmlWriter를 이용해서 직렬화를 독자가 직접 구현하는데 필요한 틀을 제공할 뿐이다.
    • IXmlSerializable은 자료 계약 직렬화기(data contract serializer)와 함께 사용할 수도 있고, XmlSerializer와 함께 사용할 수도 있다 (좀 더 복잡한 XML 직렬화 과제를 처리하려는 경우)
  • 아래 표는 네 메커니즘을 비교한 것이다 별표가 많을수록 점수가 높다.
자료 계약 직렬화기 이진 직렬화기 XmlSerializer IXmlSerializable
자동화 수준 *** ***** **** *
형식 결합도 선택 강함 느슨함 느슨함
버전 내구성 ***** *** ***** *****
객체 참조 유지 선택 아니요 선택
비공용 필드 직렬화 가능 아니요
상호운용적 메시지 적합성 ***** ** **** ****
XML 파일 읽기/쓰기의 유연성 ** **** *****
축약된 출력 ** **** ** **
성능 *** **** * ~ *** ***

 

  • IXmlSerializable의 점수들은 독자가 XmlReader와 XmlWriter를 이용해서 코드를 최적으로 작성했다고 가정한 것이다. XML 직렬화 엔진에서 좋은 성능을 내려면 같은 XmlSerializer 객체를 재사용해야 한다.

Continue reading

C# 6.0 완벽 가이드/ 네트워킹

  • .NET Framework System.Net.* 이름공간들에는 HTTP나 TCP/IP, FTP 같은 표준 네트워크 프로토콜을 이용해서 통신을 수행하는데 사용할 수 있는 다양한 클래스가 있다. 핵심 구성요소들을 요약하면 다음과 같다.
    • HTTP나 FTP를 통한 간단한 다운로드/업로드 연산을 위한 퍼사드 클래스 WebClient
    • 클라이언트 쪽 HTTP나 FTP 연산들을 저수준에서 제어할 수 있는 WebRequest 클래스와 WebResponse 클래스
    • HTTP 웹 API와 RESTful 서비스의 소비를 위한 HttpClient 클래스
    • HTTP 서버 작성을 위한 HttpListener 클래스
    • SMTP를 통한 메일 메시지 작성 및 전송을 위한 SmtpClient 클래스
    • 도메인 이름과 주소의 변환을 위한 Dns 클래스
    • 전송 계층과 네트워크 계층에 직접 접근하는데 쓰이는 TcpClient, UdpClient, TcpListener Socket 클래스
  • Windows 스토어 앱은 이 형식 중 일부에만, 구체적으로 말하면 WebRequest와 WebResponse, HttpClient 에만 접근할 수 있다. 그러나 Windows 스토어 앱은 Windows.Networking.Sockets에 있는 TCP 및 UDP 통신용 WinRT 형식들도 사용할 수 있다.

네트워크 구조

  • 아래 그림은 .NET 프레임워크의 네트워킹 형식들을 해당 통신 계층별로 배치한 그림이다. 대부분의 형식은 전송 계층(transport layer)과 응용 계층(application layer)에 있다.
    • 전송 계층은 바이트 송, 수신을 위한 기본 프로토콜들(TCP와 UDP)을 정의한다.
    • 응용 계층은 구체적인 응용을 위한 고수준 프로토콜들을 정의한다. 이를테면 웹 페이지 조회(HTTP), 파일 전송(FTP), 메일 전송(SMTP), 도메인 이름과 IP 주소 사이의 변환(DNS) 등이 이 계층에 속한다.

Continue reading

C# 6.0 완벽 가이드/ 스트림과 입출력

스트림 구조

  • .NET 스트림 구조는 배경 저장소(backing store), 장식자(decorator), 적응자(adapter)라는 세 가지 개념으로 구성된다. 아래 그림에 이들이 나와 있다.

  • 배경 저장소는 입출력 연산이 실제로 효과를 발휘하는 종점(endpoint)이다. 이를테면 파일이나 네트워크 연결이 배경 저장소에 해당한다. 좀 더 정확히 말하면 배경 저장소는 다음 둘 중 하나 또는 둘 다이다.
    • 바이트들을 차례로(순차적) 읽을 수 있는 원본(source)
    • 바이트들을 차례로 기록할 수 있는 대상(destination)
  • 그런데 배경 저장소가 쓸모가 있으려면 프로그래머가 접근할 수 있어야 한다. 그런 용도로 쓰이는 표준 .NET 클래스가 바로 Stream이다.
    • 이 클래스에는 읽기, 쓰기, 위치 지정을 위한 일단의 메서드를 제공한다. 모든 지원 자료가 메모리에 들어 있는 배열과는 달리, 스트림은 자료를 직렬로(serially) 다룬다. 스트림에서는 한 번에 1바이트씩 또는 관리 가능한 크기의 블록 하나씩만 읽거나 쓸 수 있다.
    • 따라서 배경 저장소가 아무리 커도 스트림을 사용하는데는 아주 적은 양의 메모리만 필요하다.
  • 스트림은 크게 두 종류로 나뉜다.
    • 배경 저장소 스트림
      • 배경 저장소의 구체적인 종류에 맞게 특화된 스트림이다. 이를테면 FileStream이나 NetworkStream이 이 종류에 해당한다.
    • 장식자 스트림
      • 장식자 스트림은 다른 스트림의 자료를 적절히 변환하는 기능을 제공한다. 이를테면 DeflateStream나 CryptoStream이 장식자 스트림이다.
  • 장식자 스트림에는 다음과 같은 구조적인 장점들이 있다.
    • 압축이나 암호화 같은 기능을 배경 저장소 스트림마다 따로 구현할 필요가 없다.
    • 스트림의 자료를 변환(‘장식’)하기 위해 스트림의 인터페이스를 변경할 필요가 없다.
    • 장식자를 실행시점에서 스트림에 연결할 수 있다.
    • 여러 장식자를 사슬처럼 이을 수 있다(이를테면 압축한 후 암호화하는 등)
  • 배경 저장소 스트림과 장식자 스트림은 바이트만 다룬다. 이것이 유연하고 효율적인 방식이긴 하지만, 응용 프로그램은 텍스트나 XML 같은 좀 더 높은 수준의 자료를 다루는 경우가 많다. 이런 간극을 메우는 것이 적응자(adapter)이다.
    • 적응자는 특정 서식에 대응되는 형식으로 특화된 메서드들ㅇ르 가진 클래스로 스트림을 감싼다. 예컨대 텍스트 읽기 적응자는 ReadLine이라는 메서드를 제공하고 XML 쓰기 적응자는 WriteAttributes라는 메서드를 제공한다.
  • 장식자처럼 적응자도 스트림을 감싸는 래퍼(wrapper) 클래스이다. 그러나 장식자와는 달리, 적응자 자체는 스트림이 아니다. 일반적으로 적응자는 바이트 지향적 메서드들을 완전히 감춘다.
  • 정리하자면 배경 저장소 스트림은 미가공 자료(raw data)를 제공한다.
    • 장식자 스트림은 암호화 같은 변환을 수행하되, 역시 바이트 수준에서 작동한다.
    • 적응자는 문자열이나 XML 같은 고수준 형식을 다루기 위한 형식있는 메서드들을 제공한다.
    • 이들을 하나의 사슬로 이으려면 그냥 한 객체를 다른 객체의 생성자에 넣으면 된다.

Continue reading

C# 6.0 완벽 가이드/ 동시성과 비동기성

소개

  • 동시성이 필요한 상황은 대부분 다음 네 범주 중 하나에 속한다.
    • 반응성 좋은 UI 작성
    • 다수의 요청을 동시에 처리
    • 병렬 프로그래밍
    • 예측 실행
  • 현재의 컴퓨터 구조에서 프로그램은 다중 스레드 적용(multithreading)이라고 부르는 일반적인 메커니즘을 이용해서 여러 작업을 동시에 실행한다. 이중 스레드 적용은 동시성의 근본 개념 중 하나이며 CLR과 운영체제 모두 다중 스레드 적용을 지원한다. 따라서 동시적인 프로그램을 만들려면 스레드 적용의 기초, 특히 스레드들이 공유 상태에 미치는 영향을 이해하는 것이 꼭 필요하다.

스레드 적용

  • 스레드는 독립적인 실행 흐름 또는 실행 경로이다. 한 스레드의 코드는 다른 모든 스레드와는 독립적으로 진행된다.
  • 각 스레드는 운영체제의 한 프로세스 안에서 실행된다. 프로세스는 프로그램이 실행되는 하나의 격리된 환경을 제공한다.
    • 단일 스레드 프로그램에서는 프로세스의 격리된 환경에서 스레드 하나만 실행되며, 따라서 그 스레드가 그 환경의 모든 것을 독차지한다.
    • 다중 스레드 프로그램에서는 한 프로세스 안에서 여러 스레드가 실행된다. 그 스레드들은 동일한 실행 환경(특히, 동일한 메모리)를 공유한다. 이는 다중 스레드 적용이 유용한 이유 중 하나이다.
    • 예컨대 한 스레드가 배경에서 자료를 만들어서 메모리에 저장하면 다른 한 스레드가 메모리의 자료를 표시할 수 있다. 그러한 자료를 공유되는 상태(shared state) 줄여서 공유 상태라고 부른다.

Continue reading

일상적이지만 절대적인 화학지식 50

제목 그대로 교양 화학 책. 제목이나 표지가 그저 그런 책의 느낌이지만 실제로는 상당히 탄탄한 책. 화학에 대해서는 잘 몰랐는데, 많이 배워서 좋았다.

학교 다닐 때 물리는 별로 안 좋아하는 과목이었는데, 회사 다니면서 우연히 접한 교양 물리 책을 보고 물리학이 이렇게 재미있구나라는 걸 깨달았는데, 이 책도 마찬가지 느낌이었음. 학교에서는 달달 외우기만 해서 별로 재미없던 화학이 이렇게 재미있구나 싶었음. –어쩌면 이래서 내가 학교 공부를 못했나 싶다.