6월, 2021의 게시물 표시

[C++] 증감연산자(전위형 후위형)

전위형 연산자는 변수의 값이 사용되기 전에 먼저 1이 증가한 후 사용이 되고 후위형 연산자는 변수의 값이 사용되고 나서 그 다음에 1이 증가한다. 이는, ++x는 x += 1; x; 로 치환되고 (x의 값을 먼저 증가시킨 후 x를 사용함) x++는 x; x += 1; 로 치환된다고 생각하면 보다 쉽게 이해할 수 있다. (x를 먼저 사용하고 그 다음에 x의 값을 증가시킴) 예를 들어 x는 4로 초기화되어 있고 cout << ++x; cout << ++x; 가 있다고 한다면 위에 설명한 방법대로 치환하면 x += 1; cout << x; x += 1; cout << x; 이 되고 4에서 1이 증가한 출력을 하므로 먼저 5가 출력되고 다시 1을 더한 후에 출력 하니 6이 출력되어 결과적으로 5와 6이 출력됨을 알 수 있다. 다음으로 후위연산자를 보면 마찬가지로 x는 4로 초기화되어 있다고 가정하고 cout << x++; cout << x++; 위와 같은 코드가 있다고 한다면 위의 설명대로 치환하면 cout << x; x += 1; cout << x; x += 1; 이 되고, 이를 보면 먼저 4가 출력된 후에 1이 증가하여 5가 되고 다시 이를 출력하고 그 다음에 다시 1을 더 증가시킨다. 그래서 최종적으로는 4와 5가 출력되고 마지막에 x에는 6으로 초기화가 되어 있을 것이라는걸 알 수 있다.

[C++] 함수 오버로딩

출처 - http://cafe.naver.com/cppmaster/2601 작성자 : 강석민(smk6809@yahoo.co.kr) 출처 : cafe.naver.com/cppmaster, cafe.naver.com/ioacademy // 마음 대로 퍼 가셔도 되지만 출처는 반드시 밝혀 주시기 바랍니다. 함수 오버로딩 ( Function Overloading ) C++은 아주 복잡한 언어입니다. C가 가진 대부분의 것을 지원 하려고 했고, 추가로 객체 지향과 Generic 기법을 지원 하므로서 괴물처럼 커져 버린 언어입니다. 때문에 많은 분들이 C++로 입문 할 때 어려움을 겪고 있습니다. 하지만 C++이 어려운 만큼 C++을 어느정도 잘하게 되면 Java, C# 등의 새로운 언어를 아주 쉽게 배울수 있습니다. C++ 문법 속에는 Java, C#의 대부분의 특징이 숨어 있습니다. 기존의 Java, C# 프로그램을 사용하시는 분들도 C++을 통해서 Java 와 C#에 대한 통찰력을 얻을수 있습니다. 하지만 C++을 배우는 많은 분들이 아직은 C++의 깊이를 제대로 이해하지 못하고 있는 것 같습니다. 이번 시리즈를 통해서 C++의 가장 기본 적인 문법부터 체계적으로 정리해 보도록 하겠습니다. 글 중간 중간에 어셈블리 코드를 언급하고 있습니다. C++을 잘하기 위해 굳이 어셈블리언어를 알 필요는 없습니다. 단지 좀 더 명확하게 원리를 설명하기 위해서 사용했습니다. 또한, 이와 같은 어셈블리 코드는 컴파일러마다 다르기 때문에 외우거나 할 필요는 전혀 없습니다. 첫 번째 순서는 함수 오버로딩입니다. 글 순서 1. 기본 개념 2. 함수 오버로딩의 원리 3. 함수 오버로딩과 C/C++의 호환성 문제 4. __cplusplus 5. 함수 찾는 순서 6. 마무리 실습 환경 : VC++2008 또는 VC++ 2008 Express 1. 기본 개념 ...

[C++] namespace

