나는 책보고 공부하는 스타일이 아니고

프로젝트 진행하면서 경험하는 스타일이라서

하나하나 깊게 알고있는 게 거의 없다.


prototype 도 그중 하나,,

어떻게 쓰는지는 알고있지만, 조금이라도 응용되어있으면 와 이게 뭐람... 한다.


이번에 npm module 하나를 뜯어봐야 할 일이 있어서

prototype 을 이해해보려 검색했는데


[Javascript ] 프로토타입 이해하기


요기 정리가 넘나 잘 되어 있는 것,,



근데 보다보니 궁금해진 게 있다.


Prototype Link 를 통해 모든 Object 가 자기 조상함수의 Prototype Object 를 참조하는 거라면

음,, 변수가 공유되어야 하지 않나?

((((((내 머릿속 : 참조 == 주소값 공유))))))


그냥 개념도만 저런 거지 메모리는 분린가?

어떻게 되는 거지?


혹여나 실행해봤는데


> function Animal() {};

undefined

> Animal.prototype.legs = 4

4

> var dog = new Animal();

undefined

> dog.legs

4

> var worm = new Animal();

undefined

> worm.legs

4

> worm.legs = 0

0

> worm.legs

0

> dog.legs

4



위처럼 확실히 instance 끼리는 Prototype Object 에 추가해준 속성값을 공유하진 않는다.


우엑 뭐야


이건 더 검색해봐야 할 것 같다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/let


정리 매우 잘 되어있다.


사실 javascript 에도 let 이 있다는 걸 얼마전에 알아서

음,, 뭐 swift 에서의 var / let 차이랑 비슷하지 않을까? 했었는데

전혀 다르군요,,,,,,,, 큰일날뻔했네요,,,,,,,,,,,,,,,,,,,,


유효범위차이였군!!


하긴 javascript 에서의 var 유효범위 너무,, 너무 방대하고 관대해서 헷갈린다.

앞으로는 let 을 잘 활용할 수 있길..!

http://resoneit.blogspot.co.uk/2014/01/this.html


javascript는

알면 알수록 너무 복잡하다.


즉당히 조금 알 때가 가장 편한 언어



+) 미지의 똥 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 넘 공감,,




++) 

this 똥이 new 와 생성자를 빼먹고 쓴 코드에서도 의도대로 잘 돌아가도록 하는 법 

http://redgolems.tistory.com/33

아,, 

https://www.npmjs.com/package/mqtt 

npm mqtt 페이지인데

가타부타 말 없이 

 

"In case mqtts (mqtt over tls) is required, the options object is passed through to tls.connect(). "

 

라고만 나와있어서 삽질 엄청 했다.

너무 빡쳐서 정리해둬야겠다.

 

broker 로는 mosquitto 활용

 

 

node.js 에서 mqtts connection 을 구현하려면 두가지 단계가 있는데,

일단 mosquitto broker setting 을 해줘야하고

두번째로는 mqtts 로 mosquitto broker 에 접근할 수 있도록 node.js 코드도 수정해줘야한다.

 

 

#인증서 생성 및 Mosquitto Setting

 

http://firstheart.tistory.com/entry/Mosquitto-TLS-%EC%84%A4%EC%A0%95 

여기 되게 상세하게 잘 나와있긴한데

굳이 다시 한번 정리해보자면

 

1. 서버 인증서 생성 (생성할 위치는 마음대로)

> openssl genrsa -des3 -out server.key 2048
> openssl genrsa -out server.key 2048
> openssl req -out server.csr -key server.key -new

까지 하고

원 블로그 글에는 CA directory 를 생성해서 어쩌고 라고 되어있는데, 역시나 path는 그냥 마음대로 하면 되는 것 같다.

 

> wget https://github.com/owntracks/tools/raw/master/TLS/generate-CA.sh

 

(Mac의 경우 wget 단계에서 막히면 brew wget 해주면 됨. brew 도 안 깔려 있으면 음.. 깔아서 쓰세요 맥주잔 떠서 귀엽습니다 ㅎㅎ)

 

> sh ./generate-CA.sh

그렇게 하면 파일들이 주루룩 생성된다.

 

ca.crt, ca.key, ca.srl, localhost.crt, localhost.csr, localhost.key

 

 

