소개
이 슬로그의 목적은 웹 어플리케이션에서 사용되는 용어와 개념들을 알아 보기 위한 것입니다.
설명을 위해, Asp.Net Core 웹어플리케이션 프로젝트를 사용하지만, 프로젝트의 완성이 목적이 아니라, 프로젝트 진행 각 단계 마다 삼천포로 빠져서, 그 단계와 관련된 개념을 설명하는 것이 목적입니다.
선수 지식
- 간혹 있을 수 있는 예제 코드는 C#으로 작성될 것이기에, C#에 대한 이해가 있어야 합니다.
- 대부분 윈도우 환경을 가정합니다.
- 주로 비주얼 스튜디오 2022 버전을 기준으로 설명될 것입니다.
Https 에 대한 구성
닷넷에서 제공하는 웹 어플리케이션을 만들 수 있는 도구는 아래와 같은 것들이 있고, 비주얼 스튜디오에서 개발한다면, 이 중에 하나를 선택하는 것으로부터 개발은 시작됩니다.

이중에 어떤 것을 선택해도, 프로젝트 설정의 마지막 단계는 아래와 같은 [추가 정보] 설정입니다.

빨간 색 박스의 Https 에 대한 구성이 이 글의 주제입니다.
Https 통신
Https 통신은 Http 메시지가 암호화되어 송/수신되는 방식 쯤으로 간단히 정의하겠습니다.
[Https 에 대한 구성] 옵션은 웹어플리케이션이 Https 통신을 할 것인지, 말 것인지를 결정하는 것입니다.
이 옵션이 선택되면 Https 통신을 위한 기반 자원들이 설정되고, 그에 상응하는 뼈대 코드가 프로젝트에 삽입되게 됩니다.
Https 통신을 위한 기반 자원 중에 가장 중요한 것은 "SSL 인증서"입니다. 왜냐하면, Https 통신 과정은 "SSL 인증서"를 교환하는 절차가 포함되어 있기 때문입니다.
그래서, 상용 서비스를 하기 위해서는 반드시 필요한 항목이고, 유료로 구매해야 합니다.
개발용 인증서
SSL 인증서를 개발 시점부터 유료로 구매하여 사용하는 것은 부담이 될 수 있습니다.
대부분은 Https 통신을 시작하기 위한 구색을 갖추기 위해 무료인 인증서를 사용하게 됩니다.
무료인 인증서는 보통 OpenSSL 이라는 도구를 사용하여 생성하는데, 닷넷은 개발용 인증서를 간편하게 제공합니다.
[Https 에 대한 구성] 옵션이 선택되면, 비주얼 스튜디오는 개발 PC에 "개발용 인증서"가 있는 지 검색하고, 없다면 새롭게 생성합니다. 비주얼 스튜디오가 생성한 개발용 인증서는 모든 Asp.Net Core 웹 어플리케이션 프로젝트가 공유하도록 설정되어 있습니다. .
비주얼 스튜디오가 생성한 개발용 인증서의 실물을 확인하는 방법은:
(윈도우 기준)
-
윈도우 검색 창에 "인증서"를 입력하면
검색 결과 최상단에 "사용자 인증서 관리"라는 제어판 항목이 노출됩니다.

-
인증서 관리자를 클릭하면, 아래와 같이 인증서 관리자가 실행됩니다.

위 창의 왼쪽 분면의 최 상단에 있는 “개인용” 폴더를 확장하면, “인증서” 폴더가 나오는데, 이곳이 비주얼 스튜디오가 생성한 개발용 인증서가 저장되는 곳입니다.

