[개발일지] 22년 38주차 - https

FeRo 페로·2022년 9월 25일
0

이번 주는 모의면접을 준비하면서 CS 공부를 많이 했다. 혼자하기 보다는 하나의 주제를 정해서 서로 발표를 하는 기회가 있으면 더 좋을 거 같아서 스터디를 만들었다. 내가 맡은 부분은 https였다. 공부를 하다 보니까 이전에 대칭키, 비대칭키에 대한 것도 다시 공부해 볼 수 있었다. 오늘은 공부한 내용을 정리해 보도록 하겠다.

https?

https 전에 http

O, 이게 숫자 0, 한글 ㅇ, 영문자 O 중 무얼 나타내는지를 알려면 이게 한글인지, 영어인지, 숫자인지를 알아야 한다.
얄팍한 코딩사전

위 예시처럼 http 역시 인터넷에서 우리가 어떤 방식으로 소통을 할 건지에 대한 약속이다. headers와 body가 있고 거기에는 뭐가 들어가는지에 대한 약속인 것이다. 이걸 url 앞에 http라고 써주면서 소통한다고 명시해 주는 것이다.

http의 단점은 암호화가 되지 않는다는 것이다. 우리가 로그인을 한다고 한다면 서버에 id와 pw가 전달될 탠데, http를 통해서 서버와 통신을 하면 중간에서 제 3자가 탈취했을 때 내 id, pw가 그대로 노출된다.

http + secure = https

https는 보안이 되는 http이다. 두 가지 부분에서 보안이 된다고 할 수 있다.

  1. http처럼 id, pw가 그대로 서버에 전달되는 것이 아니라 암호화가 되어서 서버에 전달해 준다.
  2. 해당 사이트가 믿을 만한 사이트인지를 보장해 준다.

첫 번째는 바로 이해하겠지만 두 번째 부분은 피싱 사이트를 예로 들 수 있다. 구글이 아니라 구굴이라는 피싱 사이트에 우리가 접속했는데 그게 피싱 사이트인지 모르고 로그인을 하면 그대로 개인정보가 노출된다. 하지만 피싱 사이트인지를 미리 알 수 있다면 이런 사고를 예방할 수 있다.

http 사이트로 접속하거나 https가 제대로 작동되지 않는 사이트에 접속을 하면 url 창에는 위와 같은 경고 메시지가 뜬다. 이것을 통해서 이 사이트가 신뢰할 만한 사이트인지를 알 수 있는 것이다.

하지만 여기서 의문이 들 수 있다. "어떻게 이게 그 사이트의 신뢰성을 보장해 주지?"

대칭키, 비대칭키

여기서 알아야 하는 것이 대칭키와 비대칭키이다. 다음 스텝에서 설명할 CA와 SSL를 이해하기 위해서는 이 두 가지 종류의 키를 꼭 알아야 한다.

대칭키

먼저 대칭키를 알아보자. 예를 들기 위해서 영문자와 숫자로 대칭되는 암호화 테이블을 만들어 보자.

1 = A
2 = P
3 = L
4 = E

위와 같은 규칙이 있다면, apple이라는 단어를 12234라고 암호화를 할 수 있다. 이 암호를 주고 받는 상대도 같은 암호화 테이블을 가지고 있다면 12234를 복호화 해서 apple이라는 걸 알 수 있다.

대칭키는 이와 같은 방식이다. 서로 같은 키를 가지고 그 키를 넣고 일련의 알고리즘을 거치면서 암호화와 복호화가 되는 것이다. A키로 암호화 된 것은 A키로만 복호화를 할 수 있다는 것이다.

대칭키 방법은 키가 탈취만 되지 않으면 안전한 방식이다. 하지만 최초에 통신을 할 때 서로 키를 주고 받는 과정에서 탈취가 당해버린다면 제 3자도 중간에서 통신 내용을 확인할 수 있다.

비대칭키

이런 방식을 보완하기 위해서 1970년대 훌륭한 수학자들이 고안한 방식이 비대칭키 방식이다. 비대칭키라는 이름대로 이 방식은 키가 두 개 있다. 하나는 서버에 숨겨져 있어서 개인키라고 부르고, 다른 하나는 유저들에게 공개하기 때문에 공개키라고 부른다. 그래서 비대칭키는 공개키 방식이라고도 불린다.

대칭키와 다르게 비대칭키는 A키로 암호화를 하면 B키로만 복호화를 할 수 있다. 반대로 B키로 암호화를 하면 A키로만 복호화를 할 수 있다. 그렇기 때문에 유저가 공개키로 암호화를 해서 서버에 보낼 때 서버 안에 있는 개인키로만 복호화를 할 수 있기 때문에 누군가 탈취를 한다고 해도 내용을 볼 수가 없다. 비대칭키의 방식은 대칭키 보다 더 복잡하기 때문에 컴퓨터의 자원을 훨씬 더 많이 소모한다.

