글쓰기 메뉴

Rails 모든 연결 SSL 로 변경하기 + Nginx Redirect

nginx 에서 http 접속을 https 로 리디렉션 시키던지 Rails 에서 모든 연결에 ssl 을 적용하는 등의 설정을 하면 됨. 이건 별도의 글


Let's encrypt 와 EFF 그리고 여러 스폰서들과 개인기부자들 덕분에 간단하게 SSL 을 적용했으니 이제 모든 http 연결을 ssl 로 돌려보자.


Rails 에서는 Controller 단위에서 force_ssl 을 사용할 수도 있고 보다 와이드하게 전체 설정에서 다룰 수도 있다.

씬디는 https 변경에 다른 별 이슈가 없기때문에 config/environments/production.rb 에 force_ssl 을 설정했다.


Rails.application.configure do
  ...
  config.force_ssl = true
  ...
end


이렇게 설정하면 route 룰을 포함해 모두 ssl 연결로 변경된다.


NginX 나 Apache 등을 리버스 프락시로 구성하여 백단에 서버들에게 넘겨준다면 다음의 헤더를 반드시 포함시켜야한다.


proxy_set_header X-Forwarded-Proto $scheme;


Rack 서버는 1) 443 포트로 연결되었는지 2) ENV['HTTPS'] 값이 "on" 인지 3) X-Forwarded-Proto 헤더가 "HTTPS" 인지 3 가지를 보고 판단하기 때문에 리버스 프락시 뒤에 있는 puma 나 unicorn 등은 443 포트가 아닌 다른 포트나 유닉스소켓으로 통신하기 때문에 HTTPS 연결인지 확인하지 못하고 계속 리디렉션 시키게 된다.


NginX 나 Apache 단에서 301 리디렉션으로 연결 프로토콜을 변경할 수도 있겠다.


80 포트를 수신하는 서버 설정을 넣고 해당 설정에서는 http 를 https 로 변경하여 리디렉션시키면 443 을 리스닝하고 있는 아래의 설정이 요청을 수신하게 된다. 


...
  server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name synd.kr www.synd.kr;
    return 301 https://synd.kr$request_uri;
  }
  server {
    ...
    listen 443 ssl;
    ...
  }
...

  

끝.


연결된 글
1 1
Square

SSL 인증서 설치 및 적용
스마트폰 ssh 접속으로 5분만에 완료?!!?!
그것도 무료??!!?!??!

이건 누구의 얘기도 아닌 제 얘기. 제가 씬디에 https 를 적용하기 않고 버틸 수 있던 합리적(!) 이유들.

