먼저, HTTP에 대해서 알아보자. HTTP란 HyperText Transfer Protocol의 약자로써, 풀어서 설명하면하이퍼텍스트(HyperText)를 전송(Transfer)하기 위해 사용되는 통신 규약(Protocol)이다. 즉, 인터넷에서 HTML과 같은 문서를 사용자 컴퓨터에 설치된 웹 브라우저가 웹 서버에 요청할 때의 규칙이라고 할 수 있다.
HTTP 서버는 기본 포트인 80번 포트에서 서비스 대기 중이며, 클라이언트(웹 브라우저)가 TCP 80 포트를 사용해 연결하면 서버는 요청에 응답하면서 자료를 전송한다. HTTP는 정보를 텍스트로 주고 받기 때문에 네트워크에서 전송 신호를 인터셉트 하는 경우 원하지 않는 데이터 유출이 발생할 수 있다. 이러한 보안 취약점을 해결하기 위한 프로토콜이HTTP에 S(Secure Socket)가 추가된 HTTPS이다.
TLS
Transport Layer Security의 줄임말. 과거 SSL에서 발전하며 이름이 변경 된 것이다. 하지만 아직도 SSL이란 명칭이 많이 사용되고 있다.
- 공개키(Public Key)와 비밀키(Private Key): 공개키는 모두가 볼 수 있는 키이며 비밀키는 소유자만이 가지고 있는 키로 암/복호화에 사용된다.
- 대칭키 암호화: 서버와 클라이언트가 암호화/복호화에 동일한 비밀키를 사용하는 방식, 키를 공유하는데 어려움이 있으나 속도가 빠르다.
- 비대칭키 암호화: 서버와 클라이언트가 암호화/복호화에 각각 다른 비밀키를 사용하는 방식, 공개키를 통해서 암호화를 하고 비밀키를 통해서 복호화를 한다. 공개키는 공개해도 상관없으니 키 관리에 어려움이 없으나, 속도가 느리다.
- 인증기관(Certificate Authority, CA): 클라이언트가 접속을 요청한 서버가 의도한 서버가 맞는지 인증해주는 역할을 하는 보증된 기업들이다. 클라이언트는 서버에 요청을 해서 CA가 발급한 인증서를 받은 뒤 CA의 공개키로 복호화하여 신뢰할 만한 인증서인지 검증한다. CA의 공개키로 복호화되는 자료는 오직 CA의 비밀키로 암호화한 경우밖에 없기 때문에 복호화되면 신뢰할 만한 것이다.
HTTPS의 장단점
- HTTPS는 웹사이트의 무결성을 보호해준다. 웹 사이트와 사용자 브라우저 사이의 통신을 침입자가 건드리지 못하도록 한다. (침입자라함은, 악의가 있는 공격자는 물론이고, 합법이지만 통신에 침입하여 페이지에 광고를 삽입하는 경우도 해당한다.)
- 가벼운 웹 서핑이라면 HTTP도 상관없지만, 사용자의 정보를 웹 서버와 주고 받아야하는 경우라면 HTTP는 정보 유출의 위험성을 갖게 된다. HTTPS는 침입자가 웹사이트와 사용자 사이의 통신을 몰래 수신하는 것을 방지함으로써 보안을 강화해준다.
getUserMedia()
를 통한 사진 촬영이나 오디오 녹음, 프로그레시브 웹 앱과 같은 강력한 웹 플랫폼 신기능들은 실행하려면 사용자의 명시적인 권한 허락을 필요로 한다.- 지오로케이션
- API와 같은 오래된 API들도 실행할 때 권한이 필요하도록 업데이트되고 있는데, HTTPS는 이러한 새 기능과 업데이트된 API에 대한 권한 허락을 가능하게 한다.
- 네이버, 다음은 물론이고 구글 역시 검색 엔진 최적화(SEO: Search Engine Optimization) 관련 내용을 HTTPS 웹사이트에 대해서 적용하고 있다. 즉, 키워드 검색 시 상위 노출되는 기준 중 하나가 보안 요소이다.
- 모든 사이트에서 텍스트를 암호화해서 주고 받으면 과부하가 걸려 속도가 느려질 수 있다. 중요한 사이트는 HTTPS로 관리하고, 그렇지 않은 사이트는 HTTP를 사용한다.
- HTTPS를 지원한다고 해서 무조건 안전한 것은 아니다. 신뢰할 수 있는 CA 기업이 아니라 자체적으로 인증서를 발급할 수도 있고, 신뢰할 수 없는 CA 기업을 통해서 인증서를 발급받을 수도 있기 때문이다.
동작방식
SSL은 대칭키 방식과 비대칭키 방식을 적절히 섞어서 사용하면서 신뢰도를 높인다. 그 좋은 비대칭키 방식을 놔두고 대칭키를 혼용하여 사용하는 이유는 비대칭키의 방식이 컴퓨터에 과부화를 주기 때문이다. 그래서 처음에는 비대칭키를 사용해 대칭키를 공유한 후에 대칭키를 이용해 데이터를 주고 받는다. 세션이 종료되면 사용한 대칭키를 폐기하는 방식으로 보안성을 높인다.
- 클라이언트가 서버에 접속하기 위해 클라이언트가 생성한 랜덤 데이터(1)를 서버에 보낸다.
- 서버는 클라이언트에게 서버가 생성한 랜덤데이터(2)와 CA에서 발급받은 인증서를 보낸다. 인증서가 필요한 이유는 서버가 신뢰할 만한 서버인지 확인하기 위함이다.
- 클라이언트는 그 인증서를 받아 CA의 공개키로 복호화 한다. 인증서를 복호화 하면 접속하려는 사이트의 정보와 사이트의 공개키가 들어있다.
- 랜덤데이터1과 랜덤데이터2를 조합하여 대칭키로 사용할 것인데 이는 탈취당하면 안되기 때문에 인증서에 들어있던 공개키로 암호화하여 서버에 전송한다.
- 서버는 가지고 있는 비밀키를 이용해 복호화하여 클라이언트가 보낸 대칭키를 얻는다.
- 이후 그 대칭키를 통해 데이터를 주고 받는다.
- 세션이 종료되면 대칭키를 폐기한다.