HTTPS는 Hyper Text Transfer Protocol Secure Socket layer의 약자
⚡등장 배경
HTTPS(HTTP Secure) 의 경우 HTTP/1.1이 개발되고 얼마 뒤에 등장했다.
HTTP 자체는 암호화되지 않은 텍스트로만 통신하기 때문에 중간에 누군가 통신내용을 가로채거나 사용자의 정보를 탈취할 수 있는 문제점이 있기 때문이다.
이를 방지하기 위해서는 HTTP 통신에 신뢰성과 무결성을 추가할 필요를 느끼게 된다. HTTPS는 이문제를 대화상대가 서로 자신이 신뢰할 수 있음을 증명하는 인증서를 사용하고 통신내용은 SSL(Secure Socket Layer) 또는 TLS(Transport Layer Security) 라는 프로토콜로 암호화하는 방식으로 해결했다.
⚡SSL, TLS
SSL은 1994년 넷스케이프에서 최초로 개발한 보안 프로토콜로, 1996년 IETF(국제 인터넷 표준화 기구)에서 표준화 되었다. 하지만 넷스케이프가 1999년 SSL 프로토콜 통제권을 IEFT에 넘기면서 이름이 TLS로 바뀐 상태이다. 현재 기준으로 TLS로 부르는 것이 맞지만, 아직까지도 두 프로토콜 이름으로 사용하는 편이다.
이러한 HTTPS 통신에서 클라이언트와 서버는 서로를 신뢰할 수 있는 상대로 확인 하기 위해 인증서를 이용한 비대칭 키 암호화 방식을 사용하는데, 간단하게 비대칭 키 암호화를 이용해 대칭 키를 교환하는 방식이라고 할 수 있다.
⚡암호화
암호화는 일련의 정보를 임의의 방식을 사용하여 다른 형태로 변환하여 해당 방식에 대한 정보를 소유한 사람을 제외하고 이해할 수 없도록 알고리즘을 이용해 정보를 관리하는 과정이다. 서버는 이 알고리즘을 갖고있고, 클라이언트로부터 요청이 오고, 그 알고리즘을 토대로 DB에 사용자 정보를 저장한다. 이후 응답할 때, DB에서 정보를 가져올 때, 서버는 복호화를 통해 인증 정보를 파악 후, 클라이언트로 응답을 보낸다.
데이터를 암호화하여 전송하는 HTTPS 프로토콜을 사용한다면 비밀번호화 같은 중요한 데이터가 유출될 가능성이 HTTP 프로토콜 보다 적어지게 된다.
⚡인증서
브라우저는 인증서에서 해당 인증서를 발급한 CA 정보를 확인하고 인증된 CA가 발급한 인증서가 아니라면 경고창을 띄워 서버와 연결이 안전하지 않다는 화면을 보여준다. (위에서 설명한 SSL, TLS라고 보면 된다.)
⚡Hashing
키(Key) 값을 해시 함수(Hash Function)라는 수식에 대입시켜 계산한 후 나온 결과를 주소로 사용하여 바로 값(Value)에 접근하게 할 수 하는 방법이다.
해싱의 구현 기법의 경우 정적 해싱, 동적 해싱, 확작 해싱 등 여러 가지 구현 기법이 존재한다.
(자료구조 분야에서 많이 사용하는 방식)
보안 분야에서는 데이터의 무결성과 메시지 인증에 사용하며 정보 보호의 여러 메커니즘에 사용이 된다. 고정되지 않은 임의 길이의 비트열을 압력 하여 고정된 길이의 해시 코드(Hash Code)를 생성하여 암호학적으로 풀 수 없는 키를 만들어 내는 것이다.
해쉬 함수의 조건
- 입력의 크기에 제한이 없는 가변적인 길이를 수용해야 한다.
- 출력은 고정된 길이를 가져야 한다.
- 해시 함수(Hash Function)의 입력은 어떠한 값이 들어와도 계산이 쉬워야 한다.
- 해시 함수(Hash Function)는 일방향성(One-way Function, 역변환 불가)이어야 한다.
- 해시 함수(Hash Function)는 충돌(Collision)이 없거나 적어야 한다.
ex) MD4, MD5, SHA(Secure Hash Algorithm) 256, SHA512 등이 있다. (많이 사용한다.)
⚡솔트 (Salt)
솔트(salt)는 데이터, 비밀번호, 통과암호를 해시 처리하는 단방향 함수의 추가 입력으로 사용되는 랜덤 데이터이다.
해시 함수를 사용하여 단방향 암호화를 했을때, 언제나 같은 값을 같게 된다. 해커는 잘 알려진 해시값의 원문을 저장해 두고 쉽게 원문을 유추할 수 있다.
(이렇게 해시함수를 사용하여 만들어낼 수 있는 값들을 저장해둔 테이블을 레인보우 테이블이라고 한다.)
솔트는 이러한 꼼수를 피하기 위해 해시된 값에 추가적으로 들어가는 랜덤 데이터 이다.
암호화 방식
비밀번호 "qwerty1234"를 SHA-256으로 해싱하면 아래와 같은 값이 나온다.
17F80754644D33AC685B0842A402229ADBB43FC9312F7BDF36BA24237A1F1FFB
해시하기 전에 임의의 랜덤 데이터 "LOU"를 더해서 해싱해볼 것이다. "qwerty1234LOU"
C556DC7BF3122C4AB228892A4DE67A1896F1CB0B32A1CEB667513F057ED6AA14
임의의 SALT를 쳤기 때문에 이제는 원래 값을 찾아내지 못한다.
⚡주의사항
- Salt는 유저와 패스워드 별로 유일한 값을 가져야 한다.
- 사용자 계정을 생성할 때와 비밀번호를 변경할 때마다 새로운 임의의 Salt를 사용해서 해싱해야 한다.
- Salt는 절대 재사용해선 안된다.
- Salt는 DB의 유저 테이블에 같이 저장되어야 한다.
⚡생각
지난번에 http를 정리하면서 https에 대해서도 이미 한번 봤었다. http를 정리할때 같이 정리를 할수 있었지만 https의 역사와 방식에 대해서 다시한번 정리를 하면서 http도 다시한번 보자는 생각으로 이번에 다시 정리를 하게 되었다.
'CS' 카테고리의 다른 글
[Git] git -f 명령어 위험성 공유 (0) | 2022.10.23 |
---|---|
네트워크에 대한 기본 개념 정리 (0) | 2022.10.12 |
프로세스와 스레드에 대한 내용 정리 (0) | 2022.10.06 |
HTTP 대한 개념 및 내용 정리 (0) | 2022.10.04 |
쿠키, 세션, 캐시에 대한 개념 정리 (0) | 2022.10.03 |