하지만 계속 눈에 밟히는....
그리고 괜시리 갖고 싶은 녹색 자물쇠
그리고 오늘.. Let's encrypt 와 EFF 의 Certbot 으로 인증비용없이 뻥안치고 스마트폰으로 5분만에 SSL 도입 끝.
물론 후속 설정들과 이미지, 외부 소스 등에 대한 url 점검과 설정이 필요했지만 이건 레알 신세계.
근데 이거 나만 몰랐어???
불과 몇달전에도 클라한테 인증서 구매시키고 서버세팅했었는데???
블로그 참 열심히 하시는 존경스러운 outsider 님이 2015년에 베타를 경험했던 포스팅은 여기.
이후 EFF 에서 Certbot 에 Apache, Nginx 등의 소프트웨어와 서버 OS 를 플러그인으로 개발하면서 지금은 서버설정까지 Certbot 이 완료시켜주고 있음.
설치는 EFF Certbot 페이지에 가서 자신의 서버와 웹서버를 선택하면 나오는 메뉴얼대로 (대략 5 ~ 7 커맨드) 하면 끝.
난 심지어 지하철에서 스마트폰으로 ssh 연결해서 설정 끝냈음. ㅇㅇ
내 케이스는 nginx / ubunt 14.04 LTS 로 실제 설치 커맨드 히스토리는 아래와 같음. 아래가 전부임.
이렇게 하면 1) 이메일 주소 입력하세요. 2) 이메일 수신 OK? 3) (서버레벨에서 확인된 도메인 중) 어떤 도메인 쓸꺼임? 4) https 만 씀? 80도 같이 씀? 이렇게 4개 물어보고 답하면 된다.
이후에 nginx 에서 http 접속을 https 로 리디렉션 시키던지 Rails 에서 모든 연결에 ssl 을 적용하는 등의 설정을 하면 됨. 이건 별도의 글로 작성.
이제 Let's encrypt 라는 회사를 살짝 알아보자.
리눅스 재단 (Linux Foumdation) 과의 협력프로젝트라고 사이트 상단에 '이미지'가 박혀있는데 어떤 관계인지는 확인하지 못했다.
ISRG 라는 캘리포니아의 기업에서 "HTTP" 보안이 기업들과 사용자들의 비용절감에 직간접적인 도움이 된다는 생각으로 시작했다고한다.
기본적으로 ACME (인증관리자동화환경) 을 보고 있고 실제로 해당 목적을 훌륭하게 수행하는 솔루션이 있다. letsencrypt 에서 개발하다가 현재는 EFF 에서 개발하고 있으며 패키지이름은 Certbot. 인증절차 및 인증서 설치 이후 갱신을 "명령어 하나로" 처리해준다.
SSL CA 로 중요한것은 얼마나 많은 주효한 클라이언트가 이를 인증된 CA 로 받아들이는가 하는 부분인데 해당 목록은 이곳 링크에서 확인할 수 있고 파폭 2.0+, 크롬, 익스 XP3+, 엣지, 안드 2.3.6+, 맥 사파리 4.0+, iOS 사파리 3.1+ 등등 그냥 믿고 사용해도 되는 수준이다.
또 하나는 letsencrypt 의 생존력인데.. 인증서가 무료다보니 기업의 유지가능성도 살펴보는게 좋겠다.
기업 스폰과 기부금으로 운영되는 것으로 보이며 공식홈페이지에서 스폰서들은 소개하고 있다.
문서상으로 년간 30만불(3년유지) 또는 35만불을 지원하는 플래티넘 스폰서는 mozilla, Akamai, SISCO, EFF, OVH, chrome 등의 6개사이고 그 외 IdenTrust,  포드재단, 페이스북, 디지털오션, 볼터, 쇼피파이 등 다수의 스폰서들이 있다.
역시나 결론은 그냥 믿고 쓰면 되겠군이라는 결론 ㅋㅋ
EFF 는 Electronic Frontier Foundation 의 약자로 한국위키 이름이 "전자 프런티어 재단" 이다.

뭔가 틀리진 않았지만 우습달까?
EFF 는 '디지털 월드' 에서 사용자들의 자유를 지키기 위해 1990년 설립된 비영리 재단으로 블루 리본 캠페인도 여기서 시작했다고 한다.
물리적으로는 관계되기 힘든 연결고리 없는 사람들과 조직이 어느날 나에게 직접적으로 혜택을 주는 일들이 많아지는게 참 재밌고 고마울 뿐이다.

진짜 고마우면 Donate! 
Support Let's encrypt
Support EFF Certbot
어디서 왔지?
[["synd.kr", 41], ["www.google.co.kr", 78], ["www.google.com.ph", 2], ["www.google.co.jp", 3], ["unknown", 135], ["www.google.com", 3]]
다른 글들
0 0

rbenv 새로운 버전의 루비 설치하기

설치가능한 루비 버전의 목록은 아래처럼 확인할 수 있지
$ rbenv install --list
목록에 없는 최신 릴리즈의 Ruby 를 설치하려 할 때 rbenv 를 업데이트하면 되지. (Git 버전)
이렇게 하고 설치가능 목록을 다시 확인하면 따단~ 하고 새로운 릴리즈가 떠야하는데 새로운 버전의 루비가 목록에 없는 경우가 있어. 그럴땐 ruby-build 를 업데이트해주자.
잘 될꺼야.
1 1

Encoding
UndefinedConversionError