위 그림에서, 빨간 색 박스로 표시된 인증서가, 생성된 개발용 인증서 실물입니다.
이 폴더의 인증서들은 대부분 발급자와 발급 대상자가 다르지만, 개발용 인증서는 이들이 모두 “localhost” 로 동일하게 표시되어 있습니다.
이는 자신의 증명서를 자기 도작을 찍어서 발행한 것과 유사합니다. 이렇게 자신을 위해 발급한 인증서를 "자가 서명 인증서(Self-signed Certificate)"이라고 부르는데, 개발용 인증서들이 보편적으로 갖는 특징입니다.
인증서는 Https 통신이 시작되면, 서버에서 브라우저로 전달되고, 브라우저는 이 인증서를 검증합니다.
브라우저가 인증서를 검증하는 일차적인 이유는, 현재 접속 중인 도메인(URL)의 소유자가 제공된 인증서의 "발급 대상자"와 일치하는지 확인하기 위한 것입니다.
즉, 통신 상대방이 진짜 URL 소유자(origin)인지 아닌 지 확인하기 위함입니다.
origin 임이 확인되면, 서버와 브라우저는 향후 주고 받을 메시지를 암호화할 비밀키를 공유합니다.
그 다음부터는, 송신측은 공유된 비밀키로 메시지를 암호화한 후 송신하고, 수신측은 비밀키로 복원해서 메시지를 확인합니다.
이 것이 Https 를 통해 이뤄지는 암호화 통신의 대략입니다.
신뢰할 수 있는 루트 인증기관
인증서 저장 폴더 중에 가장 중요한 곳은 [신뢰할 수 있는 루트 인증기관] 입니다.

이 폴더는 발급 기관 정보를 저장하는 특수 폴더가 아니라, 그냥 똑 같이 인증서들을 저장하는 곳입니다.
그런데, 여기에 있는 인증서들을 자세히 보면, 개발용 인증서와 같이 발급자와 발급 대상자가 모두 동일한, 자가 서명 인증서임을 알 수 있습니다.
보통 인증서는 발급자와 발급 대상자가 다른 게 정상이지만, 발급자를 인증해 줄 상위 발급자가 더 이상 없기 때문에, 스스로에게 인증서를 발급하는 것입니다. 이러한 형식으로 발급된 인증서를 "루트 인증서"라고, 루트 인증서의 발급자를 "루트 발급자(기관)"라고 합니다.
개발용 인증서도 형식적으로는 루트 인증서이고, 개발용 인증서의 발급자인 localhost 도 루트 발급자입니다.
그러나, 개발용 인증서의 발급자 “localhost” 와 이 폴더에 있는 발급자들은 급이 다릅니다.
이들은 보편적으로 많은 운영체제들이 신뢰하는 회사-조직으로, 이들이 발급한 루트 인증서는 운영체제가 설치될 때, 혹은 나중에라도 자유롭게 이 폴더에 모셔집니다. 그래서 폴더 이름도 [신뢰할 수 있는 루트 인증 기관]입니다.
이들이 발급한 인증서는 Https 통신에서 대부분 검증을 통과하게 됩니다. 그래서, 돈을 주고 이들에게 사이트에 대한 인증서를 발급 받아야 하는 것입니다.
그런데, 이 폴더가 듣보잡 발급자인 "localhost"를 "신뢰하는 루트 인증기관"으로 격상시키는 방법에 대한 실마리를 제공합니다.
비주얼 스튜디오가 생성한 개발용 인증서의 사본을 이 폴더에 넣기만 하면, 그 인증서의 발행자인 "localhost"가 신뢰할 수 있는 루트 발급자로 둔갑하게 되는 것이죠.
사실, 이 것이 무료인 개발용 인증서를 사용해도, 아무 문제 없이 https 통신을 할 수 있게 되는 원리입니다.
브라우저는 https 통신을 개시할 때, 서버로부터 받은 인증서의 발급자가 신뢰할 수 있는 지 확인하는데, 확인의 근거는 그 인증서의 발급자가 [신뢰할 수 있는 루트 인증 기관]에 있기만 하면 되는 것입니다.
다만 이러한 효과는 그 PC에만 해당되는 얘기입니다.
만약, 개발용 인증서를 전세계 모든 PC의 [신뢰할 수 있는 루트 인증 기관] 폴더에 설치할 수 있다면, 유료 인증서와 다른 점은 없습니다.
윈도우의 경우, 개발용 인증서를 [신뢰할 수 있는 루트 인증 기관] 폴더로 옮기는 작업은 인증서 관리자의 내보내기, 가져오기 기능을 통해 처리할 수 있습니다
만약, 비주얼 스튜디오에서 프로젝트를 생성하고, 그 프로젝트로 인해 개발용 인증서가 생성되는 경우라면, 이 프로젝트를 최초로 실행할 때, 비주얼 스튜디오는 아래의 질문을 합니다.