출처 - http://cafe.naver.com/cppmaster/1175 6.1 Namespaces 원리와 역사적 배경 6.1.1 Namespaces 이면에 존재하는 원리 Namespaces는 1995년에 C++ 표준으로 도입되었다. 우선 왜 namespaces가 언어에 추가되었는지를 이해하기 위해서, 여기에 하나의 비유가 있다. 당신의 컴퓨터에 있는 파일시스템이 디렉토리들과 서브디렉토리들을 전혀 가지지 않는다고 상상하자. 모든 파일들은 항상 모든 사용자와 애플리케이션에게 보여지는 단순한 저장소에 저장될 것이다. 결론적으로, 극단적인 어려움들이 발생할 것이다. 파일이름들이 충돌 할 것이고(몇몇 시스템들은 파일 이름을 8개의 문자로 제한하고 + 확장자들을 3개의 문자들로 제한하고서도 이것은 빈번히 발생할 것이다), 파일들의 목록화, 복사 또는 탐색은 훨씬 더 어려워질 것이다. 게다가, 보안 및 권한 제한들은 심각하게 손상될 것이다. C++에서 namespace는 디렉토리들과 동일하다. 그것들은 쉽게 중첩(nest)될 수 있으며, 그들은 당신의 코드를 name conflicts로부터 보호하고, 당신이 선언들을 감출 수 있도록 하며, 어떤 실행시간 또는 메모리 오버헤드를 초래하지 않는다. C++ Standard Library의 구성성분들 대부분은 namespace std하에 그룹화된다. Namespace std는 STL의 오버로드된 연산자들의 정의들을 포함하고 있는 std::rel_ops와 같은 추가적인 namespace들로 분할된다. 6.1.2 간략한 역사적 배경 1990년대 초기에, C++이 범용 프로그래밍 언어로서 대중성을 얻었을 때 많은 벤더들이 다양한 컴포넌트 클래스들의 고유한 구현들을 선적하였다. string 조작들, 수학적 함수들 그리고 데이터 컨테이너들을 위한 클래스 라이브러리들은 MFC, STL, OWL 및 다른 것들과 같이 구조의 통합된 부분들이었다. 재사...

[C++] 컨테이너의 요소를 출력하는 Helper 함수

출처 - http://cafe.naver.com/cppmaster/2218 // cppmaster.h<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><?xml:namespace prefix = o /> // MODULE : CPPMASTER.h // DESCRIPTION : print elements in container // AUTHOR : kang seog min // CONTACT : smk6809 @ yahoo.co.kr // cafe.naver.com/cppmaster // Usage : // int x[10] = { 1,2,3,4,5,6,7,8,9,10}; // vector<int> v(x, x+10); // // show( x ); // array // show( v ); // container // show( x, x+10); // pointer // show( v.begin(), v.end() ); // iterator // // show( x, false ); // no newline  #ifndef CPPMASTER_H #define CPPMASTER_H #if _MSC_VER > 1000 #pragma once #endif #include <iterator> template<int N> struct int2type { enum { value = N }; }; template<typename T> struct is_array { enum { value = false }; }; template<typename T, int N> struct is_array<T[N]> { enum { value = true }; }; template<typename T> struct get...

[C++] 메모리 할당 이야기

출처 - http://cafe.naver.com/cppmaster/2229 C++ 문법중 어려운 것중 하나가 메모리 관련 기법들 입니다. 이번에는 C++의 메모리 할당 관련 내용을 총정리 해 보도록 하겠습니다. 참고 자료는 아래 표와 같습니다. 책 제목 참고 More Effective C++ 항목 8 Effective C++ 항목 16, 49, 50, 51, 52 The C++ Programming Language 19.4 Exceptional C++ 항목 35, 36 Modern C++ Design 4장 C++ 표준 문서 (ISO 14882:2003) 1.7, 3.7.3, 5.3.4, 5.3.5, 12.5, 20.4 되도록 틀린 내용이 없도록 하기 위해서 C++표준 문서(ISO 14882:2003)를 통해서 모든 내용을 검증 하긴 했는데, 그래도 잘못되거나 빠진 부분이 있을수 있으니 잘못을 발견하시면 댓글을 달아 주세요. 1. new, delete 연산자의 기본 동작 C++에서는 동적으로 메모리를 할당하기 위해서는 new 연산자를 사용하고, 할당된 메모리를 해지 하기 위해서는 delete 연산자를 사용합니다. 간단한 예제가 아래에 있습니다. Point* p = new Point; delete p; 이때 new 연산자가 하는 일은 대략 아래와 같습니다.     ( 1 ) C++ 이 전역적으로 제공하는 함수인 operator new() 함수를 사용해서 Point 크기의 메모리를 할당 합니다.     ( 2 ) (1)의 메모리 할당이 성공한 경우 Point 객체의 생성자를 호출합니다. 또한 delete 연산자는     ( 1 ) Point 의 소멸자를 호출합니다. ...

[C++] 함수 객체