URL 에 한글 제목을 추가한 뒤로 페이스북 공유 시 500 Internal error 가 자꾸 발생하는거지. Facebook 디버거에서 해당 URL 복사해서 스크랩해보면 문제없이 긁어지고... 인코딩에러는 Ruby 1.9 때 지겹게 겪었고 이젠 관련 에러를 만나기 힘들정도로 두루두루 안정적인 상태인데 이렇게 불현듯 재회.
아무튼 고치긴 고쳐야지. 에러로그 첫 5줄을 보니 이렇더군.
구글에 대고 이렇게 검색 "active support json encode UndefinedConversionError"
검색결과 첫 글이 레일즈 이슈 티켓. 올커니 제대로군! 클릭하고 살펴보니 activesupport-json_encoder gem gem 을 설치하라더군
설치했더니 만사 OK!
이거 작년 Rails 4.1.0 부터 있었던 이슈인데 난 왜 오늘에야 만났을까...
0 0

Rails4, Elasticsearch
관계 모델 및 Method 인덱싱

searchkick 이나 tire(retire) 등을 사용하지 않고 elasticsearch-model 을 사용하는 경우 mapping 을 사용해 인덱스를 설정할 수 있다.
내 경우엔 다국어 사용을 위한 store 컬럼들과 관계모델의 컬럼들, 그리고 일부 메쏘드를 인덱스에 포함시켜야했다. - 아마 모두가 비슷하겠지.
간단하게 as_indexed_json 을 오버라이드하고 인덱스 재성성 ㄱㄱ
해시와 배열이 뒤섞여 있어 좀 거지같아 보이지만 직접 해보면 이해가 쉽다.
1 0

레일즈, 엘라스틱서치 필드 값 유무 쿼리

특정 필드의 값이 있거나 없는 조건을 쿼리할 때 _missing_ 과 _exists_ 를 사용할 수 있다.
title 값이 있고 published_at 값이 없는 질의를 Query String 으로 짜면 아래와 같다.
0 0

Nginx 301 리디렉션 설정

301 리디렉션은 URL 의 영구이전을 의미한다. www.synd.kr 이 synd.kr 로 301 리디렉션 된다면 www.synd.kr 로 인덱싱된 콘텐츠는 모두 synd.kr 로 변경된다는 의미다.
도메인을 이전하거나 선호도메인을 설정하는 경우 이용될 수 있으며 Nginx 환경에서는 아래처럼 같단히 설정할 수 있다.
끝.
1 0

레일즈4 어플리케이션 이름 변경

2.x 버전에서 어플리케이션 이름 변경해봤었는데 '아, 그냥 프로젝트 새로 만들고 소스 카피가 좋겠다' 라는 생각이 들 정도로 변경해야 할 파일의 갯수가 찝찝한 기분을 지울 수 없었지.
그 이후로 한참 그럴 필요가 없었는데 이번에 기존 소스를 카피할 일이 생겼지.
레일즈 4.1.x 이상의 버전에서 단 2개의 파일에만 어플리케이션의 이름이 지정되어 있더군. 깔끔하게 정리된겨.
config/application.rb 파일에서 module 이름을 변경하고,
config/initializers/session_store.rb 파일에서는 세션 스토어의 키 이름만 변경해주면 끝!

수고하고 있는 루비 커뮤니티에 축복을! ㅋㅋ
+)
3버전이나 4.0.x 버전에서는 https://github.com/get/Rename 을 사용해서 깔끔하게 변경가능.
참고)
https://stackoverflow.com/questions/20988813/how-to-rename-rails-4-app/23753608#23753608?newreg=15907dbe38c743fa9f7aca841050ba57
1 1

Trix Editor 변경 작업 중단