“일단 개발용 인증서를 하나 생성하기는 했는데, 브라우저가 이 인증서를 신뢰하게 만들려면 [신뢰할 ..] 폴더에 넣어야 돼. 넣을까?” 라는 의미입니다.
[예]를 선택하면, 비주얼 스튜디오는 개발용 인증서의 사본을 [신뢰할 수 있는 루트 인증기관] 폴더에 저장하려고 합니다.
그런데, 운영체제에 인증서를 설치하는 것은 중요한 보안 행위이므로, 아래와 같은 운영 체제의 보안 경고가 한번 더 뜹니다.

다시 [예]를 선택하면, 개발용 인증서가 [신뢰할 수 있는..] 폴더에 복사됩니다.

실행된 웹앱은 개인용-보증서 폴더에 있는 개발용 인증서를 https 통신 개시 시점에 브라우저에게 보냅니다. 이를 받은 브라우저는
- 인증서의 발급자가 [신뢰할 수 있는…] 폴더에 있는 발급자인지를 확인합니다.
- 확인이 되면, 개발용 인증서를 신뢰하고, 그 인증서의 발급 대상자인 localhost를 origin이라고 판단합니다.
사실 하나의 인증서로 북치고 장구치고 하는 것이죠.
그 결과로 https 통신은 개시되고, 우리의 코드 결과를 화면에 보여주는 것입니다.
유효 기한
개발용 인증서의 만료 날짜를 보시면 유효기간이 1년 짜리입니다.
만약, 이전에 웹 어플리케이션 프로젝트를 생성한 적이 있고, 그 때 발급된 개발용 인증서의 유효기간이 만료되지 않았다면, 개발용 인증서 생성 단계는 생략됩니다.
그리고, 인증서를 신뢰할 것이냐는 질문도 하지 않습니다. 이미, [신뢰할 수 있는…] 폴더에 사본이 들어가 있을 테니까요.
개발용 인증서는 웹 어플리케이션 프로젝트를 처음 생성하거나, 기존에 발급된 인증서의 유효기간이 경과된 경우에만 새로이 생성됩니다.
브라우저가 발급자를 신뢰하지 않는 경우
브라우저가 수신한 인증서의 발급자를 신뢰하지 않는 경우를 살펴보기 위해, [신뢰할 수 있는…] 폴더에서 방금 복사된 인증서를 삭제합니다. 삭제 방법은 인증서 관리자에서, 인증서를 선택하고 delete 키를 누르거나, 우클릭>삭제를 하거나, 관리자 메뉴의 삭제 버튼, 아무거나 다 됩니다.
인증서를 삭제하는 것도 보안 문제라, 삭제 시에도 운영제체는 보안 경고를 보여줍니다.
보안 경고에서, [예]를 선택하면 비로소 삭제됩니다.
인증서의 실제 사용자는 브라우저인데, 브라우저는 실행할 때 신뢰하는 인증서를 캐싱합니다.
따라서, 브라우저 캐싱에서 삭제하지 않으면, 아무런 효과가 없습니다. 브라우저 캐싱에서 삭제하려면, 모든 브라우저를 닫고 재실행하여, 새롭게 캐싱하도록 만들면 됩니다.
이제 앱을 실행해보면, 인증서를 신뢰하겠냐는 질문을 다시 하는데, 이번에는 [아니오]를 선택합니다.

