본문 바로가기

Computer science/Web

HTTP와 HTTPS는 무엇이 다를까?

HTTP(Hypertext Transfer Protocol)

Hypertext = 사용자에게 내용의 비순차적 검색이 가능하도록 제공되는 텍스트. 문서 내의 특정한 단어가 다른 단어나 데이터베이스와 링크되어 있어 사용자가 관련 문서를 넘나들며 원하는 정보를 얻을 수 있음. 

 

Http는 인터넷에서, 웹 서버와 사용자의 인터넷 브라우저 사이에 문서를 전송하기 위해 사용되는 통신 규약을 말합니다.

여기서 문서는 하이퍼텍스트 문서를 의미한다. 즉 영어 그대로 하이퍼 텍스트를 전송하는 규약입니다. 

우리가 웹 사이트를 검색할 때 http://www.google.com을 입력할 때 www.google.com 이 hypertext이다. 앞의 http는 www.google.com을  http통신 규약으로 처리하라는 뜻입니다.

 

그렇다면 우리가 http://www.google.com을 을 주소창에 입력하면 어떤 일이 일어나는 것일까요?

더보기

1. 우선 http를 본 브라우저는 뒤의 www.google.com이 http 통신 규약으로 처리돼야 한다는 것을 압니다. 

2. 이제 DNS(Domain Name Service)에서 www.google.com에  에 해당하는 IP주소를 요청합니다. 

3. IP 주소를 반환받으면 해당 IP주소로 요청을 보냅니다. http가 앞에 있기 때문에 http에 맞추어 요청을 보냅니다.

GET /index.html HTTP/1.1 - 헤더

Host: google.com - 호스트

- 공백 -

요청은 이런 모습일 겁니다. 

4. 서버(요청을 받은 IP)는 해당 요청에 대한 응답을 클라이언트(우리)에게 보냅니다.

5. 서버가 보낸 응답은 보통 html 파일입니다. 우리는 이 html 파일을 이용해 브라우저에 홈페이지를 그릴 수 있습니다. 

6. 받은 html 파일을 분석해 DOM tree와 CSS Object Model을 생성하고, 이 둘을 이용해 Render Tree를 생성합니다.

7. Render Tree를 이용해 화면을 렌더링(그립) 니다. 

HTTP의 문제점

HTTP에는 보안에 문제가 있습니다. 

HTTP는 서버에서 클라이언트로 데이터를 보낼 때, 데이터를 암호화하지 않습니다. 따라서 데이터가 유출됐을 때 비밀번호, 계좌정보 등의 민감한 정보가 그대로 유출됩니다. 

출처: 위시켓 블로그 blog.wishket.com/http-vs-https-%EC%B0%A8%EC%9D%B4-%EC%95%8C%EB%A9%B4-%EC%82%AC%EC%9D%B4%ED%8A%B8%EC%9D%98-%EB%A0%88%EB%B2%A8%EC%9D%B4-%EB%B3%B4%EC%9D%B8%EB%8B%A4/

HTTPS(Hypertext Transfer Protocol Secure)

이 문제를 해결한 게 HTTPS입니다. HTTPS는 영어 뜻 그대로 안전한 HTTP입니다. HTTPS는 SSL(Secure Socket Layer)을 사용해 보안 문제를 해결했습니다. 

출처: SK인포섹(주) 공식블로그 https://blog.naver.com/skinfosec2000/222135874222

위 그림처럼 응용-전송 계층 사이에 보안 계층을 포함시키는 겁니다. 따라서 보안 계층을 거쳐 전송되는 자료들은 HTTP, FTP(File Transfer Protocol), SMTP(Simple Mail Transfer Protocol) 상관없이 안전하게 데이터를 전송할 수 있습니다. 

위에서 봤듯이 https에서는 비밀번호 abc123을 xyaerXzbc로 암호화했었습니다. 그렇다면 어떻게 abc123이 xyaerXzbc가 될 수 있었고, xyaerXzbc를 받았을 때 어떻게 원래 비밀번호가 abc123이었다는 것을 알 수 있을까요?

 

공개키(비대칭키)와 비공개 키(대칭키) 알고리즘

HTTPS에선 대칭키를 이용해 위의 비밀번호를 암호화한 후 전송합니다.

 

더보기

양방향 알고리즘은 암호화한 데이터를 복호화할 수 있는 방법이고,

단방향 알고리즘은 암호화한 데이터를 복호화할 수 없는 방법입니다.

 

