옵서버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다. 발행/구독 모델로 알려져 있기도 하다. -위키피디아

역시 개요만 봐선 뭔소린지 못알아듣겠다. 위키백과를 잘 보면 다이어그램과 구현 예시가 나와있긴 한데, 알고 보면 정말 설명을 잘 해놓았지만 모르고 보면 이게 뭐지 싶다. 대부분의 블로그들 강좌를 보면 위키백과 내용과 크게 다르지가 않다. 그래서 역시 이게 뭐지 싶다. (그나마 어떤 분은 팬과 아이돌의 관계로 설명을 해주셨다)

Add인지 구독인지 뭔지를 하고..발행을 하고..관찰자를 객체에 붙여...상태 변화...끝나면 언레지스터...콜백....이것이 바로 감시자 패턴입니다!!

Observer패턴에 대해 처음 알아봤을 때 위와 같은 내용을 읽었고 도데체 이게 뭐하는거지라는 생각밖에 안들었다. 발행/구독은 또 뭐고 옵저버를 등록한다는데 그럼 옵저버는 뭐고 객체의 상태 변화는 또 뭐하는거지.

옵서버 패턴 할 때 Observer는 여러분이 알고있는 스타의 그 옵저버가 맞다. 한국어로는 '감시자' 또는 '관찰자'정도로 번역이 되며, 정식적인 한국어 표기는 '옵서버'라고 하는게 맞다고 한다. 진짜 그대로 설명하면, 어떤 객체의 상태 변화를 감지하는 감시자를 옵저버 리스트에 등록하고, 상태 변화가 일어나면 리스트의 옵저버들에게 통보를 하는 패턴이 Observer패턴이다.


.....


Observer패턴이 쓰일 수 있는 좋은 예를 하나 들어봐야겠다.
보통 파일을 인터넷에서 다운로드하면 다운로드바가 뜨고, 해당 파일을 얼마나 다운받았는지 시각적으로 표현한다. (50% 받았으면 막대의 절반이 차오르는 등), 그리고 그 옆에 정확히 몇퍼센트 받았는지 숫자로도 표기를 해준다. 어떤 웹브라우져는 다운로드 관리용 창이 또 있어서, 모든 다운로드중인 파일의 상태를 또 알려주기도 한다. 이럴 때, 얼마나 받았는지 표기하는 개체들(Progress bar, Text)들은 어떻게 실시간으로 다운로드 상태 정보를 갱신해서 보여줄까? 

다운로드 창(window)이 오직 1개라면, 다운로드 모듈과 개체들을 1:1로 연결해버리면 된다. 하지만 '하나의 다운로드'를 '여러 창'이 볼 수 있게 된다면 1:1로 연결할 수 없다.
여러 창이라는게 무슨말이냐면, 웹브라우져로 큰 파일 다운로드 하나 하고, 창을 여러개 띄운 후에 각 창에서 다운로드관리자를 켜보면 된다. 분명 다운로드는 1개만 되고 있는데, 띄워져있는 모든 창에서 다운로드 상태가 갱신이 된다.

이런 상황을 구현하기 위한 것이 바로 Observer패턴이다. '다운로드 모듈'안에 옵저버 리스트를 만들고, 1초마다 한번씩 옵저버 리스트 안의 옵저버들에게 다운로드 상태를 알려주는 것이다.
옵저버는? 각각의 창이 옵저버가 된다. 한 창이 켜질 때마다 그 창을 다운로드 모듈의 리스트에 추가한다. 창이 꺼지면 리스트에서 삭제한다. 이렇게 되면, 창이 켜질 때마다 다운로드 모듈의 리스트에 등록이 되고, 다운로드 모듈은 파일을 받을때마다 모든 창에게 다운로드 상태를 알려주게 된다.


