이번에 이슈가된 http와 https차이가 뭔가요?
이번에 우리나라가 https인가를 접속 못하게 막는다는 얘기를 들었는데요 이게무슨차이가 있나요?
기본적으로 http는 80포트 https는 443포트를 사용합니다.
HTTPS는 소켓 통신을 할 때 일반적인 텍스트 대신, 사람이 알아볼 수 없는 특수문자로 데이터를 주고받죠.
https://search.naver.com/search.naver?where=nexearch&sm=tab_jum&query=네이버+므므
이런식으로 보여지지만 내부에선 아래와 같이 주고받죠
위 링크를 눌러보시면 네이버 므므 라고 검색이 될 것입니다.
https는 기관의 인증서를 발급을 통해 홈페이지에서 https를 사용할 수 있고SSL나 TLS 프로토콜을 통해 세션 데이터를 암호화 해서 사용합니다.
크롬에서 http를 보면 이 사이트는 보안 연결(https)을 사용하지 않았습니다.
크롬에서 https를 보면 이 사이트는 보안 연결(https)을 사용하였습니다.
라고 뜨죠 보안연결을 사용을 했다는 것은 암호화 해서 주고받았다는 뜻이고 사용하지 않았다는 것은 암호화를 안했다는 거죠
크롬에서는 주소만 쓰더라도 https 설정이 되어있으면 자동으로 https로 진행이 됩니다.
그리고 https 웹사이트에서는 http로 된 다른 웹사이트의 api를 받아오려고 하면 보안문제로 걸러집니다.
아래 링크를 통해 그림과 함께 이해를 해보시는 것도 좋겠습니다.
HTTPS와 HTTP의 차이는 암호화를 해서 브라우저와 웹서버간의 통신을 안전하게 암호화하느냐의 차이라고 보시면 됩니다. 그렇다면 암호화의 방식을 말씀드려야 하는데.. 전체 흐름만 말씀드리자면 대략 다음과 같습니다.
데이터 암호화는 대칭키 암호화 기법을 사용합니다.
구체적인 암호화 알고리즘 이름까지는 이야기하지 않겠습니다. 대칭키 암호화는 암호화할때의 키와 복호화할때의 키가 같은 겁니다.그래서 이 키를 비밀키라고도 합니다. 송신자, 수신자(여기서는 웹서버와 브라우저)만 알아야할 뿐 외부로 유출되어서는 안되는 것을 말합니다. 암/복호화 속도가 빨라서 대량의 데이터 전송시에 유리합니다. 하지만 비밀키(대칭키)를 어떻게 송수신자 안전하게 나눠가지냐의 문제가 있습니다. 이 과정을 키교환이라고 부르는데 이것을 안전하게 할 방법이 필요합니다.
그래서 키교환은 비대칭키(공개키) 암호화 알고리즘을 사용합니다.
이것도 구체적인 알고리즘명을 말하지는 않을 겁니다. 이것은 공개키(Public Key)로 암호화를 하고 개인키(Private Key)로 복호화하는 방법입니다. 수신자(웹서버)는 공개키와 개인키 쌍(이것을 Key Pair 라고 합니다)을 만들어 자신에 데이터(대칭키)를 보낼 송신자(브라우저)에게 보냅니다. 송신자는 공개키로 대칭키를 암호화하여 전송하고 수신자는 개인키로 복호화하여 대칭키를 안전하게 교환하는데 성공하게 됩니다.
하지만 한가지 문제가 생겼습니다. 공개키를 전송하는 과정중에 네트웍의 경로에 끼어들어 공개키를 왜곡해서 전송하여 데이터를 도청할 수 있는 방법이 있는 겁니다. MITM 공격(Man-in-the-middle) 이라고 하는 방법입니다. 이 취약점은 공개키가 누구의 것인지 확인할 방법이 없다는 것입니다. 그래서 공개키를 안전하게 확인할 방법이 생겼습니다.
그 결과로 신뢰할 수 있는 인증 기관의 서명이 첨부된 인증서라는 것을 사용하게 되었습니다.
웹서버의 관리자는 서버의 공개키와 개인키 쌍을 만든 후 공개키에 대한 인증서를 만들기 위해서 신뢰할 수 있는 인증기관에 요청합니다. 인증기관에 인증서가 등록되고 서명이 추가되어 인증서가 발급되면 서버의 관리자는 이것을 웹서버에 등록해 HTTPS 서버를 구성합니다. 웹브라우저가 HTTPS로 요청하면 이 인증서를 먼저 수신하게 되고 인증서의 서명을 확인하는 방법으로 인증서와 공개키를 비롯한 인증서의 등록시의 정보들의 무결성, 신뢰성을 검증합니다.
정리하자면 다음과 같습니다.
데이터를 암호화하기 위해 대칭키 암호화 기법 사용
대칭키를 안전하게 교환하기 위해 공개키 암호화 기법사용
공개키의 신뢰성을 검증하기 위해 신뢰할 수 있는 인증기관의 서명이 추가된 인증서 사용하여 검증
더 자세한 내용은 아래 주소를 확인해보세요.
https://opentutorials.org/course/228/4894
그리고 저거슨님이 말씀하신 %EB%84%A4%EC%9D%B4%EB%B2%84+%EB%AF%80%EB%AF%80 문자열로 나타나는 부분은 암호화가 아니며, HTTPS, HTTP 양쪽 모두에서 사용하는 URL Encoding 이라는 기법입니다. 이 문자열을 Chrome 브라우저에서 개발자 도구를 열고 Console 화면에서 decodeURIComponent("....") 와 같이 ....부분에 위 문자열을 넣고 직접 실행하면 네이버+므므 라고 나타날 겁니다. 이것은 URL의 전체 경로 형태로 특수문자나 기호를 전달할 수 없기 때문에 형태를 바꾼(Encoding한) 것으로 보면 됩니다. encodeURIComponent("....")로 인코딩하고 decodeURIComponent("....") 로 디코딩합니다. 혹시 오해하실까봐 추가로 적었습니다.