Development2017.05.04 15:33

새롭게 지급받은 회사 PC 에서 dig 명령을 Client Subnet 정보 없이 사용하고 있던 찰나, 고객님의 확인 요청으로 Client Subnet 정보를 활용한 DNS 조회가 필요해졌습니다. 늘 그랬던 것처럼 bind-9.9.3 버전을 다운로드 받아 패키지에 포함되어 있는 dig 을 추출해 사용하려고 했습니다만 Xcode8 이 설치된 환경에서 발생할 수 있는 컴파일 이슈를 만났습니다.


여기저기 수소문을 해보니 누락된 커맨드 라인 도구가 있고 이로 인해서 많은 make 빌드가 실패하고 있다는 제보가 온천지에 깔려있었습니다. 궁극적인 해결은 애플이 새로운 Xcode 를 배포하면서 누락된 커맨드 라인 도구를 포함시켜 주는 것이겠습니다만 일단 문제 해결이 먼저이니 Quick-Fix 를 적용해 봤습니다. 


문제는 "make" 에서 발동되었습니다. ㅜㅜ (참조 : https://www.gsic.uva.es/~jnisigl/dig-edns-client-subnet.html)



발견된 빌드 실패 메세지에서 몇 가지 단서를 찾아보았습니다. 


gcc -g -O2 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/libxml2 -I../../lib/isc/include \

-D__APPLE_USE_RFC_3542   -o gen ./gen.c -lpthread  -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/lib -lxml2 -lz -lpthread -licucore -lm

ld: file not found: /usr/lib/system/libsystem_symptoms.dylib for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)


gcc 를 수행하는 와중에 발생한 /usr/lib/system/libsystem_symptoms.dylib 파일의 누락이 결국 문제라고 판단되었습니다. 구글신께 missing 커맨드와 함께 이 파일의 풀 패스를 넣으니 고생하는 개발자들이 여기저기에서 튀어나왔습니다. 그 중, 용자가 정리해놓은 Quick-Fix 는 tbd 파일에서 존재하지 않는 파일 참조 경로를 없애서 원천적으로 접근 시도를 하지 않도록 하는 것이었습니다. 간단히 아래의 명령으로 레퍼런스 정보를 삭제했습니다.


$ sudo /usr/bin/sed -i.backup -E -e 's@/usr/lib/system/libsystem_symptoms.dylib(, )?@@' $(grep -ril /usr/lib/system/libsystem_symptoms.dylib /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/lib)


이후 다시 make 를 돌리니 아무런 문제 없이 컴파일을 마치고 Client Subnet 을 지원하는 dig 을 획득할 수 있었습니다. 혹시 유사한 이슈를 겪는 분이 계시다면 "애플 탓이구나~ 명령어를 돌려보자~!"로 대응하시면 좋겠습니다.



저작자 표시 비영리
신고
Posted by 노피디
Development2017.05.02 12:07

이유는 알 수 없습니다만 여러곳에서 지속적으로 사용자 유입이 되고 있는 포스팅이 "JSON 포맷에서 주석을 사용할 수 있을까?" 라는 글입니다. 유입이 많은 이유로 생각되는 것은 많은 분들이 JSON 포맷을 사용하면서 주석 사용에 대한 욕망(?)이 있고, 이에 대한 방법을 찾으려다 검색 유입이 되는 것이라는 생각이 듭니다. 저 역시 글을 쓴 이유가 JSON 포맷에서 주석을 왜 쓸 수 없을까 였기 때문에 결국 같은 갈망을 가지고 검색후 실망-_-이라는 수순을 밟고 있는 안타까운 현실이라 하겠습니다.



요즘 읽고 있는 책 중 하나가 제이펍에서 출간한 "자바스크립트와 Node.js 를 이용한 웹 크롤링 테크닉"(책 내용 자세히 보기 [바로가기]) 이라는 책입니다. 곧 이직을 계획하고 있어서 여유 시간을 알차게 활용하고자 Node.js 와 파이썬(Python), 그리고 인프라스트럭쳐 배포 자동화에 심취해 있는데요, 여튼 이 책을 읽던 중 JSON5 에 대한 정보를 습득하게 되어 간단하게 공유해 보고자 합니다. 



