Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.

기술 뉴스 #67 : 16-12-02

웹개발 관련

  • 한국어와 웹 폰트에 관한 6.1가지 사실 : 김태곤 님이 블로그의 테마를 정리하면서 웹 폰트 최적화 작업을 하고 발견한 사실을 정리한 글이다. 한글의 웹 폰트 용량이 큰 문제를 해결하기 위해 사용한 최적화 작업과 윈도에서 깨지는 문제 등 한글 웹 폰트를 처리할 때 알아두어야 할 내용이 잘 정리되어 있다. 이런 폰트 문제는 일일이 테스트해보지 않으면 확인하기 어려우므로 이런 글을 아주 유용하다.(한국어)
  • HPACK: the silent killer (feature) of HTTP/2 : HTTP/2에서 헤더를 압축하는 HPACK에 대해서 설명하는 글이다. HPACK의 Static Dictionary, Dynamic Dictionary, Dynamic Dictionary, Huffman Encoding이 어떻게 동작하고 있으며 왜 다른 압축알고리즘보다 안전한지를 설명하고 실제로 헤더가 어느 정도 줄어드는지를 보여주고 있다.(영어)
  • How we switched our template rendering engine to React : Pinterest가 기존에 사용하던 Jinja 템플릿 엔진을 React로 교체하는 과정을 설명한 글이다. 서버에서는 Python으로 Jinja를 쓰고 클라이언트에서는 Jinja와 호환되는 Nunjucks로 렌더링하다가 React로 갈아타기로 했지만 기존에 영향을 주지 않기 위해서 Jinja를 걷어버리고 Node.js로 서버와 클라이언트 모두 Nunjucks로 렌더링할 수 있게 구성하고 그 가운에 성능과 오류를 막기 위해서 진행한 과정이 잘 나와 있다. 이제 React로 간다고 글은 끝난다.(영어)

그 밖의 프로그래밍 관련

  • 유니크 아이디는 얼마나 길어야 하나? : 개발할 때 종종 사용하는 uuid의 길이는 어느 정도로 해야 같은 키를 다른 사용자가 발급받을 수 있는지 분석한 글이다. 보통은 경우의 수만 따져서 충분히 긴 길이를 사용하지만, 이 글에서는 이 문제를 birthday problem과 비교해서 실제로 같은 uuid를 가지게 될 확률을 계산하는 법을 보여주고 있다. 무심코 하던 일의 내부를 이렇게 자세히 설명해 주는 글은 항상 재미있다.(한국어)
  • 누군가에게는 빼빼로데이. 누군가에게는? : 배달의 민족에서 빼빼로데이에 치킨할인 이벤트를 하면서 11시에 급격히 사용자가 몰리는 이벤트를 진행하기 위해서 Node.js 서버와 Redis로 이벤트용 시스템을 별도로 구성한 과정을 설명하고 있다. 이렇게 급격한 트래픽증가는 대응하기가 쉽지 않은데 시스템 구성과 실수했던 부분까지 정리되어 있다.(한국어)
  • 확장하기 쉬운 코드가 아니라 삭제하기 쉬운 코드를 작성하자 : 제목 그대로의 내용을 설명하는 글이다. 이 글을 본다고 이런 설계를 할 수 있는 것은 아니고 그 정도를 조정하는 게 중요하겠지만, 최근에도 재사용성보다 나중에 레거시가 되거나 사용 안 하는 부분이 나왔을 때 잘 떼어내서 버릴 수 있도록 하는 설계에 좀 더 관심이 있어서 공감되는 글이다.(한국어)
  • Announcing pydoc.io beta : Read the Docs에서 PyPI 패키지에서 자동으로 API 문서를 생성할 수 있는 pydoc.io을 발표했다.(영어)

IT 업계 뉴스