누가 궁금할까 싶지만 에디터 변경을 예고한 적이 있고 작업을 중단했기 때문에 글을 남겨놔야지.
Trix 로 에디터 변경을 원했던 이유는 당연히 안정적인 입력을 위해서였지만 약 3일에 걸친 작업 끝에 다음과 같은 이유로 작업을 중단했다.
1. 2bytes 입력에서 몇가지 문제가 확인됨. 
- Trix 는 라인브레이커로 br 을 사용하고 div나 pre, figure 등의 블럭 엘리먼트가 들어오면 새로운 "블럭"을 만드는데 새로운 블럭의 첫 단락에서 확정적으로 자모음이 깨진다.
- Trix 는 contentEditable 을 사용해 IME 의 입력내용을 캐치하고 Trix::Document 를 생성하는데 2bytes 의 경우 한 글자를 위해 여러번의 키스트로크가 발생할 수 있기 때문에 글자의 순서가 변경되는 문제가 간혹 발생한다.
- 같은 이유로 입력된 글자를 contentEditable에 재출력할 때  다른 블럭으로 캐럿이 점프되는 경우가 있다.
2. 기존 사용하던 에디터의 안정성이 확보됐다.
- 사용 중이던 에디터가 갑자기 엄청난 숫자의 버그들을 쏟아냈으나 약 2달에 걸쳐 대부분의 버그가 수정됐다.
- 입력된 콘텐츠가 날아가는 치명적인 문제가 남았지만 원인을 찾을 수 있었고 소스 핵을 통해 해당 부분 스킵. 발생되는 사이드 이펙트는 서버단에서 저장 시 처리하도록 코드 수정.
Trix 의 개발은 계속 팔로우 하겠고 의미있는 버전업이 생기면 다시 개발을 고민해봐야겠다.
0 0

제목 폰트 Noto Sans CJK 웹 폰트로 변경

Noto Sans CJK 폰트는 구글과 어도비가 만든 폰트로 중국어 간체와 번체, 일본어와 한국어 폰트를 포함하고 있다. 예전에 비해 웹에서 사용할 수 있는 한국어 폰트가 꽤 많아졌지만 여전히 목마른 우리에겐 참 흐믓한 일이다. 라이센스는 Apache License, Version 2.0
하지만 다른 구글 폰트와 달리 엄청난 용량으로 google early access 에서 제공하지 않고 있는 관계로 (아니지, 왜 제공 안하는지는 나는 모르지) 웹에서는 여전히 사용하기 어려운 실정이다.
드디어 구글 폰트 얼리 억세스(Google Fonts Early Access)에서 Noto Sans KR 을 서빙하기 시작했습니다. 자세한 내용은 아래 링크를 참고하세요.
"훈민정음 반포 569돌을 맞이해서 자그마한 선물을 마련했습니다."
그! 런! 데! Coderifleman 님의 노력으로 (언급은 안하셨지만 이런 작업은 그냥 괴로운 노가다..) 매우 적당한 용량의 서브셋을 웹폰트로 사용할 수 있다.
관련된 내용이나 사용법 등이 매우 잘 정리되어 있고 Coderifleman 님의 노력에 감사하는 의미로 이 곳에서는 아무 설명없이 링크로 대체한다.
한글 웹 폰트 경량화해 사용하기
Noto Sans CJK KR 폰트 보기
Noto Sans CJK 다운로드 및 도움말 페이지
1 0
Square


Noto Sans KR 웹폰트 - 구글 폰트 얼리 억세스로 변경

구글 Noto 한국어 글꼴을 웹에서 마음껏!
구글 폰트 얼리 억세스에서 드디어 Noto Sans KR 웹폰트를 제공한다. 개인적으로 매우 기쁜일이 아닐 수 없다!!!
그간 Coderifleman 님께서 한땀한땀 작업해주신 서브셋을 서버에 올려놓고 웹폰트로 사용하고 있었다.
매우 적은 용량이지만 알 수 없는 압박감에 사용자가 없으니 트래픽도 없지 normal 과 bold weight 만 사용했었는데 이번 Early Access 에서 제공하는 Noto Sans KR 은 6가지 굵기를 지원한다니 기쁘지 아니한가!

유니코드 한글 11,172 자와 완성형 한글 코드(KS_X_1001), 옛한글이 포함되어 있으며 한자는 포함되어 있지 않다. 
원래 있었는지 이번에 같이 추가됐는지 모르겠는데 한글 뿐 아니라 Noto Sans JP 와 Noto Sans SC(간체, 번체는 언제...) 도 제공하고 있으니 글로벌 서비스에서 마구마구 써줘야겠다.
css 파일에 다음의 라인을 추가
1 0

건의사항 반영 - 0922

