일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Django
- pytest
- algorithm
- Stack
- Git
- utils
- AWS
- combinations
- stack&que
- codecov
- 백준
- permutations
- dictionary
- greedy
- was
- Gunicorn
- ORM
- Unit Testing
- Python
- ws
- Q objects
- HTTP 완벽 가이드
- stateless
- Query
- stateful
- Bruteforce
- postreSQL
- SQL
- TDD
- Programmers
- Today
- Total
해피 코딩!
TLS, SSL과 HTTPS 본문
SSL 프로토콜이 무엇인지 인지하기 위해 블로그에 작성합니다.
HTTP는 암호화되지 않은 방법으로 데이터를 전송하기 때문에 서버와 클라이언트가 주고 받는 메시지를 감청하는 것이 매우 쉽습니다. 예를 들어 로그인을 위해서 서버로 비밀번호를 전송하거나, 또한 중요한 기밀 문서를 열람하는 과정에서 악의적인 감청이나 데이터의 변조등이 일어날 수 있으며, 이를 보안한 것이 HTTPS입니다.
SSL의 개념
ssl 프로토콜은 웹 서버와 브라우저 간 보안 통신규약 입니다.
SSL프로토콜이 제공하는 기능은 크게 아래와 같이 두 가지 입니다.
- 인증: 웹 서버의 진위성을 확인합니다.
- 데이터 암호화: 암호화 키를 가지고 송수신 되는 데이터를 암호화 합니다.
SSL 인증서
SSL 프로토콜은 CA(Certificate Autority)라 불리는 제 3자 기관에서 발급된 SSL 인증서를 통해 서버와 클라이언트의 인증 및 데이터 암호화를 수행합니다.
SSL 인증서에는 두 가지 정보가 포함되어 있습니다.
- 웹 서비스의 정보: 인증서를 발급한 CA 정보, 서비스 도메인 정보 등
- 서버 public key: 서버 public key 값 및 암호화 알고리즘
SSL 공개키 알고리즘
한 쌍의 호스트가 하나의 인코딩/ 디코딩 키를 사용하는 대신, 공개키 암호 방식은 두 개의 비대칭 키를 사용한다. 하나는 호스트의 메세지를 인코딩 하기 위한 것이며, 다른 하나는 그 호스트의 메시지를 디코딩하기 위한 것이다.
인코딩 키는 모두를 위해 공개되어있으며, 호스트만이 개인 디코딩 키를 가지고 있다.
노드 X는 자신의 인코딩 키를 공개적으로 배포할 수 있다.(대부분의 공개키는 디지털 인증서 안에 있다.) 메세지를 노드X에게 보내고자 하는 누구든지 알려진 공개키를 사용할 수 있다. 각 호스트마다 누구나 사용할 수 있는 인코딩 키가 할당되어 있기 때문에 공개키 암호화 방식은 대칭 키의 쌍이 폭발적으로 증가하는 것을 파악할 수 있다.
이해가 가지 않는다면 아래 좀 더 쉽게 설명을 하였다.
공개키 암호화 방식: 인코딩과 디코딩에 다른 키를 사용하는 알고리즘
A키로 암호화를 하면 B 키로 복호화를 할 수 있고 , B 키로 암호화 하면 A키로 복호화 할 수 있는 방식
인코딩 키 (public key)는 공개되어 있으며 디코딩 키 (secret key)는 호스트만이 개인 디코딩 키를 가지고 있다.
공개키와 비공개 키의 분리는 메시지의 인코딩은 누구나 할 수 있지만, 메세지의 디코딩 비밀키는 소유자에게만 부여하여 클라이언트가 서버로 안전하게 메세지를 발송할 수 있게 해준다.
SSL 동작 원리
SSL 프로토콜은 OSI 7계층의 어느 한 계층에 속해서 동작하는 것이 아닌,
응용계층과 전송계층 사이 독립적인 프로토콜 계층을 만들어서 동작하며 이 때 응용계층의 프로토콜은 외부로 보내는 데이터를 TCP가 아닌, SSL에 보내게 되고 SSL은 받은 데이터를 암호화하여 TCP에 보낸 뒤, 외부 인터넷에 전달하게 됩니다.
전달 받을 때 역시 TCP로 부터 받은 데이터를 복호화하여 응용 계층에 전달하게 되는데 이 과정에서 Application은 SSL을 TCP로 인식하고, TCP는 SSL을 Application으로 인식하기 때문에, Application과 TCP사이의 데이터 전달 방식은 기존 전달 방식을 그대로 사용합니다.
SSL (TLS) 동작 방식
클라이언트가 서버에 접속하여 랜덤 데이터를 전송 (clinet hello)
서버가 Client hello에 대한 응답으로
Server hello
를 함 ( 이 때 인증서와 랜덤 데이터 제공)클라이언트의 브라우저에 서버에게 받은 인증서가 CA에서 발급된 것 인지 확인하고 공개키로 인증서를 복호화한다.(인증서가 믿을 수 있다고 판단한다면)
클라이언트와 서버의 각각 랜덤 데이터를 가지고 클라이언트에서
pre master secret
값을 만들어냄.(대칭키)pre master secret 값을 비대칭 키( 클라이언트가 알고 있는 공개키)를 이용하여 암호화하고 이를 서버에 보냄. 이렇게 보낸 암호화 된 값을
master secret
이라 하며 이는session key
를 만들어냄이
session key
를 이용하여 서버와 클라이언트는대칭 키
방식으로 암호화 통신을 한다.
이해하기 어렵다면
- 사용자가 웹 브라우저로 사이트에 접속하면
- 웹 서버는 인증서를 사용자에게 보낸다. (해당 인증서에는 인증기관의 개인키로 암호화된 사이트의 정보와 공개키가 들어있다.)
- 사용자는 이미 가지고 있는 인증기관의 공개키로 웹 서버에서 받은 인증서를 복호화하여 확인한다.
- 사용자는 실제 데이터의 암호화에 사용될 대칭키를 생성하고 인증서에서 꺼낸 웹 서버측의 공개키로 암호화해서 웹 서버에 보낸다.
- 웹 서버는 자신이 가지고 있는 개인키로 사용자가 보내온 대칭키를 복호화하여 얻는다. 이제 이 대칭키로 데이터를 암호화하여 데이털르 주고 받게 된다.
전자 서명
전자 서명을 통해서 누군가가 메세지를 썻는지 알려주고, 메세지가 위조되지 않았음을 알 수 있다. 전자서명은 SSL 인증서에서 서비스를 보장한다.
공개키와 비공개키는 안전한 데이터 전달 이외에도, 데이터 제공자의 신원을 보장하는데 사용이될 수 있다.
비공개 키의 소유자가 비공개 키를 이용해서 정보를 암호화 -> 공개키와 함께 암호화 된 정보를 전송 -> 수신자는 공개키로 암호화 된 정보를 복호화
암호화 된 데이터를 공개키를 가지고 복호화 할 수 있다는 것은 그 데이터가 공개키와 쌍을 이루는 비공개키에 의해서 암호화 되었다는 것을 알 수 있다.
즉 공개키가 데이터를 제공한 사람의 신원을 보장하게 해주는 것이다. 이것을 전자 서명이라 부른다.
HTTPS
HTTPS 는 HTTP의 가장 유명한 보안 버전이다. 널리 구현되어있으며 주류 상용 브라우저와 서버에 구현되어 있다. HTTPS는 HTTP 프로토콜에 대칭, 비대칭 인증서 기반 암호 기법의 강력한 집합을 결합한 것이다. 이 기법들의 집합은 무정부 상태의 분권화된 글로벌 인터넷 환경에서도 HTTPS를 매우 안전한 동시에 매우 유연하고 관리하기 쉽게 만들어준다.
SSL 프로토콜 계층을 통해 전송되는 HTTP 프로토콜을 HTTPS(HTTP over Secure Socker Layer)라고 합니다.
데이터의 암호화를 제공하지 않는 HTTP와 달리, HTTPS는 데이터 암호화를 제공하므로, 보안이 강화된 프로토콜 입니다.
참고
-https://wayhome25.github.io/cs/2018/03/11/ssl-https/
- 생활코딩
- HTTP 완벽 가이드 14장 '보안 HTTP'
'Network' 카테고리의 다른 글
stateless, stateful - 세션과 토큰 인증방식 (0) | 2020.12.16 |
---|---|
Web Server가 하는 일 (0) | 2020.11.23 |
Web Server란? (0) | 2020.11.23 |
Web이란? (0) | 2020.11.23 |