볼만한 링크

  • 카카오 빅데이터의 발견: 카카오택시 : 카카오에서 카카오 택시를 이용하는 로그로 사용패턴을 분석했다. 빅데이터를 이용한 백서를 출간하기 전에 미리 일부를 공개한 4편의 글로 사람들이 어떻게 카카오택시를 이용하고 있고 어디서 많이 사용하는지 기존에 택시에서는 알지 못했던 정보로 카카오가 어떤 분석을 하고 있는지 볼 수 있다.(한국어)
  • 페이스북, 챗봇 분석도구 출시 : 페이스북의 챗봇의 사용패턴을 분석할 수 있는 챗봇 분석 도구를 공개했다.(한국어)

프로젝트

  • Blueprint : React로 만든 웹용 UI 툴킷.
  • Dash for iOS : API 문서를 볼 수 있는 Dash의 iOS 버전이 오픈소스로 공개되었다.
  • Gmvault : Gmail 백업/복구 도구.
  • CyberChef : hex, base64 등의 인코딩, 암호화, 압축 등의 기능을 모아놓은 웹사이트
  • CSS Reference : Flexbox, animation, background 등 CSS의 속성이 실제로 어떻게 표시되는지 보여주는 사이트.
  • Visual Studio for Mac : Visual Studio의 MacOS용 preview로 버전이 출시됐다.
  • React Native Express : 코드를 수정해보면서 React Native를 배워볼 수 있는 웹사이트.
  • ESLint Compare : ESLint로 JavaScript를 린팅할 대 템플릿으로 사용하는 Airbnb와 ESLint-Recommend, Standard가 어떤 규칙을 적용하는지 비교표로 만들어진 페이지

버전 업데이트

2016/12/02 11:20 2016/12/02 11:20

Travis CI에서 RSA 키 사용하기

Travis CI에서 테스트를 작성하다 보면 공개되면 안 되는 정보를 담아야 하는 경우가 있다. 대표적으로 API 키나 Access Token 등이 있는데 Travis에서는 travis encrypt라는 명령어로 특정 환경 변수를 암호화해서 저장할 수 있게 제공하고 있다. Travis가 개인/공개키를 만들어서 암호화해서 저장한 뒤에 CI에서 테스트를 실행할 때 복호화해서 사용할 수 있게 해준다.

그래서 암호화를 하는 경우 보안 문제로 Pull Request 등에서는 사용할 수 없게 된다. 이 때문에 암호화를 하면 Pull Request에서는 테스트를 제대로 돌릴 수가 없게 되는데 이에 대해서는 이전에 쓴 Travis CI의 환경변수로 실행환경 검사하기에 자세히 설명해 놓았다. 어쨌든 현재 암호화를 한 경우 Pull Request에서 테스트를 실행하지 못하는 문제를 해결할 방법은 현재 없다.

Travis CI에서 암호화된 파일 사용하기

Travis CI에서는 Encrypting Files라는 문서에서 파일을 암호화하는 방법을 설명하고 있다. 파일 암호화도 방법은 앞에서 설명한 문자열 암호화와 같으므로 Pull Request에서는 복호화를 할 수 없다.

먼저 gem install travis로 travis cli를 설치한 후 travis login로 로그인을 한다. Hello World라는 secret.txt 파일이 있다고 한다면 travis encrypt-file로 파일을 암호화할 수 있다.

$ travis encrypt-file secret.txt
encrypting secret.txt for outsideris/travis-test
storing result as secret.txt.enc
storing secure env variables for decryption

Please add the following to your build script (before_install stage in your .travis.yml, for instance):

    openssl aes-256-cbc -K $encrypted_95f9db25c60a_key -iv $encrypted_95f9db25c60a_iv -in secret.txt.enc -out secret.txt -d

Pro Tip: You can add it automatically by running with --add.

Make sure to add secret.txt.enc to the git repository.
Make sure not to add secret.txt to the git repository.
Commit all changes to your .travis.yml.