맥에서 나눔이나 말근(맑은) 고딕 꼴보기 싫다는 말에 반박할 수 없어서 맥에서 "sans-serif" 만으로 설정.
justify 설정을 에디팅 시 끌 수도 없고 케바케로 더럽게 보인다는 점 반박할 수 없어서 수정.
백스페이스로 이전 페이지 이동되버리는 문제... Turbolinks 끔 (아 진짜 터보링크 계륵!)
글 수정 시 완료 버튼에 표기되는 명칭을 "수정 완료"로 변경
이상.
나머지는 또 다음에~ 여러분 안늉~!
0 0

UFW 방화벽 사용하기 - 우분투 14.04

UFW 는 iptables 의 설정 도구로 Uncomplicated Firewall 이란 뜻이며 문자 그대로 복잡하지 않은 방화벽 설정을 위해 사용된다.
서버는 어떤 목적이든, 공인 IP가 있든 없든 외부에서 접근이 가능하다면 보안 위험에 노출될 수 밖에 없다. IDC 레벨이나 네트워크 구성에서 하드웨어/소프트웨어 방화벽이 이미 사용되고 있을 수 있지만 그런 경우에도 각 서버의 방화벽 설정은 매우 유용하다(고 생각한다)
이런 목적으로 사용하기에 iptables 가 매우 적합하나 설정과 관리가 꽤나 복잡하여 나 같은 사람은 필요할 때 검색으로 룰을 설정했다가 어느 순간 뭔가 동작이 이상하면 iptables 전체를 내려버리는 괴상한 방식으로 운영하게되니 계륵이 아닐수가...
그런 의미로 UFW는 신세계! 방화벽이 미적용된 서버가 있다면 당장 UFW를 올려보자!
설치
기본 정책 설정 (들어오는 패킷은 차단, 나가는 패킷은 허용)
ssh, http, https 허용 (ssh 포트를 변경해서 사용한다면 반드시 직접 포트를 입력하자)
포트를 변경해 사용하거나 특정 포트를 허용
방화벽 ON!
위의 명령을 실행하면 "현재 ssh 연결에 문제가 생길 수 있습니다. 적용하시겠습니까?" 뭐 이런 질문이 나온다. ssh 포트는 허용으로 변경했으니 "y" 를 입력해 진행할 수 있다.
확인
ufw 가 실행되고 있지 않다면 아래와 같은 결과가 리턴된다.
방화벽을 끌 때는 아래와 같은 명령어를 입력한다
등록된 규칙을 삭제할 때는 2가지 방법이 있다.
첫번째는 등록 시 사용한 규칙을 그대로 입력하는 방법
두번째는 각 규칙의 번호를 확인하고 번호로 지우는 방법
등록된 규칙의 번호는 줄 맨앞에 있는 [숫자]
2번 규칙 80/tcp 를 지우려면
새로운 규칙의 추가는 동일한 방식으로 가능하다
포트 뒤에 tcp 나 udp 를 지정할 수 있고 지정하지 않는다면 모두 적용된다
새로운 설정을 적용하려면 disable > enable 해도 좋고 아래와 같이 reload 가 가능하다
특정 IP만 허용할 경우 
특정 IP에게 특정 포트만 허용할 경우
포트의 범위를 규칙으로 사용할 경우
특정 아이피에만 일정 범위의 포트를 tcp 패킷만 허용할 경우
서브넷을 특정 포트에 허용할 경우
이 정도면 내가 써봤던 명령어는 다 정리한 것 같다.
1 2

손님 글쓰기 차단해제

숨 쉴 시간이 부족해서 신디에 손을 못대고 있던 중 "운전면허, 졸업증명 위조" 등에 관한 스팸이 무작위로 막 올라오더군요.
스팸등록 봇에 대해 더하기 문제라는 최소한의 방식으로 대응하고 있었는데 답을 변경해도 간단하게 다시 등록하는걸 보면 운전자가 사람이란걸 알 수 있네요.
아무튼 그래서 recaptcha 를 연결했습니다.
댓글은 아직 더하기 문제만이 적용되어 있고 손님의 글쓰기에만 적용했습니다.
또 어떤 스패머들이 활동하게될지 궁금하네요.