컴퓨터에서 '알려준다'는 개념이 좀 이해가 안될 수 있다. 이 글에서 '알려준다'는, 그냥 '파라미터(매개변수)에 값을 넣어 함수를 호출한다'정도가 된다. 즉, 다운로드 모듈은 다운로드할 때마다 매개변수에 다운로드 상태를 담아서 리스트에 있는 객체들의 함수를 호출한다. 위 그림과 아래 그림은 똑같은 내용을 담고있다.

현실에서도 아주 굉장히 유사한 사례가 있다.

과제 공지용 단톡방을 생각해보자.

대학교에서 교수님이 '이제부터 모든 과제는 단체톡방을 이용하겠습니다. 톡방에 초대하겠습니다'라고 하셨다. 모든 학생은 단톡방에 초대가 되고, 교수님이 단톡방에 과제를 올리면 학생들은 톡방을 확인한 후 과제를 한다.
여기서, 톡방에 있는 학생 목록이 옵저버 리스트이며, 톡방에 글을 올리는 것은 '과제를 해라'라는 함수를 호출하는 것이다. 학생들의 핸드폰은 옵저버가 되며, 학생들은 옵저버를 통해 과제 상태 변화를 확인한 후 과제를 하는 것이다.


설명은 끝났다. 이제 이것을 Java를 이용해서 구현해보자. (C#은 나중에. 지금 프로젝트에서 Java를 하고있기도 하고, 요즘 대학교에선 취업시킨다고 Java기본문법만 4학년까지 주구장창 가르친다고 한다. C#은 Events와 Delegate를 사용해서 구현할 수 있다. 위키백과에 예제가 있음)

위에서 설명한 다운로드 모듈을 만들 것이다.
util.Observable을 쓰지 않고 Interface를 이용해서 구현해볼 것이다. 클래스와 인터페이스 포함 총 5개의 파일을 작성한다.
(다운로드모듈 class, 창 class, Main class, Observer interface, publisher interface)


1. 다운로드모듈 class (교수-학생 설명에서는 '교수님'에 해당하는 class)

import java.util.ArrayList;

public class DownloadModule implements IDownloadPublisher
{
	//옵저버 목록. 교수-학생 설명에서는 단톡방의 참가자 리스트에 해당된다.
    ArrayList<IDownloadObserver> observers;
    
    String filename;
    int percent;

    //생성자
    public DownloadModule(String filename)
    {
    	observers = new ArrayList<>();
        this.filename = filename;
        percent = 0;
    }

    //옵저버를 리스트에 추가한다. 교수-학생 설명에서는 단톡방에 학생이 들어오는 것에 해당된다.
    @Override
    public void add(IDownloadObserver observer)
    {
    	observers.add(observer);
    }

    //옵저버를 리스트에서 제거한다. 교수-학생 설명에서는 단톡방에서 학생이 나가는 것에 해당된다.
    @Override
    public void delete(IDownloadObserver observer)
    {
    	observers.remove(observer);
    }

    //옵저버들에게 상태를 알린다. 교수-학생 설명에서는 단톡방에 교수님이 '톡 보내기'버튼을 누르는 것에 해당된다.
    @Override
    public void update()
    {
    	for(IDownloadObserver observer : observers)
    	{
    		observer.update(filename, percent);
    	}
    }
    
    //상태를 업데이트한다. 교수-학생 설명에서는 교수님이 단톡방에 '과제하세요'라고 타이핑하는 것에 해당된다.
    public void updateState()
    {
    	System.out.println("Download state updated");
    	percent += percent<100?5:0;    //예시를 위해 상태가 갱신될 때마다 5%씩 증가하는걸로 한다.
    	update();
    }
}

2. 창 class (교수-학생 설명에서는 '학생'에 해당하는 class)

class Window implements IDownloadObserver
{
    String name;
    public Window(String windowName)
    {
        name = windowName;
    }

    //창의 상태를 업데이트한다. 교수-학생 설명에서는 학생들이 교수님의 톡을 본 후 행동하는 것에 해당된다.
    @Override
	public void update(String filename, int percent)
    {
        System.out.print(name + " - ");
        System.out.println(filename + " Downloading... " + percent + "%");
    }
}

3. Main class (실행용)

public class DownloadObserve { public static void main(String[] args) { //다운로드 모듈. (교수님) DownloadModule downModule = new DownloadModule("file1.zip"); //다운로드 상태를 받아볼 창 생성 (학생들) Window w1 = new Window("w1"); Window w2 = new Window("w2"); Window w3 = new Window("w3"); Window w4 = new Window("w4"); //각 창들을 옵저버 리스트에 등록 (학생들이 단톡방에 참가한다) downModule.add(w1); downModule.add(w2); downModule.add(w3); downModule.add(w4); //for문이 돌 때마다 다운로드모듈의 상태를 갱신시켜준다. (과제를 한다) for(int i=0; i<20; i++) downModule.updateState(); //다운로드가 완료되었으니 옵저버 해제 (과제를 끝냈으니 학생들이 단톡방에서 나간다) downModule.delete(w1); downModule.delete(w2); downModule.delete(w3); downModule.delete(w4); } }

4. Observer interface (교수-학생 설명에서는 단톡방->학생들의 폰에 해당하는 interface)

public interface IDownloadObserver
{
    public void update(String filename, int percent);
}

5. Publisher interface (교수-학생 설명에서는 교수님의 폰->단톡방에 해당하는 interface)

public interface IDownloadPublisher
{
    public void add(IDownloadObserver observer);
    public void delete(IDownloadObserver observer);
    public void update();
}


실행해보면, 리스트에 등록된 Window들이 모두 함수를 호출한다. 이렇게 어떤 한 개체의 상태 변화를 다른 개체들에게 바로바로 알리고 싶을 때 사용하는 것이 Observer 패턴이다.
Interface를 따로 구현한 이유는, 꼭 Window class가 아닌 다른 클래스를 사용하더라도 그 클래스에 해당 interface를 implements(구현)만 해준다면 된다. 즉, 한 개체의 상태 변화를 '다양한' 다른 개체에게 전달할 수 있어진다.

'프로그래밍놀이터 > Design pattern' 카테고리의 다른 글

Observer 패턴  (2) 2017.10.09
디자인 패턴  (0) 2017.10.09
  1. 미스터리 2018.01.05 13:12 신고

    다른패턴은 안올려주시나요

소프트웨어 개발 방법에서 사용되는 디자인 패턴은, 프로그램 개발에서 자주 나타나는 과제를 해결하기 위한 방법 중 하나로, 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이름을 붙여, 이후에 재이용하기 좋은 형태로 특정의 규약을 묶어서 정리한 것이다. 알고리즘과 같이 프로그램 코드로 바로 변환될 수 있는 형태는 아니지만, 특정한 상황에서 구조적인 문제를 해결하는 방식을 설명해 준다. -위키피디아

말이 어렵다.
여러 백과사전 위키중에 위키피디아(위키백과)가 가장 말을 어렵고 정확하게 써놓는다.

소프트웨어를 개발하다보면 자연히 규모가 커질 것이고, 그 큰 소스코드들을 지속적으로 관리하고 효율적으로 개발하려면 코드 구조를 잘 설계해야된다. 스스로 코드 구조를 설계해도 좋지만 이미 세상에는 여러 사람들이 개발하면서 쌓은 설계 노하우를 정리하여 모아놓은 패턴이 있다. 이거를 디자인 패턴이라고 한다. 디자인 패턴은 소프트웨어의 '설계'에 들어가기 때문에 어떤 언어에 적용되는 그런 것이 아니다(언어마다 구현 방식이 다를 수는 있다).

좀 더 간단하게 말하자면, 예를 들어 C언어에서 두 변수의 값을 교체(swap)하는 방법 중 가장 흔하게 아는 방법은 아래와 같다.

int a = 10;
int b = 20;
int tmp;
//a: 10, b: 20

tmp = a;
a = b;
b = tmp;
//a: 20, b: 10

그리고, C언어에서 어떤 수의 1의 자리를 버리는 방법중 가장 흔한 방법은 아래와 같다.

int num = 1234;
//num: 1234

num = num / 10;
num = num * 10;
//num: 1230

이런 식으로, 어떤 복잡한 것을 구현하기 위해 통상 사용하는 규칙이나 방법같은게 있다. 이거를 소프트웨어 설계에 적용한 것이 디자인 패턴이다. (위에 두 코드는 디자인 패턴은 아니고 그냥 흔히 쓰는 방법)

디자인 패턴을 꼭 소프트웨어 개발에 적용할 필요는 없지만, 혼자 개발하는 것이 아닌 여럿이 개발하는 소프트웨어라면 당연히 개발 멤버들간에 정형화된 어떠한 규칙이 필요할 것이고, 가장 무난하게 쓰이는 것이 디자인 패턴이다. 뿐만 아니라 혼자 개발할 때에도 디자인패턴을 알아놓으면 소스코드의 구조를 파악하기가 쉬워지고, 특정 상황에서 문제 해결을 도와줄 것이므로 앵간하면 알아놓는 것이 좋다.

어쩌면 디자인패턴을 모르는 사람도 자신도 모르게 한두가지의 디자인패턴을 사용하고 있을 수 있다. 언어에서 문법적이나 API로 제공되는 것이 아닌 말 그대로 설계 규칙이기 때문이다.

디자인 패턴은 그 종류가 꽤 많은데, 대체적으로 24개정도를 많이 사용하는 것 같다. 위에서 언급했다시피 언어에 따라 디자인 패턴을 구현하는 방법이 다를 수 있다. (예를 들어 Observer패턴은 보통 Interface를 통해 구현하지만, Java는 util.Observable이 있고 C#엔 Events와 Delegate가 있어서 각자의 방법으로 구현할 수도 있다.)


디자인패턴은 알아놓으면 상당히 난감한 상황들을 상당히 간결하게 해결해 줄 수 있기 때문에 처음 만들 때 구조만 잘 짜서 적용하면 나중에 편해진다. 그래서 정리를 한번 해보려고 한다.

사실 인터넷에서 조금만 찾아보면 디자인패턴에 대해 정리가 아주 잘 되어있는데, 이게 원래 컴퓨터하는 사람들은 일부러 글을 어렵게 쓰는건지, 본인만의 세계가 있는건지, 아니면 내가 멍청한건지는 모르겠지만 한번에 잘 이해가 안됐다. 다들 클래스 다이어그램을 막 열심히 그리고 한두문단에 이어 코드하나 올려놓고 설명이 끝나버리는데, 사실 이런식의 설명은 매우 정확하고 이런 식의 설명을 읽고 이해하는 능력도 중요하다. 그런데 나는 아직 잘 안된다. 그래서 나도 공부할겸 나의 방식대로 내가 이해한 디자인패턴에 대해 글을 써보려고 한다. 가장 좋은 공부는 남에게 내가 아는 것을 설명하는 것이라고 하더라. 디자인 패턴이 뭔지 전혀 모르는 사람이, 디자인은 예체능 아니었나 생각이 드는 사람이 보고 이해할 수 있도록 쉽게 써보려고 한다(그래야 내가 나중에 다시 보고 이해함..)

한국식 단어를 최대한 안쓰려고 한다. 얘를 들면 'Observer패턴'은 '관찰자 패턴' 또는 '감시자 패턴'정도로 번역이 되는데, 번역해놓고 보면 뭔소린지 모르겠다. (거의 스타2가 처음 나왔을 때 드라군이 용기병이 된 느낌이다) 가급적이면 알파벳을 쓰겠지만 한글을 사용하더라도 완역이 아닌 음역으로 하려고한다.

'프로그래밍놀이터 > Design pattern' 카테고리의 다른 글

Observer 패턴  (2) 2017.10.09
디자인 패턴  (0) 2017.10.09

좀 된 이야기인데, 법이 바꼈는지 어쨌는진 몰라도 이제 회원가입&로그인 등의 최소한 개인정보와 관련된 작업을 하는 웹싸이트는 관련 패킷을 모두 암호화해야된다. 쉬운말로하면 HTTPS로 만들어야한다는 얘기. (굳이 HTTPS가 아니더라도 데이터를 암호화하면 되는 것 같다만, 정확히는 잘 모르겠다)


가장 쉽고 확실하면서 믿을만한 방법은 서버에 SSL인증서를 때려박고 HTTPS 통신으로 만들어주는게 있다.

그런데 SSL보안인증서 좀 살펴보면 알겠지만, 취미로 싸이트를 운영하는 수준에서는 비싸다.


하지만 데이터는 소중하므로 누군가 무료 SSL 인증서를 친히 발급받을 수 있도록 만들어놓으셨다.

크게 StartSSL과 Let's encrypt 두개가 있는데, 앞에꺼는 잘 모르겠고 뒤엣것을 이용하기로 한다. (예전에 node.js서버에 Let's encrypt로 보안서버구축하는거 올려놓긴 했었다)


플러그인같은게 있는 것 같은데, 솔직히 어떻게 써야할지 감이 안와서 직접 Let's encrypt를 통해 인증서를 발급받고 그걸 Web App에 적용하는 식으로 할거다.


일단 아래와 같은 전제조건을 깔고 시작하자. 아래와 다를 경우 나도 잘 모르겠다.

1. 개인 도메인 소유 (id.azurewebsites.net이런거 말고 개인 도메인. 아마 있어야되는걸로 안다. 지식이 짧아서 죄송하다.)

2. Microsoft Azure에서 Service plan이 최소한 custom domain과 SSL certifications를 지원해야함 (무료/공유는 지원 안함. Basic부터 지원)

3. Windows 10 + Ubuntu bash 활성화 상태. (또는 Linux나 Mac OS X도 될거임. 아래 설명은 Ubuntu bash on Windows10을 기준으로)

3-1. Windows 계정이 영문이어야함. 또는 사용자 계정 폴더 이름이 영문이어야함. 아니 그냥 appdata 경로에 유니코드 문자가 섞이면 안되는 것 같다.

4. 개인 도메인이 본인의 Web App에 연결이 되있어야함. (도메인업체에서 A레코드랑 CNAME 이런거 추가되어서 Azure에 연결되있어야됨)

이 정도가 일단 준비가 되어있어야한다.


적용하는 방법.


1. Ubuntu bash에 Let's encrypt 인증서를 발급받을 수 있도록 관련 소프트웨어들을 설치한다.

우리는 Certbot이라는 친구를 이용해서 인증서를 발급받을 것이다. https://certbot.eff.org 에 가면 설치 방법이 나와있다.

"I'm using [None of the above] on [Ubuntu 16.04]" 이걸로 선택해서 아래 나오는 설명을 따라가면서 설치하면 된다.

또는 아래 회색박스를 이용해서 certbot을 설치한다. (내가 했던 방법이며, 싸이트에 나와있는 방법을 가져옴)

$ sudo apt-get update

$ sudo apt-get install software-properties-common

$ sudo add-apt-repository ppa:certbot/certbot

$ sudo apt-get update

$ sudo apt-get install certbot


2. Certbot을 이용해서 인증서를 발급받는다.

이 때, 우리는 위 싸이트에 나온 --standalone옵션이나 --webroot옵션이 아닌 --manual 옵션을 이용해서 직접 인증서를 발급받고 뽑아낼것이다.

$ sudo certbot certonly --manual

저렇게 --manual을 붙여주면 수동으로 인증서를 만들고, 도메인 인증도 수동으로 한다.


도메인 주소를 입력하라는 질문이 나오면, 본인의 도메인 주소를 입력한다. 이 때, 도메인 주소의 구분은 띄어쓰기로 하면 된다.

나의 경우

www.ciiwolstudio.com ciiwolstudio.com

이렇게 두개를 입력해줬다. 보통 저렇게 두 개 해주면 될거임. 본인이 Web App에 연결해놓은 도메인중 HTTPS 연결이 필요한 도메인 다 적으면 되겠다.


그 다음에 IP수집에 관한 동의가 나올텐데, 이거 No로 해도 되는지 모르겠다. 예전에 해봤다가 안됐던걸로 기억하긴 하는데 잘 기억이 안난다. 무난하게 Yes로 해줬다.

아마 새로운 인증서를 갱신할 때, 인증서를 요청한 PC의 IP주소를 수집하는 것 같다.


3. 도메인 주소를 인증한다.

여기가 조금 어려울 수 있다. 인증서라는게 그냥 대충 달라고 하면 뚝딱 주는게 아니고, 입력한 도메인 주소가 실제로 본인이 소유한 주소인지 확인되어야 한다.

DNS설정에서 TXT레코드? 이런거로 인증하는 방법도 있는데(Microsoft Azure는 이걸로 인증), Let's encrypt는 아예 저 도메인 주소에 Request를 날려서 지정된 Response를 뿌리는지로 판단한다.

뭐 글자가 많이 쓰여있는데, 간단하게 설명하자면

www.mydomain.com/.well-known/acme-challenge/qwertyui :

qwertyui.asdfghjk

이런식으로 앞부분에 표시가 되어있을건데, 위에 주소로 들어갔을 때 아래 글자들을 반환해야 한다는 얘기이다.

즉, 내가 직접 도메인에 설정을 하든 서버에 설정을 하든 FTP로 파일 올려서 설정을 하든, 저게 가능하게끔 만들어주면 된다.

아래 설명은 위에 회색박스의 내용을 기준으로 설명한다. 실제로는 본인의 화면에 뜬 문자열을 가지고 진행하여야한다. (참고로 문자열 저거보다 한 5배정도 길다)


우선, FTP에 접속해서 wwwroot 폴더 안에 '.well-known'이라는 폴더를 만들어주고, 그 안에 'acme-challenge'라는 폴더를 만들어주자.

평소같으면 그냥 acme-challenge 폴더 안에 'qwertyui.asdfghjk'의 내용을 가진 'qwertyui'파일을 만들어서 때려박으면 되지만, 우리의 Web App(IIS)는 이 방법이 안되는 것 같다. 그래서 조금 다르게 해줘야된다.

우선 본인의 PC에서 index.html 을 하나 만들어주고, 파일 내용은 'qwertyui.asdfghk'로 한다. (태그같은거 필요 없고 오로지 qwertyui.asdfghkj만 있으면 됨)

그 다음, FTP에서 acme-challenge폴더 안에 'qwertyui' 폴더를 만들어주고, 그 안에 위에서 만들어준 index.html을 넣어준다.

이렇게 하면 이제 위에 주소로 접속했을 때 자동으로 index.html을 열게 되고, index.html속 파일 내용을 출력할 것이다.


이 과정이 끝났으면 Enter키를 한번 누른다. (확인차 Enter를 누르기 전에 저 주소로 한번 접속해보자. 문자열을 뿌리면 정상)

위에서 도메인을 1개만 등록했으면 바로 인증이 진행되지만, 2개를 등록했으면 똑같은 과정을 한번 더 해야된다. 3개했으면 세번 해야된다. 문자열 내용이 달라지기 때문에 도메인 개수만큼 폴더와 파일을 acme-challenge 폴더 안에 넣어주면 된다.

똑같은 내용 한번 더뜬줄알고 엔터 누르면 안되고, 꼭 도메인 2개를 입력했으면 두번 해야된다.


모든 설정을 끝내고 Enter키를 누르면 자동으로 인증이 진행된다.

약간의 시간이 걸린 후 결과가 나오는데, 제대로 따라왔다면 "Congratulations!"로 시작하는 내용이 뜰 것이다. 

파일은 Ubuntu bash 속의 /etc/letsencrypt/live/www.mydomain.com 안에 들어있다. (위치 출력해줌)

실패했을 경우 그 원인이 너무 다양하기 때문에 딱히 뭐 어떻게 설명을 못해주겠음.


4. 만들어진 키체인 파일들을 가지고 pfx파일을 뽑아낸다.

서버마다 요구하는 SSL인증서 파일이 다르긴 한데, 우리의 Web App(IIS)는 pfx파일을 요구한다. 하지만 눈씻고 아무리 찾아봐도 .pem으로 끝나는 파일들밖에 없다.

사실 이 pem으로 끝나는 파일들만 있으면 어떤 형식이든 만들어낼 수 있는 것 같다. 쉽게 생각해서 변환이 된다고 보면 될듯.

Ubuntu bash에서

$ su

# cd /etc/letsencrypt/live/www.mydomain.com

이런식으로 해서 관리자 권한으로 인증서 파일이 있는 폴더에 접근을 하자.

$ ls 이거 쳐봐서 파일 목록들 확인한다. cert.pem chain.pem fullchain.pem privkey.pem 이렇게 있으면 정상이다.

이제 openssl를 이용해서 pfx파일을 뽑아낼 것이다. 아래의 커맨드를 입력한다.

# openssl pkcs12 -export -out "certificate.pfx" -inkey "privkey.pem" -in "cert.pem" -certfile "chain.pem"

그냥 저 키와 키체인 인증파일 이것저것 잘 섞어서 certificate.pfx라는 파일로 병합해서 추출하겠다는 얘기인 것 같다.

저걸 치면 Export password를 치라고 하는데, 본인이 pfx파일에 적용할 암호를 만들어주면 된다. 알아서 강력하게 잘 만들어주자. 이거 암호 잊으면 안된다.

암호확인까지 치고 나면, /etc/letsencrypt/live/www.mydomain.com 폴더 안에 certificate.pfx 라는 파일이 생겼을 것이다. 이 파일이 우리가 Web App에 업로드할 인증서파일이다.


5. pfx파일을 Azure Web App에 업로드한다.

거의 다 왔다.

우선 pfx파일을 업로드하려면 이 파일을 Ubuntu bash에서 빼내야된다.

기본적으로 Ubuntu bash는 

C:\Users\User\AppData\Local\lxss

에 설치되어 있다. (중간에 User가 본인 윈도우 계정)

즉, 우리가 지금까지 Certbot으로 만든 Let's encrypt 인증서는

C:\Users\User\AppData\Local\lxss\rootfs\etc\letsencrypt\live\www.mydomain.com

에 있다는 얘기이다. 윈도우 탐색기를 통해 저기로 들어가보면 pem파일 4개랑 방금 추출한 pfx파일 하나가 자리잡고있다. 우리가 필요한건 pfx파일뿐이므로 얘를 복사한다. 본인의 작업상태에 따라 나머지 pem키를 백업하는 것도 좋다.


pfx파일을 이제 Web App에 업로드해야한다. Azure portal에서 본인의 Web App에 가서 찾아보면 "SETTINGS > SSL certificates"라는 메뉴가 있다.

거기 들어가면 처음에는 당연히 아무것도 없다. "Upload Certificate"를 누르고, 본인이 추출한 pfx파일을 선택한 후, 추출할 때 만들었던 비밀번호를 입력해주고 업로드하면 된다.


그럼 SSL certificates 설정에 본인이 업로드한 인증서가 나타날건데, 이제 이걸 도메인에 바인딩만 해주면 된다.

아래에 SSL bindings > +Add binding 버튼을 눌러주자.

Hostname에 본인의 도메인, Certificate에 본인이 방금 올려놓은 인증서, SSL Type은 그냥 SNI SSL로 냅두고 "Add binding"을 클릭한다.

계속 Add binding 눌러서 자기가 연결한 도메인 다 바인딩해주면 된다.


6. 확인

웹브라우저 캐시를 다 날리고(브라우저마다 다른데, 안날리면 안되는 브라우저가 있음) 본인의 도메인 앞에 https:// 를 붙이고 접속해보자.

아니면 안쓰는 웹브라우저 켜서 해도 되고.



나머지 작업(자동으로 http -> https 리다이렉트)은 본인이 알아서 해주면 되겠다. 만약 워드프레스같은 CMS를 사용한다면 CMS 설정을 잘 찾아보면 있을것이다.


참고링크, 위에 4번 절차부터 잘 나와있다.

https://docs.microsoft.com/ko-kr/azure/app-service-web/app-service-web-tutorial-custom-ssl


https 보안서버 구축이 공짜라니!



Microsoft Azure Web App은 저렇게 바인딩까지만 해주면 알아서 다 해준다. 편하다.

만약 순수 톰캣 아파치 nginx 이런거로 서버 구축한다면 포트 연결해주고 이런거 다 해줘야되는걸로 기억한다. (근데 요즘 세상 좋아져서 이런거도 알아서 해주는 프로그램 있음)



Azure Web App 말고 그냥 국내 웹호스팅도 SSL 인증서를 설치해서 https 보안서버로 만들 수 있다.

단, 국내 웹호스팅은 호스팅 업체마다 해주는 곳도 있고 안해주는 곳도 있으니 본인이 잘 선택하면 된다. (Cafe24의 경우 해주는걸로 알고있고, 일반적으로는 타사 SSL인증서 설치는 따로 돈을 받는걸로 알고있다.)



아, Let's encrypt는 보안인증서 만료기간이 3개월이다. 즉 3개월마다 갱신을 해줘야한다.

갱신을 하기 위해 위에 작업을 귀찮게 반복할 필요는 없고, certbot renew기능을 이용하면 보다 간단하게 갱신이 된다고 한다. (아직 갱신을 해본적이 없어서..)

만약 비번을 까먹었거나 하면 다시 처음부터 진행해서 재발급을 받으면 되겠다.


Download: https://github.com/ciiwol/capslock_indicator/releases

의존관계: .Net Framework 2.0 or higher


capslock indicator. 중간에 있는 A쓰여져있는 자물쇠 아이콘이 프로그램의 전부



캡스락 상태를 트레이 아이콘에서 확인할 수 있는 프로그램.


키보드를 사서 CapsLock이랑 Ctrl키를 바꿨는데 (키보드에 스위치가 있다), 이게 바꾸면은 캡스락이 걸려도 LED가 안들어온다고 한다.

이럴꺼면 왜 바뀐 Ctrl키캡에 LED구멍을 뚫어놨는지 참.

그래서 만들었다.

어짜피 한번 쳐보고 대문자 나오면 풀면 되지만 그래도 미리 알고 모르고의 스트레스 차이는 있으니깐.


caps lock off


caps lock on


버전은 1.0인데, 뭐 자주 패치 안할거라서 버전이 의미가 있나 싶다.

ciiwol은 내 생일이 시월이라서.


발견된 문제점으로는 작업관리자같은 몇몇 특수 창이 활성화 된 상태에서는 작동을 안한다는거.

이유는 모르겠다. 해결법으로는 타이머같은 백그라운드 쓰레드를 하나 더 얹혀서 주기적으로 확인하는 방법이 있긴 한데, 자원도 자원대로 처먹고 무엇보다 귀찮다.


C#으로 짜서그런지 아무것도 안하는 프로그램주제에 기본 메모리를 4MB나 먹는다.

+ Recent posts

티스토리 툴바