실행하고 나면 암호화된 secret.txt.enc 파일이 생성된다. 위 안내를 보면 .travis.ymlbefore_install 부분에 openssl aes-256-cbc -K $encrypted_95f9db25c60a_key -iv $encrypted_95f9db25c60a_iv -in secret.txt.enc -out secret.txt -d를 추가해 주라고 나오는데 이 부분이 Travis에서 테스트를 실행할 때 복호화를 해주는 명령어다. --add 옵션을 추가해주면 자동으로 .travis.yml 파일에 위 내용을 넣어준다.

$ travis encrypt-file secret.txt --add
encrypting secret.txt for outsideris/travis-test
storing result as secret.txt.enc
storing secure env variables for decryption

Make sure to add secret.txt.enc to the git repository.
Make sure not to add secret.txt to the git repository.
Commit all changes to your .travis.yml.

이제 수정된 .travis.yml파일과 secret.txt.enc파일을 커밋하면 된다. 이때 암호화되지 않은 secret.txt파일은 절대로 추가하면 안 된다.

Travis 로그에서 암호화된 파일과 복호화한 후의 내용을 출력

이제 Travis에서 파일의 내용을 출력해 보도록 설정해서 확인해 보면 secret.txt.enc는 암호화되어 있지만 openssl aes-256-cbc -K $encrypted_95f9db25c60a_key -iv $encrypted_95f9db25c60a_iv -in secret.txt.enc -out secret.txt -d를 실행한 뒤 만들어진 secret.txt는 원래 입력한 Hello World로 복호화된 것을 볼 수 있다.

Travis CI에서 RSA 키 사용하기

위에서는 단순히 파일을 암호화했지만, 문자열을 암호화하는 대신 파일을 암호화해야 하는 경우는 많지 않다. 대부분은 RSA 키 같은 비밀키를 암호화하는 경우라고 생각된다. 가장 간단한 예로는 GitHub private 저장소에 특정 모듈을 올려두고 공개 저장소에 올리지 않은 채 가져오려고 하는 경우이다. 비공개 모듈이므로 공개 저장소를 이용할 수도 없고 GitHub 저장소를 공개로 바꿀 수 없으므로 SSH 키를 이용해서 가져와야 한다.(private 저장소 등을 사용하는 방법도 있지만, 이 관리도 만만치 않은 일이고 여기도 접속 정보는 필요하다) 이외에도 사내 특정 환경으로 인한 SSH 접속해서 정보를 가져오는 게 테스트 환경에 포함될 수 있다. 아주 흔한 일은 아니지만, 충분히 가능한 일이다.

RSA 비밀키를 Travis에 올리는 것은 위험한 일이지만 Travis에 사용할 목적으로 만든 파일이라고 가정하고 id_rsa파일이 있으면 위의 파일 암호화 과정을 거쳐서 id_rsa.enc파일을 만들고 Travis에서 이 파일을 복호화해서 원래의 id_rsa파일을 생성할 수 있다.

Travis CI는 Circle CI처럼 SSH 접속이 안 돼서 이 부분에서 고생을 한참 했는데 일반적인 Unix 환경처럼 .ssh폴더 아래 적절한 권한으로 만들어서 SSH를 사용할 때 해당 키를 사용하도록 설정하면 된다.

before_install:
  - openssl aes-256-cbc -K $encrypted_95f9db25c60a_key -iv $encrypted_95f9db25c60a_iv -in id_rsa.enc -out id_rsa -d
  - mv id_rsa ~/.ssh/id_rsa
  - chmod 600 ~/.ssh/id_rsa
  - eval $(ssh-agent -s)
  - ssh-add ~/.ssh/id_rsa

위는 .travis.yml에서 설정한 내용인데 id_rsa파일로 복호화한 뒤 ~/.ssh/id_rsa로 복사해서 권한 설정을 하고 관련 SSH 환경변수를 설정하고 나서 ssh-add로 키를 사용하도록 등록한 것이다.

이제 이후 관련 모듈 설치나 테스트에서 SSH 접속을 할 때 이 비밀키가 필요한 곳이 있을 때 정상적으로 사용할 수 있다.

2016/11/29 10:09 2016/11/29 10:09