[인증/보안] HTTPS와 암호화

·2022년 11월 17일
0

HTTPS

HTTP + Secure

: HTTP 프로토콜을 SSL/TLS 프토토콜을 사용하여 데이터를 암호화 해 전송하는 방법

SSL이 표준화되며 바뀐 이름이 TLS라 사실상 동일한 규약

HTTPS의 목적

암호화

기존의 HTTP 요청은 요청이 들어가는 시점에 누군가 해당 요청(정보, Request Body가 담긴)을 탈취해 개인 정보가 유출되는 경우가 발생했다. HTTPS의 방식을 사용함으로써 정보가 유출되더라도 해당 정보 자체가 암호화 되어 있어 내용을 알아볼 수 없도록 한다.

데이터 무결성

데이터의 무결성이란 데이터가 내,외부 요인으로 변경되지 않고 보호된 상태를 의미한다.

HTTP요청으로 'Hello World!'라는 메세지를 전송했다고 가정했을 때, 누군가 메세지를 중간에서 탈취해 'Hi World!'로 바꾸지 못하게 한다.

이는 암호화로 이루어진 데이터를 해커가 복호화를 하지 못해 가능한 일!

인증(식별)

HTTPS는 SSL를 이용하여 데이터를 암호화한다고 했다. 그것에 그치지 않고 CA를 통해 발급 받은 SSL 인증서는 데이터의 제공자(서버)의 신원을 보장하고, 확인할 수 있다.

💡CA(Certificate Authority)
인증서를 발급해주는 공인된 기관을 말한다. CA는 서버의 공개키와 정보를 CA의 비밀키로 암호화하여 인증서를 발급한다.

1. 정상실행된 HTTP요청

클라이언트에게 요청을 받으면 서버는 도메인과 함께 인증 받은 도메인이 담긴 인증서를 클라이언트에게 응답 데이터로 보낸다.

클라이언트는 인증서에 있는 도메인과 서버가 보낸 도메인이 일치할 경우 요청에 대한 응답이 정상 실행된다.

2. 중간자 공격을 당한 HTTP요청

클라이언트의 요청으로부터 생성된 서버의 응답데이터를 중간에 탈취해 도메인이 변경된 경우, 클라이언트 측에서 해당 도메인인증서의 도메인을 비교하여 일치하지 않으면, 사용자에게 경고를 보낸다.

만약 인증서도 중간자의 공격으로 변경사항이 생기거나, 가짜 인증서를 응답데이터를 받게된다면 브라우저에 미리 내장되어 있던 CA 리스트를 통해 인증된 CA에서 발급 받은 인증서인지 일차적으로 확인한다. 잘못된 인증서일 경우에는 브라우저 창에 경고 메세지가 뜬다.

암호화

암호화란

  • 암호화는 일련의 정보를 임의의 방식을 사용하여 다른 형태로 변환하는 것을 말한다.
  • 알고리즘을 이용해 데이터를 관리하는 과정으로 해당 알고리즘에 대한 정보를 소유하고 있는 사람이 아니면 암호화 된 데이터를 이해하지 못하도록 한다.

대칭키 암호화(One Key🔑)

  • 데이터를 암호화하고 복호화하는 하나의 키를 가진다.
  • 데이터를 전송할 때, 대칭 키를 이용해 암호화를 진행하고 암호화된 데이터를 받아 대칭 키로 복호화를 진행한다.
  • 일치하는 키가 아니면 암호화, 복호화를 할 수 없다.
  • 하나의 키를 가지고 암호화를 진행하기 때문에 데이터와 함께 전송하지 않도록 주의해야 하며, 키의 공유가 어렵다는 단점을 가진다.
  • 비교적 처리 시간이 짧다.

비대칭키 암호화(Twins, but different Keys🔑🗝️)

  • 데이터를 암호화하는 키(공개 키), 복호화 하는 키(개인, 비공개 키) 2개의 키를 가진다.
  • 2개의 키는 서로 짝을 이루며, 함께 동작한다.
  • 공개키는 공유가 가능하다.
  • 데이터를 전송하기 전, 공개키를 이용해 데이터를 암호화한다.
  • 오직 짝을 이루는 개인 키로만 공개 키로 암호화된 데이터를 읽을 수 있다.
  • 개인 정보 보호, 식별에 유용하다.
  • 개인 키로 암호화 후 공개 키로 복호화 하는 경우 : 전자 서명
  • 공개 키로 암호화 후 개인 키로 복호화 하는 경우 : 정보 보호

