보안을 책임지는 HTTPS
HTTPS는 HTTP에서 보안이 강화된 프로토콜 입니다
HTTPS는 누구나 볼 수 있었던 메세지를 통신하는 당사자들만 볼 수 있도록 암호화해 HTTP의 보안 문제를 해결했다는 점이 가장 큰점 입니다
마치 전쟁에서 적군이 못알아보게끔 우리만의 체계로 명령을 암호화해서 전달한것처럼 말입니다
또한 특정 서비스가 HTTPS를 사용하고 있는지는 브라우저 상단의 주소창에서 쉽게 파악 할 수 있습니다
SSL과 TLS는 무엇이 다를까?
- 그런데 우리가 앞서 언급했던 HTTP의 보안은 사실 HTTPS가 아닌 다른곳에서 담당하고있었는데요 (띠용)
- 바로 SSL (Secure Sockets Layer) 입니다
- SSL은 "클라이언트와 서버가 서로 데이터를 암호화해 통신할 수 있도록 돕는 보안 계층" 입니다
- HTTPS를 사용하면 HTTP 메세지에 포함되는 컨텐츠 정보에 보안요소가 추가되기 때문에 데이터를 안전하게 주고 받을수 있는 거였죠
- OSI 계층 구조로 보자면 HTTPS는 아래 그림과 같은 모습입니다
- OSI의 계층은 서로 독립되어 있기 떄문에 SSL 또한 HTTPS뿐만 아니라 다른 포토콜과 조합해서도 사용 할 수 있습니다
- 그리고 SSL을 검색해보면 TLS(Transport Layer Security) 이라는 키워드가 따라다니는것을 볼 수 있는데, 이 둘은 약간의 차이는 있지만 결국 같은 보안 프로토콜에서 시작됐습니다
- 근데 어쩌다가 서로 다른 이름을 갖게 되었을까요 ?
- 사실 SSL이 알려지기 시작한지 얼마안되고, SSL의 취약점을 변경시킨 3.0버젼부터 TLS로 개명하였고, 사람들이 3.0버젼 이후로 보안프로토콜을 많이 사용하고 변경하였지만, 사람들이 여전히 계속 SSL로 부르고 있는것이다
대칭키, 공개키로 안전하게 암호화 하기
- 그럼 SSL은 어떤 방식으로 동작하고 있을까요 ?
- 과정을 본격적으로 알아보기 전에, SSL은 꽤 복잡한 방식으로 동작하다 보니 쉬운 이해를 미리 두 가지 핵심 개념을 짚고 넘어가고자 합니다
- 컴퓨터 세상에서는 암호를 만드는 행위, 즉 암호화를 하기 위해 비밀번호 같은 개념인 Key 가 필요합니다
- 이 키가 있어야 암호화를 하고, 반대로 암호를 푸는 복호화도 할 수 있죠
- 그 중 SSL은 공개키 기법과 대칭키 기법이라는 두 암호화 기법을 함께 사용하고 있습니다
대칭키
- "하나의 키로 암호화,복호화를 할 수 있는 암호화 기법" 입니다
- 웹통신으로 예시를 들어보겠습니다
- 클라이언트와 서버가 각각 '1234'라는 키를 갖고 있다가 데이터가 왔을때 이 키로 복호화를 하고, 데이터를 보낼 땐 같은 키를 가지고 암호화를 해 전송하는 방식 입니다
- 이러한 방법덕분에 "빠르다" 라는 장점이 있지만, 키를 안전하게 서로 교환하기 어렵다는 단점이 있습니다
- 왜냐하면 서버와 클라이언트가 같은 키로 통신하는데, 그렇다면 중간에 누가 키를 가로챌 위험이 있다는 것입니다
- 이러한 문제를 해결하기 위해 나타난 것이 공개키 이다!
공개키
- 대칭키와 차이점으로는 key 를 먼저 꼽을 수 있을것이다
- "각기 다른 형태인 열쇠 두개가 한쌍으로 이루어져 있다는 점" 입니다
- 만약 보물상자를 "빨간 key로 잠궜다면", "다시 열때는 파란 key로만 열 수 있는것"입니다
- 만약 파란키로 잠궜다면, 빨간키로 열 수 있게 반대로 적용된다
- "공개키로 암호화한 데이터는 개인키로만 복호화 할 수 있고","개인키로 암호화된 데이터는 공개키로만 복호화 할 수 있습니다"
가볍게 SSL 동작과정을 살펴보자
- SSL은 크게 3가지로 나뉘어 집니다
- 핸드 셰이크
- 세션
- 세션종료
- TCP와 유사하게 SSL도 클라이언트와 서버가 통신할 때 준비가 되었는지 확인하는 과정인 핸드 셰이크를 거칩니다
1단계
- 클라이언트는 서버에게 인사를 건넵니다
- 이때 "랜덤한 데이터","지원 가능한 암호화 방식"을 서버에게 전달합니다
- 다양한 암호화 방식중 어떤것을 할지 협의해야 하기 떄문!
랜덤한 데이터 ?
먼저 클라이언트가 보내는 랜덤한 데이터와, 서버가 다시 클라이언트에게 보낼떄의 랜덤한 데이터는 서로 다르고, 이것은 후에 세션키(대칭키)를 안전하게 생성하기 위해 사용된다는 것만 알면될것같다
2단계
- 클라이언트에게 인사를받고, 서버는 클라이언트에게 3가지를 전달합니다
- 랜덤데이터
- 지원가능한 암호화 방식
- 인증서
- 서버의 공개키
인증서란?
서버가 공식적으로 인증된 기관인 CA(Certificate Authority)에서 발급받은 문서로, 서버가 신뢰 할 수 있는비 보장하는 역할!
3단계
- 인증서를 받은 클라이언트는 이 인증서가 제대로된 문서인지 검증하기 위해 CA가 발급한 인증서 목록중에서 서버가 전달한 인증서가 있는지 확인 합니다
- 그리고 만약 존재한다면 CA로부터 전달받은 공개키로 인증서를 검증 해봅니다
- 성공한다면 서버를 신뢰 할 수 있게됩니다
4단계
- 본격적으로 키를 주고 받기위해 클라이언트는 실제 데이터 통신에서 사용할 "대칭키를 임시로 만듭니다"
- 이때 앞서 클라이언트와 서버가 주고받은 랜덤한 데이터를 조합해 임시키 (pre master secret)을 만듭니다
- 임시키는 "대칭키" 이기 떄문에, 절대 중간에 제3자에게 노출되어서는 안되므로, 앞서 갖고있던 (CA가 전달해준) 공개키로 암호화하여 서버에게 전달합니다
5단계
- 키를 받은 서버는 자신이 갖고 있던 자신이 갖고 있던 비밀키(개인키)로 암호를 해독하여 "임시키를 전달 받음" 이 됩니다
- 이로써 클라이언트와 서버는 서로 같은 키를 가지게 됩니다
6단계
- 클라이언트와 서버의 임시키는 서로가 주고받은 랜덤한 데이터 + 서로가 가지고있는 임시키(Pre Master Secret)을 활영하여 세션키(대칭키)를 만들며 서로 안전하게 데이터를 주고받을 수 있다
마무리
- 그 이후 단계에서는 앞서 생성한 세션키를 이용하여, 클라이언트와 서버간의 원활한 데이터가 이루어진다
- 이 작업들은 내가 https를 활용하여 데이터를 보낼때 마다 이루어지는 과정이다
다시한번 정리
- 클라이언트가 서버에게 Hello를 보낼때, 밑의 정보들도 보냄
- 랜덤한 데이터
- 지원하는 암호화 방식
- 서버는 응답받고, 클라이언트에게 Hello를 보낼때, 밑의 정보를 보냄
- 랜덤한 데이터
- 암호화 방식 무엇으로 할지 결정
- 서버의 공개키
- 인증서 (이건 CA가 발급해줌)
- 클라이언트는 다시 응답받고 아래의 것들을 확인함
- 서버로부터 받은 인증서가, CA가 발급해준 인증서들 중에 있는지 확인한다
- 만약 있다면 그 인증서를 CA의 공개키로 검증해본다
- 성공한다면 신뢰 하는 서버라는 뜻이기떄문에, 임시키(pre master secret)를 만들준비를 한다
- 임시키는 클라이언트와 서버가 서로 주고받은 랜덤한 데이터를 기반으로 만들고, 이것을 서버에게 전달받은 공개키로 암호화하여 서버에게 보냄
- 서버는 자신이 갖고있는 개인키를 활용하여 임시키(pre master secret)를 얻게된다
- 이로써 서버와 클라이언트는 현재 서로 같은 임시키(pre master secret)를 갖고있는 상황이된다
- 이후 클라이언트와 서버는 자신이 갖고있는 랜덤한 데이터들과, pre master secret을 기반으로 세션키를 만든다
- 클라이언트와 서버는 세션키(대칭키)로 이제 서로 데이터를 보낼때 안전하게 보낼 수 있다
난 오늘 무엇을 알았는가?
- SSL에는 두가지 방법으로 데이터를 보안시키는 방법이 있다
- 대칭키 기법 ( 서버와,클라이언트가 서로 같은 키로 데이터를 열거나 잠굴수있는키)
- 공개키 기법( 개인키로 잠궜으면 공개키로만 열수있고, 그 반대로도 적용됨)
- HTTP 프로토콜의 OSI 계층사이에 보안프로토콜인 SSL/TLS가 추가된 형태가 HTTPS다
- 클라이언트와 서버가 HTTPS 프로토콜을 이용할때의 데이터 통신 방식에 대해 알아보았다
- IP > TPC > SSL/TLS > HTTPS
참조 문헌
'Cs' 카테고리의 다른 글
Tree를 직접 구현해보자 - 2 (0) | 2025.03.26 |
---|---|
Tree를 직접 구현해보자 - 1 (1) | 2025.03.25 |
CS 기초 공부 - IP 주소 (0) | 2025.01.23 |
자료구조 (1) | 2025.01.23 |
Tree ? (1) | 2025.01.22 |