출처 - http://cafe.naver.com/cppmaster/2327 (출처의 링크를 클릭하여 원본 글로 가시면 아래 내용이 정리되어 있는 pdf 파일을 다운 받으실 수 있습니다. 아래 내용은 pdf 파일의 내용을 그대로 옮긴 것이며 pdf 파일에는 코드에 색상도 들어가 있기 때문에 pdf 파일로 보시는게 더 좋습니다. 원본 글이나 원본 글의 pdf 파일의 다운 링크가 깨질 경우를 대비해서 텍스트로 정리 해놓았습니다.) function object 1. 기본 개념 C++ 에서는 함수 호출시에 사용하는 ( )도 결국 연산자 이다. 따라서 클래스를 만들 때 ( )연산자를 재정의 하는 것도 가능하다. ( )연산자를 재정의 하면 객체를 마치 함수 처럼 사용할 수 있는데 이를 함수 객체 ( function object, functor ) 라고 부른다. "함수 객체"의 정확한 의미는 ()연산자를 사용해서 함수 처럼 호출가능한 모든 객체들을 이야기 한다. 즉, 함수 포인터, 함수에 대한 참조, 멤버 함수 포인터 등도 함수 객체에 포함된다. 하지만 포스팅에서는 ()연산자를 재정의한 클래스(구조체)로 제한해서 사용하였다. 아래 예제는 임의의 타입에 대해 값 2개를 인자로 받아서 합을 구하는 함수 객체 이다. #include <iostream> using namespace std; template<typename T> struct plus { T operator()( const T& lhs, const T& rhs ) const { return lhs + rhs; } }; int main() { plus<int> p; // p는 객체지만 함수처럼 사용한다. // p.operator()(1,2) 처럼 해석 된다. int n1 = p(1,2); int n2 = p.operator ()(1,2); // 이렇게 사용 해도 된다. ...

[C++] 헤더 파일(.h)과 정의 파일(.cpp)을 분할하는 기준

헤더 파일 클래스와 관련된 문장의 오류(구문 오류)를 잡아내는 필요한 최.소.한 의 정보. 클래스를 구현하는데 필요한 다른 헤더 파일이나 정의(#define)라도 헤더 파일에서는 사용되지 않고 .cpp 파일에서만 사용 된다면 이는 헤더 파일에 포함시키지 않고 .cpp 파일에 작성한다. 정의 파일 클래스의 정의에 해당하는 파일.

닷넷(.Net Framework) 완전 삭제 프로그램

https://blogs.msdn.microsoft.com/astebner/2008/08/28/net-framework-cleanup-tool-users-guide/

디지털 서명(코드 사인) 제거 프로그램

명령 프롬프트 창에서 첨부되어 있는 프로그램 뒤에 인자 값으로 서명을 제거할 파일 명을 넘겨주면 된다. deleteCertificate.exe 다운로드 ex) "deleteCertificate.exe testFile.exe"

[C] system32 경로 syswow64로 리다이렉트 되지 않도록 하는 예제 코드

출처 - http://www.codeproject.com/tips/55290/Disabling-Windows-file-system-redirection-on-a-CFi.aspx https://github.com/MoongStory/WindowsController int _tmain() { FILE *fp = NULL; BOOL bOpenFile = TRUE; PVOID oldValue; Wow64DisableWow64FsRedirection(&oldValue); fp = _tfopen(SYSTEM32_FILE_PATH, _T("r") ); Wow64RevertWow64FsRedirection(&oldValue); if(fp == NULL){ _tprintf(_T("fp is null.\n")); } else{ _tprintf(_T("fp is not null.\n")); fclose(fp); } return EXIT_SUCCESS; } typedef BOOL (WINAPI *FWOW64DISABLEWOW64FSREDIRECTION)(PVOID *); typedef BOOL (WINAPI *FWOW64REVERTWOW64FSREDIRECTION)(PVOID); FWOW64DISABLEWOW64FSREDIRECTION fWow64DisableWow64FsRedirection = NULL; FWOW64REVERTWOW64FSREDIRECTION fWow64RevertWow64FsRedirection = NULL; HMODULE hMod = NULL; PVOID pOldValue = NULL; hMod = GetModuleHandle("Kernel32.dll"); if( !hMod ) { printf("GetModuleHandle : %d\n", GetLastError()); return 0;...

메인보드 제조사 별 스카이레이크 윈도우7 부팅 USB 제작 툴