이렇게 비대칭키를 통해서 위에서 말한 첫 번째 요소를 충족한다고 하면 두 번째 요소, 이 사이트가 신뢰할 만한 사이트라는 것은 또 어떻게 증명할 수 있을까? 이 부분을 해결해 주는 것이 CA와 SSL이다.

HTTP에 CA의 SSL을 더해 구현되는 HTTPS

CA는 certification authority, 즉 인증기관을 말한다. CA는 엄격한 과정을 거쳐서 인증이 된 기관인데 이 기관이 하는 일은 믿을 만한 회사들에게 SSL인증서를 주는 것이다. 이런 간단한 정보를 바탕으로 어떤 순서로, 그리고 어떤 방식으로 비대칭키를 써서 https 통신이 이루어 지는지를 알아보자.

저 진짭니다. 진짜라고요!

네이버나 구글 같은 곳은 CA에서 진짜라고 인증을 해준다. 그런 인증을 SSL인증서를 통해서 하는데 이 인증서도 CA서버의 개인키로 암호화가 되어있다. 이 인증서에는 네이버나 구글의 공개키가 들어있다.

똑똑똑, 공개키 왔습니다.

최초에 클라이언트와 서버가 통신을 할 때 먼저 핸드 셰이크를 한다. 클라이언트에서는 랜덤한 문자열을 생성해서 서버로 넘기면, 서버 역시 랜덤한 문자열과 함께 이 SSL인증서를 클라이언트에 전달해 준다.

얘 진짜야?

브라우저에는 CA 공개키가 내장되어 있다. 이 CA 공개키로 SSL인증서가 풀린다면, 해당 사이트는 인증된 기관이라는 것을 증명함과 동시에 해당 사이트의 공개키를 유저에게 전달할 수 있다.

위 과정을 통해서 클라이언트와 서버는 안전하게 비공개키를 주고 받을 수 있음과 동시에 인증된 사이트라는 것을 증명할 수 있다.

매번 비대칭키를 쓸 순 없다.

하지만 앞서 말했다시피 이렇게 비대칭키 방식은 컴퓨터의 자원을 더 많이 소모한다고 했다. 특히나 우리가 간단하게 서버와 통신을 한다고 해도 주고 받는 기본적인 string이 꽤 있는데, 이걸 매번 비대칭키로 암호화와 복호화를 한다고 하면 컴퓨터가 힘들어 할 것이다. 그래서 보통은 대칭키를 통해서 암호화를 한다.

대칭키는 탈취 당하면 소용 없잖아요?

그래서 대칭키를 주고 받을 때 비대칭키를 사용한다. 이렇게 듣고 나면 무슨 소리인지 이해가 안될 것이다.
우리가 맨 처음에 핸드 셰이크를 할 때 랜덤한 문자열을 클라이언트와 서버 양 측에서 생성해서 주고 받았었다. 클라이언트에서는 이제 이 두 문자열을 혼합해서 어떤 임시 키를 만든다.
그리고 이 키를 네이버, 구글의 공개키를 이용해서 암호화를 한 후 서버로 보내면 양쪽에서는 일련의 과정을 거쳐서 대칭키를 만든다. 이렇게 대칭키를 공개키를 통해 암호화 해서 주고 받으면 중간에 탈취된다고 해도 그 대칭키가 노출될 일이 없다.

즉, 결과적으로 대칭키와 비대칭키는 양쪽의 취약점을 서로가 보완하는 형식으로 https를 구현하는 것이다.

마치며

사실 예전에도 얄팍한 코딩사전님의 영상을 통해서 https에 대한 공부를 했었다. 이걸 본다고 끝은 아니지만 큰 그림은 그린 느낌? 그때도 보고서 '음.. 그렇구나' 정도였지 남에게 설명할 수 있는 정도까진 아니었다. 하지만 이번에 복습을 하면서 다양한 레퍼런스도 찾아보고 정리해 보면서 https에 대해 더 깊게 이해할 수 있게 됐다.

참고자료
https://www.youtube.com/watch?v=H6lpFRpyl14
https://www.digicert.com/kr/what-is-ssl-tls-and-https
https://velog.io/@2dh2wdk/%EC%95%94%ED%98%B8%ED%99%94-%EB%B0%A9%EC%8B%9DAES-SHA
https://velog.io/@jaymee/SSL
https://velog.io/@moonyoung/HTTPS의-원리

profile
주먹펴고 일어서서 코딩해

0개의 댓글