저번시간에 여기서 웹의 시초격 통신 프로토콜이라고 볼 수 있는 HTTP에 대해서 알아보았습니다.
그런데 막상 웹페이지를 방문해보시면 http보다는 https로 시작하는 주소가 더 많이보이고, 주소가 http로 시작하는 경우에는 안전하지 않다는 경고를 찾아볼 수 있습니다. 왜 이런걸까요??
오늘은 이 http와 https의 차이에 대해 알아보겠습니다!
HTTP의 특징
HTTP에서는 여기에서 이미 한번 설명을 했었죠. 하지만 한번더 간단하게 HTTP의 특징에 대해 요약을 하겠습니다
- 클라이언트-서버 방식: 클라이언트가 서버에 요청을 보내고 응답을 받는 형식
- 무상태성(stateless): 서버측에서 클라이언트의 상태를 유지/저장하지 않음
- 비연결성/연결성
- 초기버전 HTTP/1.0 이전: 비연결지향, 한번 요청/응답을 받으면 연결을 끊어버림. 서버의 부담은 줄이지만 계속 연결을 맺고 끊을때마다 오버헤드가 발생할 수 있음. keep-alive 옵션을 header에 포함시키면 연결상태 유지 가능
- 현재 HTTP/1.1 이후: 지속 연결, 명시적으로 연결을 종료하지 않는 이상 TCP 연결 유지
HTTP 요청 메시지 구조
HTTP 통신으로 서버에 요청시에는 위와 같은 구조로 메시지를 보냅니다
크게 3가지로 나뉘어져있습니다.
- start line: HTTP 메소드 + Request 타겟(주소) + HTTP 버전으로 이루어진 라인
- headers: request에 대한 추가 정보(addtional information)를 담고 있는 부분
- body: 전송하는 데이터를 담는 부분 (핵심부분)
HTTP의 보안문제
자 통신 프로토콜이 생겨서 규약대로 전송하는건 좋은데... HTTP는 아주 큰 보안적인 약점이 존재했습니다. TCP 방식의 전송으로 보내는 것에 대해서도 여기서 다뤘었죠. 데이터를 패킷으로 나누어서 보내게 되는데 문제는 이 패킷을 가로채는게 가능하다는 것입니다. 그리고 HTTP 통신은 보내는 내용을 암호화하지 않습니다.
따라서 누군가 패킷을 가로채면 통신하는 내용을 그대로 볼 수 있게되는 것이죠. 그냥 일반적인 통신이면 모르겠지만 로그인, 회원가입 등등 개인정보를 다루는 곳에서도 웹은 서버와 통신을하기 때문에 개인정보가 그대로 노출되어버리는 경우가 생겨버리는 것입니다.
HTTPS의 등장
그래서 등장한것이 바로 HTTPS입니다! 맨끝에 S는 Secure(보안)을 뜻하죠. 기본적으로 80번 포트를 사용하는 HTTP와는 다르게 HTTPS는 443포트를 사용합니다.
자 HTTPS는 어떻게 보안을 지킬 수 있을까요?
대칭키/비대칭키 암호화
HTTPS는 대칭키와 비대칭키 암호화 방식을 모두 사용하고 있습니다.
- 대칭키 암호화: 클라이언트와 서버가 동일한 키를 사용해서 암호화/복호화 (연산속도 빠름, 하지만 키가 노출되면 위험)
- 비대칭키 암호화: 1개의 쌍으로 구성된 공개키와 개인키를 암호화/복호화에 사용 (연산속도 느림, 하지만 키가 노출되어도 비교적 안전)
**공개키: 모두에게 공개가능한 키
**개인키: 나 자신에게만 발급된 키 (노출되면 안됨)
HTTPS는 보안을 위해 이 대칭키, 비대칭키 방식을 적절하게 섞어서 사용을 합니다.
HTTPS 연결 과정
- 클라이언트가 서버에 최초 연결 시도
- 서버는 공개키(엄밀히 말하면 인증서 - 비대칭키)를 클라이언트에게 줌
- 클라이언트는 공개키의 유효성을 검사하고 session key 발급
- 클라이언트는 공개키로 session key를 암호화 하여 서버에 전달
- 서버는 개인키로 암호화된 session key 복호화
- 이제 클라이언트가 서버가 같은 session key를 공유하기 때문에 데이터 전달시 데이터를 session key로 암호화/복호화
이렇게 되면 정확히 연결대상끼리만 세션 키를 공유하고 암호화/복호화를 할 수 있게됩니다.
그럼 모든 내용을 다 암호화하나요?
아닙니다! 위 HTTP 요청 메시지 부분에서 실질적으로 전송하려는 데이터가 존재하는 body 부분을 암호화합니다!
출처:
- [간단정리] HTTP Request/Response 구조
- [네트워크] HTTP와 HTTPS
- [Web] HTTP와 HTTPS의 개념 및 차이
'Network' 카테고리의 다른 글
[네트워크] SaltStack 이란? (0) | 2023.04.10 |
---|---|
[네트워크] 분산 서버 환경에서 세션공유 문제 해결법 (0) | 2022.11.01 |
[네트워크] TCP와 UDP (0) | 2022.11.01 |
[네트워크] OSI 7 계층, OSI 참조모델 (0) | 2022.11.01 |
[네트워크] HTTP란? (0) | 2022.11.01 |