스카이레이크에서는 EHCI(Enhanced Host Controller Interface, USB 2.0)대신 xHCI(Extensible Host Controller Interface, USB 3.x)를 지원하기 때문에, xHCI를 네이티브 지원하지 않는 윈도우 7은 USB 드라이브를 통한 설치에 문제가 발생한다. USB 3.x의 xHCI는 USB 2.0의 EHCI와 호환이 가능하기에 윈도우 7이 설치된 상황이라면 장비나 포트의 USB 버전에 상관없이 쓸 수 있지만, (난 윈도우7 설치되어 있어도 먹통이던데? 내가 사용하는 AsRock B150M PRO4 메인보드 경우엔 USB 드라이버를 설치하기 전까지 USB 2.0도 인식이 안되는 거지같은 상황이... 원래 쓰던 컴퓨터 드라이버가 설치되어 있어서 그런가해서 재설치 하려고 했더니 UEFI 에서는 인식이 되는데 윈도우 설치 화면으로 들어가면 다 먹통. PS2 키보드만 입식이 되길래 하드 떼서 다른 컴퓨터에 연결해서 Intel USB 3.0 driver 파일 받아서 하드 다시 내 컴퓨터로 연결해서 PS2 키보드로 드라이버 파일 실행해서 설치, 이후로 USB 마우스, 키보드 인식 됨.) (아, 물론 이 문제 해결한 이후로는 아무 문제없이 메인보드는 잘 사용하고 있음.) 역시 문제는 스카이레이크 구매후 산뜻한 마음으로 윈도우 7을 다시 설치하고자 할 때 xHCI를 기본 인식하지 못하니 USB 포트를 통한 설치가 어렵다. (물론, USB가 아닌 메인보드 SATA 포트에 연결된 ODD(내장형 ODD)를 이용해 광미디어로 윈도우 7을 설치하는 경우는 문제가 없다.) 따라서, USB를 사용하여 윈도우7을 설치하기 위해서는 메인보드 제조사에서 제공하는 툴을 사용하여 부팅 USB를 만들어야 한다. 각, 메인보드 제조사 별 USB 툴과 다운로드 경로는 아래와 같다. (자신의 메인보드와 상관없이 아무 메인보드 제조사 USB툴로 부팅 USB를 만들어도 상관 없다.) (상관이 있는 것 같으니 가...

커널 드라이버 전자 서명 (디지털 서명, 코드 사인)

이미지
드라이버 포함 dll 같은 파일들을 서명하기 위한 방법임. 웹에서 사용되는 SSL 서명과는 다른 것이니 참고 바람. 일단 결론부터 말하자면 서명에 필요한 것은 3가지임. 1. 인증서 (구매 필요.) 2. Root CA 인증서 (구매처에서 제공함. 구매하지 않아도 다운로드 가능.) 3. Microsoft 교차 인증서. 일단 인증서는 SHA1 방식과 SHA2(SHA256) 방식이 있는데 SHA2 방식은 EV(Extended Validation) 인증서라고도 함. Windows 10의 경우, Windows 10이 처음 발표된 2015년 7월 29일로부터 90일이 경과한 후부터는 기존에 발급받은 SHA1 인증서와 EV 인증서로 서명된 파일들만 인정해 준다고 함. 2016년 이후로는 SHA1 인증서로 서명한 파일은 아예 인식이 안될거라고 들었는데 이미 발급 받아놓은 SHA1 인증서로 서명해도 잘 됨. 그리고 인증서 발급 기관에서 더 이상 SHA1 인증서를 발급하지 않는 것으로 알고 있음. (맞나? 정확하지 않음.) 따라서 설명은 SHA2 기반으로 함. 그리고 내가 사용중인 인증서가 Symantec에서 구입한 인증서 이므로 Symantec이 기준임. (다른 인증 기관은 설명해주고 싶어도 제가 몰라서... 아마 대동소이하지 않을까 생각됨.) 1. 인증서 (구매 필요) 일단 인증서를 구매해야 함. 어떻게 꼼수로 할 수 있는 방법이 내가 알기로는 전혀 없음. 테스트 서명을 해서 하는 방법이 있긴 하나 PC를 테스트 서명한 파일을 사용할 수 있도록 설정을 해줘야 함. 인증서 가격은 Symantec 기준으로 1년 $499, 2년 $873, 3년 $1248임. (1년 기준으로 2년짜리를 사면 $100, 3년짜리는 $200 달러를 절약할 수 있음) 돈도 돈이거니와(어차피 회사 돈이니...) 어차피 인증서 만료기간이 지나면 또 구매해야 하므로, 처음부터 3년짜리를 사는게 정신건강에 좋음. EV 인증서(SHA2)는 토...

inf 파일 양식

;------------------------------------------------------------------------- ; Null Driver x86 and x64 package ; Copyright (c) Microsoft Corporation. All rights reserved. ;------------------------------------------------------------------------- [Version] Signature="$Windows NT$" Class=SomeDeviceClass ClassGuid={ClassGuid} Provider=%ProviderName% CatalogFile=Driver.cat DriverVer=05/14/2015,1.0.0.0 [Manufacturer] %ProviderName%=ProviderName,NTX86,NTamd64 [ProviderName.NTx86] %CardDeviceName%=NODRV,myfakeID [ProviderName.NTamd64] %CardDeviceName%=NODRV,myfakeID [NODRV] [NODRV.NT.Services] AddService = ,2 [NODRV.NTx86.Services] AddService = ,2 [NODRV.NTAMD64.Services] AddService = ,2 ; =================== Generic ================================== [Strings] ProviderName ="Microsoft" CardDeviceName="Some Device" NULL.DeviceDesc = "Null Device"

[HTML] 특수 기호 사용하기

화면에 표시되는 모습 특수 기호 & &amp; (공백 한 칸) &nbsp; &lt; > &gt; " &quot; | &#124; ( &#40; ) &#41; , &#44; - &#45; ' &acute; 그 외 모든 특수 기호 엔티티 테이블 (Entitiy Table) https://dev.w3.org/html5/html-author/charref

[JS] 웹 브라우저가 자바 스크립트의 선언적 함수와 익명 함수 읽는 순서

출처 - 모던 웹을 위한 JavaScript + jQuery 입문 (저자 - 윤인성) 함수(); var 함수 = function () { alert("함수 A"); }; var 함수 = function () { alert("함수 B"); }; 위와 같은 코드는 변수를 선언하기 이전에 변수를 사용했기 때문에 오류가 발생해 실행되지 않습니다. 하지만, 함수(); function 함수() { alert("함수 A"); }; function 함수() { alert("함수 B"); }; 위와 같은 코드는 웹 브라우저가 script 태그 내부의 내용을 읽기 전에 선언적 함수부터 읽기 때문에 정상적으로 코드가 실행됩니다. 따라서, var 함수 = function () { alert("함수 A"); }; function 함수() { alert("함수 B"); }; 함수(); 위와 같은 코드가 있으면 선언적 함수가 먼저 분석되기 때문에 상대적으로 더 나중에 분석되는 익명 함수가 호출 됩니다.

[JS] 브라우저가 지원하는 기능 체크 & 하드웨어 정보

브라우저가 지원하는 기능 체크 modernizr https://modernizr.com/ 하드웨어 정보 detectizr https://github.com/barisaydinoglu/Detectizr 공식 홈페이지는 없는 듯 Github를 통해 라이브러리 파일(.js)을 제공하고 있음.

[Visual Studio] TFS 체크아웃 항목 강제 해제

아래 링크에 추가적인 내용과 설명히 자세히 나와있으니 참고. 참고 - https://www.visualstudio.com/ko-kr/docs/tfvc/undo-command 명령 프롬프트에 입력하면 되는데 환경 변수에 tf 경로가 설정되어 있으면 아무데서나 입력해도 되지만 그렇지 않다면 tf.exe 파일이 있는 경로로 이동하여 입력해야 한다. 참고로 Visual Studio 2017 Community의 tf.exe 경로는 아래와 같다. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\tf.exe 아래 ex를 명령 프롬프트 창에 입력. ex) C:\Users\TestPC>tf undo /collection:" tfs서버주소 " /workspace:" 작업영역 ";" 사용자 " " 소스파일경로 " 위 빨간 글씨로 표시된 부분에 알맞게 채워넣으면 된다. 아래는 그 예제 ex) C:\Users\TestPC>tf undo /collection:http://tfs.moong.co.kr:8080/tfs/tfs2017 /workspace:MOONG-PC;"홍 길동" $/TestProject/Common/Debug/Debug.cpp 서버 주소는 TFS 연결할 때 입력하는 서버 주소이고, 작업 영역과 사용자는 소스 제어 탐색기에 체크아웃한 항목의 사용자 탭에 나와있으니 보고 입력하면 된다. (작업 영역은 사용자 이름 오른편에 ()안에 있음.) 마지막은 TFS에서의 파일 경로를 입력해주면 된다.

[NSIS] 재배포 패키지 설치 여부 체크 후 설치하는 방법

아래 NSIS 스크립트? 에서 "Function InstallVCRedist_x86" 함수와 "Function CheckVCRedist_x86" 함수 그리고 "Function InstallVCRedist_x64", "Function CheckVCRedist_x64" 함수를 그대로 복사하여 사용하면 된다. (재배포 패키지 Product Code는 수정하여 사용.) ; Script generated by the HM NIS Edit Script Wizard. ; HM NIS Edit Wizard helper defines !define PRODUCT_NAME "제품 이름" !define PRODUCT_VERSION "1.0.0.1" !define PRODUCT_PUBLISHER "회사이름 Co., LTD." !define PRODUCT_WEB_SITE "http://www.회사사이트.co.kr" ; "Software\Microsoft\Windows\CurrentVersion\App Paths" 경로의 레지스트리에 키 값을 추가하면 ; "실행" 창에서 입력하여 바로 실행이 가능하다. ; 아래 처럼 추가가 된다면 "실행" 창에 "프로그램명.exe"를 입력하면 프로그램이 실행된다. !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\프로그램명.exe" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_ROOT_KEY "HKLM" ;...

[NSIS] 32비트와 64비트 모듈 등록하는 법. (regsvr32)

- 등록 x86 환경에선 RegDLL "$SYSDIR\Test.ocx" 처럼 RegDLL 뒤에 등록할 파일의 풀 경로를 입력해 주면 되고 x64 환경에선 ExecWait '"$SYSDIR\regsvr32.exe" /s "$SYSDIR\Text_x64.ocx"' 처럼 regsvr32.exe 프로그램을 통해 등록한다. - 해제 x86 환경에서 UnRegDLL "$SYSDIR\Test.ocx" x64 환경에선 ExecWait '"$SYSDIR\regsvr32.exe" /u /s "$SYSDIR\Test_x64.ocx"' ; Script generated by the HM NIS Edit Script Wizard. ; HM NIS Edit Wizard helper defines !define PRODUCT_NAME "제품 이름" !define PRODUCT_VERSION "1.0.0.1" !define PRODUCT_PUBLISHER "회사이름 Co., LTD." !define PRODUCT_WEB_SITE "http://www.회사사이트.co.kr" ; "Software\Microsoft\Windows\CurrentVersion\App Paths" 경로의 레지스트리에 키 값을 추가하면 ; "실행" 창에서 입력하여 바로 실행이 가능하다. ; 아래 처럼 추가가 된다면 "실행" 창에 "프로그램명.exe"를 입력하면 프로그램이 실행된다. !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\프로그램명.exe" !define PRODUCT_UNINST_...

HTTPS 통신에 필요한 Root 인증서와 Server 인증서 만들기

SAN 인증서에 대한 내용은 아래 링크 참고. 참고 - http://www.solanara.net/solanara/openssl#head_openssl_certs_san 인증서에 추가적인 subject 를 넣고 싶을때 SAN 필드를 사용한다. 웹 서버용 인증서에서 SAN을 사용하는 경우는 보통 DNS 이름을 여러개 주기 위함이다. CN에는 2개 이상의 DNS 이름을 넣을 수 없기 때문이다. CN 필드만 검사하는 구형 브라우저에서는 사용할 수 없는 기능이지만, 2016년 현재 출시 된 모든 상용 브라우저에서 사용 가능하다. 또한 Chrome 58 부터 https 인증서에 SAN 항목이 없으면, (net::ERR_CERT_COMMON_NAME_INVALID)오류가 발생하면서 접속되지 않는다. (Deprecations and Removals in Chrome 58) Firefox 48 부터도 신형 인증서에 한해 SAN 항목이 필수이다. (don't fall back to subject common name for name information for new certificates) ※ 먼저 작업을 위해서는 openssl.exe이 필요하다. 1. cnf 파일 생성 아래 빨간색 글씨로 적어놓은 부분을 그대로 복사하여 cnf 파일을 생성하면 된다. 파일명은 마음대로 하면 되고 확장자만 cnf로 하면 됨. ex) cert.cnf (아래 예제에서 cert.cnf로 사용) (초록 글씨로 표시 된 부분은 맞춰서 수정 필요.) [req] distinguished_name = req_distinguished_name req_extensions = v3_req [req_distinguished_name] countryName = Country Name (2 letter code) countryName_default = KR countryName_min     = 2 countryName_m...