JSON5 (http://json5.org) 는 JSON 이 가지고 있는 몇 가지 단점들을 ECMAScript 표준의 진화에 맞추어 쓸만한 형태로 개선하고자 하는 일종의 제안으로 시작된 프로젝트입니다. 시작된지는 좀 된 과제이지만 여전히 가야할 길을 열심히 걷고 있는 과제이기도 합니다. JSON5 는 JSON 의 규격을 조금 더 완화시키고 유연하게 만들어 다양한 데이터 포맷을 수용하고, 사람들에게도 더 친숙한 (= 주석으로 지저분해지는?) 형태로 만드는 것을 목적으로 하고 있습니다. JSON5 포맷으로 구성한 데이터 포맷의 예를 살펴보면 변화하는 부분을 쉽게 인지할 수 있습니다.



글의 시작에 이야기 했던 주석은 한줄 주석, 혹은 여러 줄로 구분된 주석 형태를 제공하고 있습니다. Key 를 표현할 때 꼭 사용해야 했던 따옴표 역시 제거되어 key 입력에 대한 불편함이 사라졌고, 파싱 에러의 대부분을 차지하고 있는 콤마에 대한 사용도 완화되어 어레이의마지막에 콤마가 들어가도 무방하도록 변경되었습니다. Value 에 멀티라인 텍스트가 들어갈 수 있는 것도 고무적인 부분입니다. 그 외에 Hex 형태의 표현 허용, 소수점 이하 표기법의 자유도 등도 눈에 띄는 부분입니다. Node.js 를 사용하는 경우 npm 을 통해서 json5 모듈을 쉽게 다운로드 받아 사용해 볼 수 있습니다.


$ npm install json5


모듈이 설치되면 Require 문으로 json5 모듈을 불러와야 한다는 점을 제외하면 parse 와 stringify 메소드를 이용해서 기존 JSON 내장 객체처럼 사용할 수 있습니다. 간단한 Node.js 예제코드는 아래와 같습니다.


var JSON5 = require('json5');

var fs = require('fs');

var json5 = fs.readFileSync("data.json5", "utf-8");


var obj = JSON5.parse(json5);


console.log(obj);

console.log(obj.multi_line);

console.log(obj.hex_data);

console.log(obj.items);


당연한 것이겠지만 JSON5 를 이용하여 데이터를 주고 받을 각 주체들은 JSON5 를 지원할 수 있도록 준비되어야 합니다. Node.js 이외의 다른 언어에서도 미리 준비된 패키지가 있을 것으로 생각됩니다만, 규격의 변경에 따른 사용 가능 여부를 확실히 점검하고 넘어가는 것이 좋을 것 같습니다. 주석을 이용할 수 있다는 것은 분명 의미있는 변화이지만 이로 인해 증가할 수 있는 데이터 파일의 크기, 새로운 처리 모듈의 사용 등은 고민을 해봐야 할 부분입니다.






저작자 표시 비영리
신고
Posted by 노피디
Development2017.04.18 10:10

세상에는 굉장히 다양한 이미지 포맷이 존재합니다. 압축 포맷의 대명사인 JPG 부터 비트맵으로 이미지를 표현하는 BMP, 투명한 이미지가 필요할 때 많이 찾게되는 PNG 와 간단한 애니메이션 용도로 널리 사용되는 GIF 등이 대표적입니다. 사람들은 각자의 목적에 따라 이런 이미지들을 활용하게 되는데요, 서로 다른 여러가지 포맷을 바꾸어 가면서 사용해야 하는 경우가 간혹 생기곤 합니다. 


예를 들어 프론트엔드 디자이너라고 하면 PNG 포맷을 많이 사용하겠지만 책을 한권 같이 쓰고 있다면 TIFF 포맷이 필요할 수도 있습니다. 다양한 이미지 관련 프로그램이나 플러그인으로 포맷을 변경하는 것도 가능하지만 왠지 상황에 맞게 이미지를 캡쳐 할 때부터 PNG, TIFF 등을 정할 수 있으면 좋을 것 같습니다. OS X 운영체제에는 간단한 터미널 명령으로 기본 내장 캡쳐 옵션으로 이미지를 만들때 사용하는 포맷을 변경할 수 있습니다.


[ 캡쳐 이미지 포맷 변경하기 ]

$ defaults write com.apple.screencapture type tiff && killall SystemUIServer


위의 명령을 이용하면 지정된 이미지 포맷으로 쉽게 캡쳐 파일의 형식을 지정할 수 있습니다. && 로 연결된 또 다른 명령은 해당 변경사항이 운영체제를 재부팅 하지 않고 적용될 수 있도록 하기 위한 명령입니다. 간단한 명령이지만 이걸 매번 외워서 치거나 어디에 저장해 두었다가 입력하는 것은 왠지 불합리해 보입니다. 개인적으로는 블로그와 회사 공식 블로그에 글을 올릴때 PNG 를 사용하고 있고 저술 작업을 위해 TIFF 를 쓰고 있어서 아래와 같이 쉘 프로파일을 지정해 보았습니다.


[ .bash_profile 파일에 Alias 를 지정 ]

alias png="defaults write com.apple.screencapture type png && killall SystemUIServer"

alias tiff="defaults write com.apple.screencapture type tiff && killall SystemUIServer"


이렇게 지정해두면 터미널이 실행 될때 alias 가 지정되고 간단히 커맨드 프롬프트에서 png, tiff 를 입력하는 것 만으로 쉽게 캡쳐 이미지 포맷을 변경할 수 있습니다. 캡쳐 이미지 포맷을 자주 변경해야 하는 분들이 계시다면 유용하게 활용하실 수 있겠네요!



저작자 표시 비영리
신고
Posted by 노피디
Development/sublime text2017.04.11 14:55

Sublime Text 에디터는 패키지(Package)를 이용하여 기능을 지속적으로 확장, 보완할 수 있습니다.

워낙 다양한 패키지들이 공개되어 있어 어떤 것을 사용하는게 좋다는 이야기를 드리기 조심스럽지만

자주 행하게 되는 반복 작업에 지친 분들이 있을까봐 좋은 패키지 하나를 소개합니다.


업무 특성상 HTML, CSS, Javascript 그리고 JSON 파일을 많이 다루고 있습니다.

여느 웹 개발자나 서버단의 개발자 분들 역시 그런 경우가 많을 것 같습니다.

그동안은 웹 기반으로 만들어져 있는 들여쓰기 정렬툴, 소위 Pretty Print 도구를 사용했습니다만

오프라인 환경에서 작업할 때는 인터넷 엑세스가 제한되어 불편함이 있었습니다.



오늘 발견한 HTMLPrettyfy 패키치는 node.js 가 설치되어 있는 환경에서 사용 가능한 패키지로

서브라임 텍스트2와 3에서 모두 활용할 수 있는 코드 포맷터입니다.

node.js 가 설치되어 있지 않다면 당연히 사용이 어렵다는 정도가 제약사항이라 하겠습니다.


소스코드가 깃헙에 공개되어 있기 때문에 필요에 따라 SQL 이나 다른 구조화된 포맷이 필요한 텍스트에 대해서

기능을 개발하고 제안하여 참여 가능하다는 것도 기억해 두시기 바랍니다. (누가 SQL 좀... 굽신...)




설치를 위해서는 먼저 서브라임 텍스트의 패키지 매니저를 실행해야 합니다.

맥 환경인 경우 Command + Shift + P 를 누르면 되고 윈도인 경우 Ctrl + Shift + P 를 누르면 됩니다.

까만 에디터 위로 조그만 팝업이 뜨면 "Package Control Install Package"를 입력하여 패키지 설치를 시작하겠습니다.



팝업 창이 리프레시되면 위 이미지처럼 "HTML-CSS-JS Prettify"를 검색하시어 선택합니다.

이미 설치되어 있는 경우 결과창이 나오지 않습니다만 설치가 되어 있지 않은 경우

검색 결과 화면이 나오고 엔터를 누르면 서브라임 텍스트 에디터 하단에 설치 진행 현황이 업데이트 됩니다. 


BeforeAfter



이제 정렬하고자 하는 문서가 활성화된 상태에서 Command + Shift + H (윈도에서는 Ctrl + Shift + H) 를 누르면

예쁘게 들여쓰기와 줄바꿈이 된 문서로 탈바꿈 하게 됩니다. 





저작자 표시 비영리
신고
Posted by 노피디
Development/node.js2017.04.06 05:36

node.js 를 사용하면서 가장 애를 먹는 것중 하나가 설치한 모듈을 찾지 못한다는 메세지를 만날때 입니다. 환경에 따라 모듈의 설치 경로가 달라질 수 있고, node.js 가 설치된 모듈을 찾아가는 순서에 영향을 받기 때문입니다. 간단한 몇 가지 명령을 통해 node.js 가 어떤 순서로 모듈을 탐색하는지 확인하고 글로벌 모듈로 설치된 경우 이를 명시적으로 node.js 가 이용할 수 있도록 알려줌으로써 어느정도 문제를 해결할 수 있습니다.


아래와 같이 npm 에서 -g 옵션을 이용하여 모듈을 설치하면 글로벌 모듈로 설치가 됩니다. 프로젝트에 관계 없이 설치된 모듈을 이용할 수 있어야 하는 것이지요. 일부 환경에서는 sudo 명령을 이용하여 관리자 권한으로 설치를 해야 할 수도 있습니다.


$ npm install -g [#모듈이름#]


또는


$ sudo npm install -g [#모듈이름#]


이렇게 -g 옵션을 이용하여 글로벌 모듈로 설치하는 경우, 그 경로는 어떻게 될까요? 아래와 같은 명령을 이용하여 글로벌 모듈로 설치하는 경우의 Path 를 확인할 수 있습니다.


$ npm root -g

/usr/local/lib/node_modules


간혹 글로벌 옵션을 이용하여 설치한 모듈을 찾을 수 없다고 나오는 문제를 겪고 있다면, 위의 명령으로 확인한 경로를 NODE_PATH 라는 환경 변수에 저장하여 node.js 가 글로벌 모듈을 찾을 때 참조할 수 있도록 명시적인 지정을 할 수 있습니다. 반복적으로 사용해야 하는 값이기 때문에 홈 디렉토리의 .bash_profile 파일에 포함하여 터미널 실행시 셋업되도록 하면 되겠습니다. 윈도 환경에서는 시스템 환경 변수에 넣어주면 됩니다.


~/.bash_profile 에 아래와 같이 환경 변수 추가


export NODE_PATH="/usr/local/lib/node_modules"


글로벌 모듈 이외에 현재 프로젝트에서 모듈을 찾아가는 탐색 순서를 확인하려면 아래와 같이 간단한 자바스크립트 구문을 node.js 를 이용하여 실행해보면 됩니다. 아래의 경로로 모듈을 찾아본 뒤, NODE_PATH 에 지정한 경로까지 탐색하여 현재 환경에서 모듈을 찾고 이용하게 됩니다. 


$ node -e "console.log(global.module.paths)"

[ '/Users/snoh/node_modules',

  '/Users/node_modules',

  '/node_modules' ]


- NoPD -



저작자 표시 비영리
신고
Posted by 노피디
Development2016.10.12 09:21

터미널에서 로그파일을 핸들링하면서 자주쓰이는 명령들이 있습니다. 전체 파일을 출력하기 위해서 cat 명령을 사용하고 특정한 컬럼의 값만 출력하기 위해서 파이프로 연결된 awk 명령을 쓸 때가 많습니다. 그런데, 컬럼이 아주 많은 경우에 특정한 컬럼만 제외하고 나머지를 출력할 수 있는 방법이 있을까요? 컬럼이 적은 경우에는 필요한 필드를 나열하는 것도 괜찮지만, 수십개, 수백개의 컬럼이 있다면 그다지 좋은 방법이 될 수가 없습니다.


예를 들어 temp.txt 파일에 아래와 같이 스페이스로 구분된 10개의 컬럼이 있다고 해보겠습니다. 이 파일의 정보들 중에서 특정한 컬럼의 값만 추출하고 싶다면 awk 명령을 이용해서 print 예약어를 이용할 수 있을 겁니다. 


$ cat temp.txt

C1 C2 C3 C4 C5 C6 C7 C8 C9 C10

$ cat temp.txt | awk '{print $3, $5}'

C3 C5


이 데이터 파일에서 거꾸로 3번 컬럼과 5번 컬럼의 값을 제외한 나머지 컬럼의 값을 추출하려면 어떻게 해야 할까요? print 구문의 파라메터로 $3 과 $5 만 빼고 나열해도 되겠지만, 아래와 같이 명령을 입력하면 훨씬 빠르고 쉽게 특정한 컬럼만을 제외하고 데이터를 정제할 수 있게 됩니다.


$ cat temp.txt | awk '{$3=$5=""; print $0}'

C1 C2  C4  C6 C7 C8 C9 C10


동일한 결과물을 얻어내는 방법이 여러가지 있다면 그중에서 가장 간편한 방법을 택하는 것이 누가 뭐라해도 진리일 겁니다. 작업시간을 절약하고 더 집중해야 하는 것들에 몰입하는 하루 되시길 바랍니다!



저작자 표시 비영리
신고
Posted by 노피디
Development2016.09.29 12:47

다량의 데이터를 추출하면 필연적으로 정렬에 대한 필요성이 생깁니다. 정렬이 필요한 순간은 정말 다양하겠지만 대표적인 경우들을 들어보자면, 1) 특정한 조건에 만족하는 로그 라인의 갯수를 오름/내림 차순으로 정렬, 2) 시계열 순으로 로그가 추출되지 않은 경우, 시간 컬럼을 기준으로 로그 라인을 정렬과 같은 것이 있습니다. 1의 경우는 카운트를 위한 명령을 파이프로 연결후 쉽게 정렬할 수 있습니다.


$ cat domain.log | awk '{print $3}' | sort


위의 커맨드는 domain.log 파일을 핸들링하면서 세번째 열을 출력하고 이를 정렬하는 명령어 입니다. 여기에 파이프를 추가하여 유니크(Unique)한 이름을 발라내고, 다시 카운트된 갯수를 기준으로 정렬하려면 아래와 같은 명령을 생각할 수 있습니다.


$ cat domain.log | awk '{print $3}' | sort | uniq -c | sort -rn


그런데 특정한 컬럼을 기준으로 정렬하되 전체 데이터를 유지하려면 awk 명령으로는 왠지 좀 불편한 느낌입니다. 이때는 awk 를 이용하지 말고 sort 명령만으로 정렬하는 것이 더 유리합니다. 


$ cat domain.log | sort -k 3


이렇게 하면, 세번째 컬럼 (이때는 공백으로 각 컬럼이 나뉘어진 데이터라 가정했습니다) 을 기준으로 정렬후 데이터를 출력해 주게 됩니다. 자주 쓰는 명령인데 쓸때마다 자꾸 구글링하게 되어 블로그에 기록해 둡니다!



저작자 표시 비영리
신고
Posted by 노피디
Development/python2016.09.21 04:21

여러 문서들에 따르면 Python 2 의 경우 2.7.9 이상의 버전, Python 3 의 경우 3.4 버전 이상이 설치된 경우 파이썬 패키지 매니저인 pip 가 이미 설치되어 있을 거라고 합니다. 하지만 늘 예외가 있는 법이고, 그 예외는 본인에게 해당되는 경우가 많죠. 설치된 파이썬의 버전 조건이 맞지만 pip 가 설치되어 있지 않다면 아래의 순서대로 pip 를 쉽게 설치할 수 있습니다. 맥을 쓰고 있다보니 brew 로 pip 설치를 하려고 했으나, 파이썬이 중복되어 설치될 수 있다는 경고때문에 따로 설치를 진행했습니다.


먼저, curl 을 이용해서 pip 를 설치하기 위한 파이썬 코드를 다운로드 받습니다. 뭐, 브라우저를 이용해서 소스코드를 로딩하고 파일로 따로 저장하겠다 하시면... 그리 하셔도 말리진 않겠습니다.


$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py


소스코드가 다운로드 되었다면 실행을 해보겠습니다. 사용중인 환경에 따라 sudo 로 권한 상승을 할 필요가 있다는 점 참고하시기 바랍니다. 


$ sudo python get-pip.py

Collecting pip

  Downloading pip-8.1.2-py2.py3-none-any.whl (1.2MB)

    100% |████████████████████████████████| 1.2MB 927kB/s

Collecting wheel

  Downloading wheel-0.29.0-py2.py3-none-any.whl (66kB)

    100% |████████████████████████████████| 71kB 4.5MB/s

Installing collected packages: pip, wheel

Successfully installed pip-8.1.2 wheel-0.29.0


이제 pip 를 실행해보겠습니다. 잘 되는군요.


$ pip


Usage:

  pip <command> [options]


Commands:

  install                     Install packages.

  download                    Download packages.

  uninstall                   Uninstall packages.

  freeze                      Output installed packages in requirements format.

  list                        List installed packages.

  show                        Show information about installed packages.

  search                      Search PyPI for packages.

  wheel                       Build wheels from your requirements.

  hash                        Compute hashes of package archives.

  completion                  A helper command used for command completion

  help                        Show help for commands.



저작자 표시 비영리
신고
Posted by 노피디
Development2016.06.23 10:38

IPv4 의 주소 체계가 더이상 새로운 주소를 사용자들에게 주지 못할거라는 이야기가 나온지 참 오래된 것 같습니다. 마르지 않는 샘처럼 끊임없이 나오는 IPv4 주소 덕분에(?) 생명연장의 꿈을 꾸고 있습니다만 근래 애플(Apple)의 앱 검수 기준 변화는 IPv6 로의 트랜지션이 본격적으로 시작된 것이라는 느낌을 주기에 충분합니다.


IPv4 네트워크가 워낙에 광범위하게 사용되고 있기 때문에 어느날 갑자기 "오늘부터 IPv6 를 써야해!" 하기는 쉽지 않습니다. 때문에 많은 기술 표준과 이를 준수하는 어플라이언스를 통해 점진적인 트랜지션이 일어나고 있습니다. 개발을 하는 사람들은 사실 이걸 신경쓰지 않아도 됩니다만 이왕 세상이 변하고 있는것, 이해가 가는 부분까지 파보기로 했습니다.


NAT 라는 이야기는 많이 들어보셨을 겁니다. Network Address Translation 의 약자로 이 역할을 하는 장비들은 내부 주소(Private IP)를 외부 주소(Public IP)로 바꿔주는 역할을합니다. 당연한 이야기지만 내부 주소는 사적인 네트워크에서만 동작하기 때문입니다. 외부의 다른 인터넷 자원과의 통신을 위해서 주소 체계를 바꾸어 주는 것이지요. 이것을 IPv6 에 대응하여 IPv4 네트워크와 자연스러운 연결을 위해 만든 것이 바로 NAT64 입니다.


IPv6 체계가 퍼블릭 네트워크에 완전히 보급되는 것은 시간도 오래걸리고 어쩌면 불가능 할지도 모릅니다. 떄문에 IPv4, IPv6 는 한동안 혼용될 것입니다. 상대적으로 내부 네트워크는 IPv6 로의 전이가 쉬운 편이라 사내망에서는 이미 IPv6 를 쓰는 곳들이 꽤 많습니다. 내부에서 사용되는 IPv6 만 사용하는 기기들이 외부의 IPv4 로 구성된 기기에 접근하기 위해서 NAT64 를 활용한다고 보시면 되겠습니다. 시스코에서 게시해 둔 아래의 그림을 보면 이해가 빠를겁니다.


출처 : 시스코



IETF 에서는 NAT64 를 위해서 특정한 IPv6 주소를 활용할 수 있도록 규약을 정의해두었습니다. 이 주소를 활용하게 되면 패킷의 헤더 일부분에 실제 접근해야 하는 IPv4 주소를 포함시킬 수 있게 됩니다. NAT64 어플라이언스는 이 주소체계를 식별하여 IPv4 네트워크로 패킷을 전달할 때 목적지 주소로 활용할 수 있게 되는 것이죠. 실제 패킷의 응답을 다시 받아주기 위해서 NAT64 장비는 이 과정에 원본 주소로 활용할 IPv4 Pool 을 유지하면서 응답을 적절한 사용자에게로 리턴해 줄 수 있게 됩니다.


이러한 과정을 소화하기 위해서는 DNS 역시 AAAA 리소스 레코드로 IPv4 주소를 포함한 데이터를 가지고 있어야 하며 이는 다음글에서 DNS64 라는 주제로 살펴보도록 하겠습니다. NAT64 에 대해서 관심이 더 있으시다면 시스코의 아래 링크와 IETF 문서를 읽어보시면 ㄷ움이 되시겠습니다. 


시스코의 NAT64 관련 글 살펴보기 [바로가기]

IETF 의 RFC6146 (Stateful NAT64) 규약 살펴보기 [바로가기]



저작자 표시 비영리
신고
Posted by 노피디

대세는 https 입니다. 새로운 http 표준인 http/2 (aka h2) 는 Clear Text 에 관한 규약을 가지고 있긴 하지만 시장에 있는 대부분의 브라우저들은 TLS 기반의 통신을 http/2 를 이용하기 위한 기본 조건으로 내걸고 있습니다. 프로토콜의 변화 뿐만 아니라 렛츠인크립트(Let's Encrypt)와 같은 무료 인증서 배포가 대중화되기 시작하면서 스트리밍(Streaming)과 같이 레이턴시(Latency)에 민감한 부문을 제외하면 전반적인 https 로의 전이가 그리 오래 걸릴 것 같지는 않습니다.


WWDC 2016 에서 애플은 ATS 에 대한 정책 강화를 통해, 앱의 인터넷 구간 통신 프로토콜로 https 를 강제하기 시작했습니다. 자세한 글을 [이곳에서] 읽으실 수 있습니다.


그런데 https 규약 자체가 보안을 의미하지는 않습니다. https 는 공개키 기반의 인증 기술을 활용하여 브라우저(클라이언트)와 서버가 통신하는데 있어서 외부에서 침투할 수 없는 채널을 만들어주는 기술이지 사전에 악의적인 사용자가 서버측에 대한 탈취를 한 경우에는 큰 소용이 없습니다. 소위 맨 인더 미들 어택(MITM, Man In The Middle Attack)과 같은 것들이 그런 사고를 지칭합니다. 때문에 공개키 기반이라는 특성을 활용하여 SSL/TLS Handshake 를 하는 과정에 일종의 검증 절차를 넣어 그런 사고를 줄이고자 하는 것이 OCSP (Online Certificate Status Protocol) 입니다.


출처 : WWDC 2016 - 애플 시큐리티 세션


OCSP 는 기본적으로 클라이언트와 서버가 통신하는데 있어서 인증서를 발행한 사업자, 소위 CA (Certificate Authority) 라고 불리우는 회사의 서버를 통해 내가 접속하고자 하는 서버가 올바른 서버인지를 확인하는 절차입니다. 이 배경에는 각 CA 가 인증서를 발급하는 과정에 취하고 있는 다양한 확인 절차가 있습니다. 이 절차를 통해 발급된 인증서는 믿을 수 있다는 전제하에 클라이언트가 서버로 부터 전달받은 인증서를 발급자에게 "유효하고 정상적인 인증서인가?"를 질의하는 절차입니다.


문제는 안그래도 SSL/TLS Handshake 로 https 통신을 시작하기 위한 비용과 시간이 큰 편인데 CA 의 서버까지 컨택하고 와야 하니 딜레이가 더 커지면서 웹 사이트나 서비스 이용에 안좋은 영향을 끼치기 시작했다는 점입니다. 여기에 더하여 CA 의 서버가 과부하 등으로 제대로 응답하지 못하거나 이슈가 생긴 경우에는 OCSP 가 제대로 진행되지 못하는 상황이 발생할 수 있다는 것이 확인되었습니다. 그래서 이런 절차를 조금더 단순화하면서도 보안을 여전히 보장해보자 하는 관점에서 등장한 것이 OCSP Stapling 입니다.


출처 : WWDC 2016 - 애플 시큐리티 세션


OCSP Stapling 은 "스테이플링" 이라는 이름에서 보이는 것처럼 인증서가 유효하다는 정보를 클라이언트가 접속하고자 하는 서버가 CA 의 인증 서버를 통해 확인받고 이 정보를 사용자에게 인증서를 전달할때 같이 주는 방식입니다. 클라이언트가 글로벌에 분포된 불특정 다수의 사용자라고 하면 서버는 상대적으로 훨씬 적은 수라는 점에서 CA - 서버간의 통신이 이슈가 될 상황이 훨씬 적을거라는 추정이 가능합니다.



저작자 표시 비영리
신고
Posted by 노피디

티스토리 툴바