HTTP
- HTTP는
Hyper Text Transfer Protocol
로 서버와 클라이언트 모델에 따라 데이터 (hypertext)를 주고 받기 위한 통신 규약
이다.
- 어플리케이션 레벨의 프로토콜로 TCP / IP 위에서 작동한다.
- 상태를 가지고 있지 않은
stateless
프로토콜이다.
- 암호화가 되지 않은 평문 데이터 전송 프로토콜이기 때문에 HTTP로 민감한 정보를 보내면 제 3자가 조회할 수 있다(=
보안에 취약
하다). => 이때문에 HTTPS가 등장하게 된다.
- 80번 포트를 사용한다.
- method, path, version, headers, body로 구성되어 있다.
HTTPS
-
HTTPS는 Hyper Text Transfer Protocol over SSL
의 약자로 신원 확인 및 키 교환을 위해 SSL인증서
가 추가되어 보안이 강화
된 HTTP이다.
SSL은 Secure Socket Layer의 약자이며, 클라이언트와 서버간의 통신을 CA (Certificate Authority) 가 보증해주는 인증서이다. CA는 엄격하게 공인된 기업들만 CA가 될 수 있다.
-
모든 HTTP 요청은 암호화되어서 보내진다.
-
HTTP는 TCP / IP 위에서 동작했지만, HTTPS는 TCP위에 놓인 SSL 보안계층 SSL 위의 HTTP이다.
-
443번 포트를 사용한다.
SSL에서 사용하는 암호화의 종류
- 대칭키 방식 :
- 암호화/복호화 시, 같은 키 사용.
- 보내는 쪽, 받는 쪽 모두 같은 키 가지고 있어야한다.
- 전달하는 과정에서
키가 유출되면 암호의 내용을 복호화할 수 있어 위험
하다.
- 공개키 방식 :
- 암호화 / 복호화 시 다른 키 사용
- A키로 암호화 진행 시 B키로 복호화 vice versa
- 두 키 중 하나를 개인키(주인만 가지고 있다)로 지정하고, 하나는 공개키(누구나 가질 수 있는 키)로 지정할 수 있다.
- 공개키는 SSL안에 들어있다.
- 개인키기는 호스트만 알 수 있다.
- 공개키 암호화 방식은 계산이 느려 속도가 미세하게 더 느릴 수 있다.
보내는 쪽(공개키) -> 받는 쪽(개인키)
- 개인키를 가진 수신자만 데이터에 접근 할 수 있어 보안이 중요한 경우에 사용
보내는 쪽(개인키) -> 받는 쪽(공개키)
- 송신자가 보낸 데이터의 신뢰성 보장이 필요한 경우에 사용
SSL 인증서를 통해 우리는..
- 통신 내용이 노출되거나 변경되는 것을 막을 수 있다(중간자 공격 방지)
- 신뢰할 수 있는 서버인지 확인 가능
- SSL 통신에 사용할 공개키를 클라이언트에게 제공된다.
데이터 제공자의 신원을 확인하고 보장받는 것이 왜 중요할까?
클라이언트와 서버 사이에서 공격자가 요청 및 응답 데이터를 탈취한 후 변조해서 다시 전송하는 공격인 중간자 공격
에 취약하게 된다. => 따라서 데이터를 암호화 시키는 작업이 필요하다.
정리
- HTTP는 클라이언트와 서버가 데이터를 주고 받는 통신 규약(프로토콜)
- TCP와 IP 위에서 작동
- HTTP는 암호화가 되어있지 않은 데이터를 전송하는 프로토콜이기 때문에
중간자 공격 (=데이터 탈취와 변조 위험)
을 받을 수 있어 보안에 취약함
- 그래서 HTTPS가 등장.
- 여기서 S는 Secure 또는 SSL(Secure Socket Layer)라고 한다.
주고 받는 정보가 암호화
되어 있음을 뜻한다.
- TCP와 IP 그리고 SSL 위에서 작동한다.
- SSL은 CA가 보증해주는 인증서이다.
- 암호화 종류에
대칭키 방식
과 공개키 방식
이 있다.
- 대칭키 방식 : 암호화와 복호화시
같은 키 사용
. 보내는 쪽과 받는 쪽 모두 같은
키를 가지고 있어야한다. 전달하는 과정에서 키가 유출되면 암호의 내용을 복호화 가능
(=위험하다
)
- 공개키 방식 : 암호화 복호화 시
다른 키 사용
. 한 키로 암호화하면 한 키로 복호화하는 방식이다. 데이터를 안전하게 전달해주고, 데이터 제공자 신원 보장을 해준다.
프로젝트에서 HTTPS를 사용했는데 어떻게 적용했는지?
HTTPS 배포를 하기 위해서 클라이언트단에선
- AWS의 Certificate Manager를 이용해 SSL 인증서를 발급받고
- 443 포트를 열어주고
- S3과 CloudFront와 연동을 한 후
- CloudFront에 SSL 인증서를 적용을 했다.
- Custom Domain도 설정했다.
- Route53을 이용해 CloudFront에 배포한 웹 호스팅 도메인과 Custom Domain을 연결한다.
- 그리고 S3과 CloudFront에 CORS 세팅을 했다.
S3 (bucket policy)와 CloudFront (origin setting & behavior (캐싱 처리방식 변경)