☝️ HTTPS에서는 대칭, 비대칭 키 암호화 방식을 다 사용한다.

HTTPS에서의 대칭키, 비대칭키 사용 방식

  1. 클라이언트와 서버의 Hand-Shake 과정을 거치고 서버는 클라이언트에게 자신의 개인 키로 암호화된 인증서와 함께 서버의 공개 키를 보내 요청 시, 자신의 신원을 보장한다.
  2. 클라이언트는 인증서를 서버의 공개 키복호화해 검증을 진행한다.

  1. 클라이언트는 서버의 공개 키암호화자신의 대칭키를 서버에게 보낸다.

  1. 서버는 자신의 개인 키로 클라이언트가 보내온 데이터를 복호화한다.

  2. 클라이언트의 대칭 키를 가진 서버는 대칭 키로 암호화한 응답 데이터를 보내고 클라이언트는 자신의 대칭 키로 복호화 하여 데이터를 확인한다.

  3. 클라이언트와 서버의 Hand-Shake 과정 종료된 후, 클라이언트의 대칭 키로 소통이 가능해진다.

✨ 대칭 키는 암호화, 복호화를 하나의 키를 가지고 사용하기 때문에 보완에 취약하다는 단점이 있었다. 하지만 비대칭 키와 사용하게 되면 그 단점을 보완할 수 있으며 대칭 키의 빠른 속도의 장점을 적극적으로 사용할 수 있다.

Hashing

  • 암호화의 기본
  • 어떤 문자열을 임의의 연산을 통해 다른 문자열로 변환하는 것을 말한다.
  • 키(Key)값해시 함수(Hash Function)라는 수식에 대입시켜 계산한 후 나온 결과를 주소로 사용하여 값(Value)에 접근하는 방식

💡 해시 함수(Hash Function)
키(Key)값을 값(Value)이 저장되는 주소 값으로 바꾸기 위한 수식

Hashing가 철칙

1. 모든 값에 대해 해시 값을 계산하는데 오래걸리지 않아야 한다.

당연하게도 해시 값을 해독(decoding)할 때는 많은 시간이 걸리도록 하는 것이 좋다. 그러나 해시 값을 생성하는데 많은 시간이 소요된다고 한다면, 사용자는 로그인 하나를 하는데에도 많은 시간을 소요할 수 밖에 없다

으 로그인 짱오래걸리면 짱 짜증남🤬

2. 최대한 존재하는 해시 값을 피해야 하며, 모든 값은 고유한 해시 값을 가진다.

극히 낮은 확률로 서로 완전히 다른 값이 Hashing을 거쳐 같은 해시 값을 가지게 되는 경우가 있다. 이러한 상황이 최대한 발생하지 않도록 알고리즘을 짜는 것이 좋다

☝️ 해당 상황을 방지하는 알고리즘들이 이미 배포되어 있으니 걱정하지 말 것

3. 아주 작은 단위의 변경이라도 완전히 다른 해시 값을 가져야 한다.

부분이 변경되더라도 해시 값으로 알고리즘이 추측될 수 있으므로 수정 한번에 새로운 해시값을 가질 수 있도록 해야 한다.

4. 입력 받은 데이터들을 고정된 길이의 데이터로 변환 해야 한다.

알고리즘을 추측하기 어렵게 하기 위해 입력 받은 데이터의 길이가 짧든, 길든 모두 같은 길이로 암호화 해야 한다.

☝️ 참고할 Hashing 알고리즘 : SHA1, SHA256

Salt

암호화 해야 하는 값에 어떤 별도의 값을 추가하여 결과를 변형하는 것을 말한다.

Salt를 사용하는 이유

  • 암호화에만 의존한다면 해시된 값은 늘 동일하여, 해싱 전의 값을 추측할 수 있다.
  • 원본 값에 임의로 약속된 별도의 값을 추가하여 해싱을 진행한다면 기존의 해시값과 전혀 다른 해시값이 반환되기 때문에 알고리즘이 노출되더라도 원본값을 보호할 수 있는 안전장치

Salt 사용 시 주의할 점

  1. Salt는 유저와 패스워드 별로 유일한 값을 가져야 한다.
  2. 사용자 계정을 생성할 때와 비밀번호를 변경할 때마다 새로운 임의의 Salt를 사용해서 해싱 해야 한다.
  3. Salt 재사용 금지
  4. Salt는 DB의 유저 테이블에 같이 저장되어야 한다.
profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글