대칭키(비공개 키)와 비대칭키(공개키)는 대표적 양방향 알고리즘입니다.

대칭키는 암호화화 복호화에 사용하는 키가 동일합니다. 따라서 키가 유출되면 안 됩니다.

반면 비대칭키는 암호화에 사용하는 키와 복호화에 사용하는 키가 서로 다릅니다.

비대칭키 중 공개한 것을 공개키, 공개하지 않은 것을 개인키라고 합니다.

 

단방향 알고리즘으로는 Hash 방식(SHA-256)이 있습니다.

비밀번호를 DB에 저장할 때 단방향 알고리즘을 사용합니다.

 

대칭키는 암복호화 속도가 빠르다는 장점이 있지만 키가 유실되면 누구나 암호를 복호화할 수 있게 된다는 문제점이 있습니다. 이 단점을 개선한 방법이 비대칭키 방법입니다. 하지만 비대칭키는 암복호화 속도가 느리다는 단점이 있습니다. 따라서 많은 정보를 주고받을 때는 대칭키를 쓰고 싶다는 유혹이 생깁니다. 따라서 HTTPS에서는 대칭키와 비대칭키를 모두 사용해서 빠르면서도 안전한 데이터 전송 방법을 구현합니다. 

 

결론부터 이야기하면 비대칭키를 이용해 대칭키를 암호화하여 전송하는 방법입니다.

대칭키의 문제는 키를 전송할 때 키가 유출될 수 있다는 것에서 시작합니다. 그렇다면 이 키를 암호화해서 키를 안전하게 전송할 수 있다면 어떨까요? HTTPS에서는 바로 이 방법을 사용합니다.

 

HTTPS 웹사이트는 모두 SSL 인증서를 가지고 있습니다. SSL 인증서에는 공개키가 포함되어 있습니다. 따라서, 이 공개키를 이용해 암호화한 데이터는 서버에 저장되어 있는 개인키를 이용해서만 복호화할 수 있습니다. 이제 클라이언트는 대칭키(Session Key)를 만들고 공개키로 암호화하여 서버에게 보냅니다. 

 

이제 xyaerXzbc가 어떻게 서버에서 abc123으로 변환되는지 알 수 있겠죠?

바로 대칭키(Session Key)를 이용해 복호화 하는 것입니다!

반대로 서버에서 클라이언트로 내려주는 데이터도 대칭키를 이용해 암호화, 복호화할 수 있습니다.

 

더보기

SSL 핸드 셰이크로 세션 키를 만드는 과정

1. 클라이언트는 서버에게 자신의 브라우저가 지원할 수 있는 암호화 방식을 먼저 제시하고, 랜덤 데이터를 생성하여 전송합니다.

2. 서버는 클라이언트가 지원하는 암호화 방식 중 한 가지를 고릅니다. 서버도 랜덤 데이터를 생성하여 전송합니다.

3. 클라이언트는 주고받은 데이터를 참고하여 세션 키를 만듭니다.

4. 세션 키를 이용해 암복호화를 빠르게 진행합니다.

 

그 외에... 

HTTPS를 사용하는 웹사이트와 데이터를 주고받을 때 모든 데이터를 암호화하는 건가요?

아닙니다. 대칭키 방식이 공개키 방식보다 빠르다고는 했지만 여전히 암복호화하는데 시간이 추가로 필요합니다. 이 말은 서버가 해야 하는 일이 늘어난 다는 것을 의미하고, 서버가 해야하는 일이 늘어나면 서버가 한 번에 받을 수 있는 요청의 양이 줄어들게 된다는 말입니다. 따라서, 암호화는 민감한 정보를 전송할 때만 해도 충분합니다.

 

세션 키는 안전할까요?

대칭키는 키가 노출되면 어떤 좋은 알고리즘으로 암호화를 해도 소용이 없다고 했습니다. 그렇다면 대칭키인 세션키는 유출될 수가 없는 걸까요? 아닙니다. 세션 키도 유출될 수 있기 때문에 한 세션에서만 사용할 수 있습니다. 보통 한 세션을 30분 정도로 설정하기 때문에, 30분 이후에는 새로운 세션 키가 필요합니다. 다만 장시간 사이트를 이용할 때는 매번 세션 키를 만드는 과정이 번거롭기 때문에 세션키를 갱신하여 사용합니다.

 

 

 

 

참고

암호화 양방향, 단방향, 공개키(비댕칭키), 비공개키(대칭키) 개념/분류 알고리즘 정리

출처: 
https://javaplant.tistory.com/26 [자바공작소]