이제 발급자 localhost는 브라우저가 신뢰하지 않는 발급자로 전락했기에, 개발용 인증서를 보낸 서버에 대한 대우가 완전히 달라집니다.

메시지의 내용은 섬뜩하지만, 신뢰할 수 없는 “듣보잡” 발급자 "localhost"가 발행한 인증서를 받았다는 의미에 지나지 않습니다.
이 화면에서 [고급] 버튼을 누르면, 위험을 감수하고 https 통신을 계속 진행할 수 있는 옵션을 선택할 수 있습니다.(생략)
Https 로 구성된 앱이 (개발용)인증서를 찾을 수 없는 경우
이번에는 개인용-인증서 폴더에 저장된 개발용 인증서를 지워 웹앱이 인증서를 못 찾게 해봅니다.

이 상태에서 앱을 다시 실행하면, 아래와 같은 예외가 발생합니다.

사실, 이 예외 메시지가 개발용 인증서에 관한 실질을 잘 보여줍니다.
Https 엔드 포인트를 설정할 수 없음. 그 이유는:
서버 인증서도 찾을 수 없고, 기본적인 개발용 인증서도 찾을 수 없거나 유효기간이 만료됨.
개발용 인증서를 생성하려면, 명령 프롬프트에 ‘dotnet dev-certs https’ 를 실행해라.
(윈도우 맥OS 한정) 생성과 동시에 신뢰하려면, 'dotnet dev-certs https --trust’를 실행해라.
자세한 사항은 Enforce HTTPS in ASP.NET Core | Microsoft Learn 으로 가라
위 링크를 따라가 보면 예외 메시지와 비슷한 내용을 보여 주는 문서가 있습니다.
사실, "Https 에 대한 구성"을 선택하면, 비주얼 스튜디오는 ‘dotnet dev-certs https’ 콘솔 명령을 실행하는 것 뿐입니다. 이때, 아주 잠깐 동안 콘솔창이 열렸다가 순식 간에 사라지는 것을 볼 수도 있습니다.
콘솔창을 열러, 시키는 대로 동일한 명령을 실행하고,

인증서 관리자를 다시 보면, 인증서가 다시 생성되었음을 볼 수 있습니다.

이제 앱을 다시 실행해 보면, 이전과 같은 예외가 발생하지 않고, 개발용 인증서를 신뢰하냐는 질문 단계로 넘어갑니다.
이때, 아무것도 누르지 않고, 앱을 종료한 하고, 모든 브라우저의 창을 닫습니다.
그 다음, 다시 생성된 인증서를 복사해서, [신뢰할 수 있는…] 폴더에 붙여 넣기 합니다.
그 다음, 다시 앱을 실행해 보면, 신뢰할거냐는 질문 단계도 건너 띄고 index 뷰가 정상적으로 표시됩니다.
원격 개발 환경
만약 서버앱이 실행되는 PC와 브라우저가 실행되는 PC 가 다른 경우에는 서버 PC의 개발용 인증서 사본을 브라우저 PC의 [신뢰할 수 있는…] 폴더에 저장하기만 하면 됩니다.
서버 PC가 윈도우인 경우, 인증서 관리자의 내보내기를 선택하면, 아래와 같이 인증서 내보내기 마법사가 실행되고, 아래 그림 대로 순차적으로 따라하면 됩니다.

개인키를 내보내지 않는 선택을 하고,

파일 형식은 X.509 형식으로,

내보낼 폴더를 선택하고, 파일 이름을 선택하면,

아래와 같이 인증서 사본 파일이 복사됩니다.

이 파일을 USB에 저장하든, 메일로 보내든 브라우저 PC에 저장한 후, 인증서 관리자를 통해 [신뢰할 수 있는…] 폴더로 가져오기를 하면 됩니다.
그런데, 원격 환경에서 개발용 인증서를 사용할 때는 몇 가지 보안 문제가 있는데, 이에 관해서는 위에 링크된 문서에서 설명하고 있습니다.