이후에는 

 

>openssl x509 -req -in server.csr -CA <ca.crt FILE_PATH> -CAkey <ca.key FILE_PATH> -CAcreateserial -out server.crt -days <duration>

요렇게 해주면 서버키 설정 끝..인 것 같다.

 

 

2. Mosquitto Config file 수정

 

>cp ca.crt /etc/mosquitto
>cp localhost.crt localhost.key /etc/mosquitto

 

이렇게 파일을 복사해줘야하는데, 저 경로가 골때린다. 

나는 Mac을 쓰는데 /etc/mosquitto directory 가 없어..

 

찾아봤더니 내 경우에는

/usr/local/etc/mosquitto

directory에 mosquitto.conf 파일이 있기에, 저기다가 옮겼다.

 

이제 mosquitto.conf 파일을 수정해줘야 한다.

 

port 8883
protocol mqtt
 

두 줄을 추가하고

 

cafile <path>/ca.crt
certfile <path>/localhost.crt
keyfile <path>/localhost.key

요렇게 하고 저장 후에 mosquitto 를 -c <config file path> 옵션과 함께 재실행해주면 끝!!
mosquitto 에 설정이 잘 됐는지 테스트 해보려면아래 커맨드를 실행해보자 (돌려보는 거임)

>mosquitto_sub -h localhost -p 8883 --cafile /usr/local/etc/mosquitto/ca.crt -t test
>mosquitto_pub -h localhost -p 8883 --cafile /usr/local/etc/mosquitto/ca.crt -t test -m "TEST~~~~ LALA~"

 

잘 나온다면 설정이 잘 된 거다.

 

 

3. 클라이언트 인증서 생성

> openssl genrsa -des3 -out client.key 2048
> openssl req -out client.csr -key client.key -new
> openssl x509 -req -in client.csr -CA <ca.crt FILE_PATH> -CAkey <ca.key FILE_PATH> -CAcreateserial -out client.crt -days <duration>

 

 

 

#Node.js Code



나는 요거 하다가 너무 화났다.내가 바보라 그런 걸수도 있는데, tls.connect()를 어쩌구 하라는 부분 너무 성의없어.
원래 보통의 mqtt connection을 할 때는

var mqtt = require('mqtt');

var client = mqtt.connect('mqtt://localhost:1883');

 

 

뭐 이 정도만 적어도 잘 돌아갔다.

 

여기에 ssl 을 적용하려면 mqtt.connect 에 넣어주는 파라미터가 좀 바뀐다.

var mqtt = require('mqtt');
var fs = require('fs');

var options = {
	host: '127.0.0.1',
	port: 8883,
	protocol: 'mqtts',
	protocolId: 'MQIsdp',
	ca: [fs.readFileSync('<path>/ca.crt')],
	key: fs.readFileSync('<path>/client.key'),
	cert: fs.readFileSync('<path>/client.crt'),
	passphrase: 'CLIENT KEY PASSPHRASE',
	secureProtocol: 'TLSv1_method',
	protocolVersion: 3
};

var client = mqtt.connect(options);

요렇게 해주면 짜잔짜잔 엄청 잘 돌아간다.
휴 삽질 너무 많이 하다 성공해서 빡쳐서 정리용으로 글 하나 쌌다.
저 options 에서 꼭 제대로 반영해줘야 하는 값들은 ca, key, cert, passphrase 이고, 나머지는 위와 동일하게 넣어도 무방하다.

 

*2022.12 수정

아무것도 모를 때 혼자 정리해보겠답시고 쓴 글이라 정보가 부정확할 수 있습니다.

많은 분들이 봐주고 계신지 몰랐네요 ^^

어쩌다 오랜만에 티스토리 들어왔는데 제 글을 보고 계신 분이 꽤 있어 노파심에 첨언합니다.

제 경험을 공유한 글이지, 정확한 정보를 전달하기 위한 글이 아니었다는 점 고려하고 봐주세요.

감사합니다.

'Programming > Node.js / Javascript' 카테고리의 다른 글

[Javascript] prototype 이해하기  (0) 2017.09.19
[Javascript] var 와 let  (0) 2017.09.18
[Javascript] this keyword 이해하기  (1) 2017.09.18

+ Recent posts