과제

HTTP / HTTPS (SSL,TLS)

ilsancityboy 2023. 10. 14. 15:59

이번 글에서는 흔히 많이 보았던 http와 https 에 대해서 알아볼 것이다.

 

HTTP ( HyperText Transfer Protocol )

http는 인터넷을 통해 데이터를 주고받기 위한 프로토콜이다.

데이터를 평문으로 (암호화 하지 않은 텍스트) 전송하기 때문에 도청당할 수 있고 보안에 취약하다.

 

HTTPS (HyperText Transfer Protocol Secure)

https는 http 의 보안 버전으로 데이터를 암호화 하여 보호한다.

이를 위해 SSL (Secure Sockets Layer) , TLS (Transport Layer Security) 프로토콜을 사용한다.

 

SSL,TLS ?

SSL 이라는 프로토콜을 넷스케이프에서 만들었는데 어느날 표준화가 되었고 표준화가 되며 이름이 TLS로 바뀌었다.

즉, 두개는 같은것이다.

여기서 이해를 하고 가야할 개념이 있는데 바로 "대칭키" , "공개키" 이다.

 

대칭키 암호화 방식 

https://blog.naver.com/dlaxodud2388/223219067412

하나의 키를 가지고 암호화, 복호화를 할 수 있는 방식이다.

허나 이 방식의 경우 보안상 좋지 않기에 이를 해결하기 위한 방식이 공개키 암호화 방식이다.

 

공개키 암호화 방식

한 쌍의 키를 만들어내는 방식으로 "공개키"와 "개인키" 를 사용한다.

공개키로 암호화 한 경우 개인키로 복호화 할 수 있고

개인키로 암호화 한 경우 공개키로 복호화 할 수 있다.

https://blog.naver.com/dlaxodud2388/223219067412

 

 

SSL / TLS 동작 방식

이제 알고가야할 "대칭키 암호화" 와 "공개키 암호화"를 알았으니 SSL,TLS 동작 방식을 알아보자.

앞서 알아보았던 대칭키 방식과 공개키 방식 둘중 어떤방식이 SSL 이란 프로토콜에 적합할까?

 

생각해보자.

 

 

1. 대칭키 암호화 방식

먼저 서버에서 키를 건내준다.

그런데 키를 탈취당한다면?

암호화, 복호화 하는데 같은 키를 사용하는데 이 키를 탈취당한다면 암호화,복호화  하는 의미가 없을것 이다.

따라서 SSL 프로토콜에 적합한 방식은 대칭키를 사용하기보단 공개키 방식이 적합할 것이다.

 

2. 공개키 암호화 방식

서버에서는 공개키와 비공개키 두개를 가지고있고 클라이언트에게 키를 줄때는 공개키를 준다.

클라이언트에선 받은 공개키를 가지고 암호화하여 서버로 보내고 서버에서는 암호화된 데이터를 비공개키를 가지고 

복호화한다.

따라서 처음에 서버가 클라이언트에게 키를 건네줄때 사용되는 공개키는 탈취당해도 괜찮다는 뜻이다.

허나 이러한 방식으로만 서로 데이터를 주고받기에는 컴퓨터의 리소스가 많이 사용된다는 단점이 있다고한다.

따라서 가장 좋은 방법으로는 1.대칭키 암호화 방식 과  2.공개키 암호화 방식을 혼합하여 사용한다.

 

먼저 이해하기 쉽게 전체적으로 어떻게 혼합되어 사용되는지 말하자면.

1. 공개키 방식을 이용하여 "대칭키"를 주고받는다. (안전하게 대칭키를 주고받는것.)

2. 주고받은 대칭키를 사용하여 더 값싸게 서로 데이터를 통신한다.

 

좀더 자세하게 알아보자.

 

1. Client Hello

클라이언트가 서버에게 요청을 한다.

이때 랜덤한 데이터와 어떠한 암호화 방식을 지원하고 있는지 보낸다.

 

2. Server Hello 

서버가 클라이언트의 요청을 받고나서

서버도 똑같이 응답을 보낸다. 이때 응답에는

랜덤한 데이터, 클라이언트가 보낸 지원하는 암호화 방식중 하나를 지정, 인증서 를 포함하여 보낸다.

3. 받은 인증서 검증 및 복호화

클라이언트에서는 브라우저에 내장된 정보에 따라 서버로부터 받은 인증서를 CA에서 검증된 인증서인지 확인하게된다. 

(검증이 안되면 신뢰할 수 없는 페이지가 보여지게 됨)

여기서 검증이되면 브라우저에서는 검증된 인증서에 대해 공개키를 이미 갖고있기 때문에 복호화가 가능하다.

(브라우저에서는 CA의 공개키를 내장하고있음. 따라서 CA에서 검증된 인증서들은 브라우저에서 해당 인증서를 복호화 하고 서버에서 생성한 공개키를 얻게됨)

이렇게 클라이언트에서는 "공개키"를 갖게된다. 허나 아까 말했듯 서버와 클라이언트는 대칭키 방식을 사용해야 속도가 빠르고 값이 싸다고했다. 따라서 우리는 대칭키 방식을 사용하기위해 "대칭키"를 만들어 주고받기위하여 공개키방식을 사용해 안전하게 "대칭키"를 만들어내는 것이다.

 

4. Pre-master-Key 만들기

클라이언트와 서버는 맨처음 1.Client Hello , 2.Server Hello 에서 랜덤한 데이터를 서로 주고받았다.

이 데이터들을 가지고 Pre-master-Key를 만들게 된다.

대칭키를 사용하려면 암호화할때와 복호화할때 사용되는 키가 같아야한다고 했다.

그러면 클라이언트와 서버측 둘다 갖고있어야하니 클라이언트가 만든 pre-Master-Key를 대칭키로 사용하기위해

서버에 공개키 방식으로 안전하게 보내주어야한다.

 

 

5. Pre-Master-Key를 서버로 전송

클라이언트가 이미 갖고있는 "공개키"를 사용해 Pre-master-key를 암호화 하여 서버로 보낸다.

이미 비공개키를 갖고있던 서버에서는 클라이언트로부터 받은 암호화된 데이터를 비공개키로 복호화 하여 

Pre-master-Key를 얻어낸다.

6. Session Key 만들기

그 후 일련의 과정들을 거쳐 세션 키를 만들어낸다.

이 세션키를 대칭키로 사용하게 되는것.

클라이언트와 서버가 서로 빠르고 값싸며 안전하게 통신할 수 있게 된다.