첫 페이지부터 HTTPS

첫 페이지부터 HTTPS를 쓰지 않는 것이 얼마나 위험한가에 대해 이야기해 보겠다. 지난 글 "표준화에 대해서"에서는 HTTPS와 같은 표준화를 만들어야 되느냐 아니냐에 대해 이야기했다면 이번엔 이미 그 표준 사용에 모두가 동의했다고 가정한다.

문제

첫 페이지부터 HTTPS를 사용하지 않으면 중간자에 의해 sslstrip 공격을 당할 여지가 있다. 이 공격에 대해 간단히 말하면,

  1. 사용자가 HTTP 페이지를 요청 (로그인을 요하는 사이트는 대부분 HTTP로 요청해도 곧 HTTPS로 리다이렉트 되기 때문에 사용자는 별 생각이 없음)
  2. 중간자가 로그인 창을 HTTP로 보여 줌
  3. 사용자가 비밀번호를 입력
  4. 중간자가 비밀번호를 가로챔

즉, 사용자가 브라우저 주소창 옆 자물쇠와 주소 자체에 유심히 신경쓰지 않으면 어느샌가 중간자에게 내 비밀번호를 줄 수 있다는 것이다. sslstrip 공격용 툴이 이미 공개되어 있어 실제 공격을 보여주는 여러 동영상도 쉽게 찾아 볼 수 있다.

여기서 문제는 사용자가 처음에 HTTP 페이지를 요청한 것에 있다. 처음부터 HTTPS 페이지를 요청했으면 브라우저가 먼저 암호화된 연결 구축을 시도하기 때문에 적어도 sslstrip 중간자 공격에는 안전하다는 것이 대다수의 의견이다.

나는 안전한가? 나는 과연 첫 페이지부터 HTTPS를 사용할까? 아마 이 생각을 지금 처음 했다면 당신은 아마 안전하지 않았을 것이다.

나는 브라우저 주소창에 https://를 직접 쓰지 않았다. 이는 매우 성가신 일이다. 특히 모바일 폰에선. 예를 들어 페북에 들어간다고 하면 주소창에 facebook.com을 치고 바로 엔터를 누른다. 이렇게 접속을 시도했을 때 브라우저는 처음에 HTTP 요청을 날린다. 아래의 그림을 보라. 주소창에 프로토콜 없이 주소만 넣었을 때 비록 최종적으로 HTTPS 페이지로 리다이렉트 되긴 했지만 첫 요청은 HTTP였음을 알 수 있다. 중간자가 공격할 수 있는 틈이 생긴 것이다.

위험한 시작

도움

이에 대한 완전한 해결책은 아마도 안전하지 않은 HTTP 페이지의 전멸 또는 주소창에 https:// 직접 쓰기 정도가 되겠다. 하지만 이는 현실적으로 어렵거나 귀찮으므로 그나마 보안에 도움을 줄지도 모르는 방법을 소개한다.

sslstrip 공격의 존재를 처음 알았을 때 든 생각은 브라우저 주소창에 주소를 넣고 엔터를 쳤을 때 기본으로 HTTPS 프로토콜을 사용하도록 하면 덜 위험하지 않을까 하는 것이었다. 브라우저 부가 기능으로 만들어 볼까 했지만 이미 그런 일을 하는 부가 기능이 있다. 심지어 엄청 많다. HTTPS Everywhere라던가 Smart HTTPS라던가. 그들의 기능은 대략 비슷하므로 비교는 생략하고 사용하는 그림을 보면 아래와 같다. 앞에서와 같이 주소창에 프로토콜 없이 주소만 넣고 엔터를 쳤지만 첫 요청이 HTTPS임을 알 수 있다.

안전한 시작

주의. 다시 한 번 이야기 하지만 이 방법은 해당 부가 기능의 동작 방식에 따라 완전한 해결책은 아닐지도 모른다. 은행과 같이 중요한 사이트에 접속할 땐 모든 HTTP 연결을 금지하거나 https://를 포함하는 모든 주소를 직접 적도록 하자.

중간자 공격을 안 당하면 되는 것 아닌가?

맞는 말이다. 중간자 공격을 안 당하면 된다. 사실 그게 가능하다면 굳이 HTTPS 암호화 통신을 할 필요도 없다. 근데 그게 생각보다 쉽지 않다.

일단 포기하라. 중간자는 항상 있다고 생각하는 것이 맘 편하다.


추가: 난 여러 부가 기능 중 HTTPS by default를 사용하기로 했다. 주소창에 명시적으로 http://라고 적지 않으면 항상 https://로 접근하는 부가 기능이다. 안전하고 싶을 때 더 신경쓰는 것이 아닌, 안전하지 않을 때 더 신경쓰는 방식이다. 난 이것이 말이 되는 것 같다.


추가: "HTTPS by default" 사용을 중지했다. 솔직히 안전도 중요한데 너무 불편하다. 정말이지. 좋은 방법 없을까?

2017-03-13 씀.