HTTPS

Judo·2021년 1월 24일
0

HTTPS


  • Hyper Text Transfer Protocol Secure Socket layer 의 약자
  • HTTPS는 HTTP 요청을 SSL 혹은 TLS 알고리즘을 이용해, HTTP 통신을 하는 과정에서 내용을 암호화하여 데이터를 전송하는 방법

암호화


  • HTTPS 프로토콜은 암호화된 데이터를 주고 받는다.
  • HTTP는 데이터가 암호화되지 않은 상태기 때문에 해킹에 취약하다.

인증서


  • HTTPS 프로토콜은 브라우저가 응답과 함께 전달된 인증서 정보를 확인할 수 있다.
  • 인증서는 해당 서버가 신뢰할 수 있는 서버라는걸 나타내준다. (데이터 제공자 신원 보장)
  • 인증서 내부에 도메인 정보가 포함되어 있어 클라이언트가 제공자 도메인과 인증서에 적혀있는 도메인을 비교, 확인할 수 있다.

CA(Certificate Authority)


  • 공인 인증서 발급 기관
  • 브라우저에는 CA가 발급한 공개키를 내장하고 있다.

사설 인증서 발급

설치

  • mkcert를 이용하여 로컬 환경에서 신뢰할 수 있는 인증서를 만든다.

  • homebrew를 통해 mkcert설치

    • $ brew install mkcert

인증서 생성

  • 로컬을 인증된 발급기관으로 추가
    • $ mkcert -install
  • 로컬 환경에 대한 인증서 만들기
    • $ mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1
  • 로컬에 cert.pem, key.pem 파일이 생성됨.
  • 인증서는 공개키, 인증기관의 서명을 포함하고 있으므로 공개되어도 상관없지만, key.pem의 경우 개인키이므로 git에 커밋하지 않고, 암호처럼 다루어야 한다.

HTTPS 서버 작성

  • https 내장 모듈과 express.js 이용

const https = require('https');
const fs = require('fs');
const express = require('express');

const app = express();

https
  .createServer(
    {
      key: fs.readFileSync(__dirname + '/key.pem', 'utf-8'),
      cert: fs.readFileSync(__dirname + '/cert.pem', 'utf-8'),
    },
    app.use('/', (req, res) => {
      res.send('Congrats! You made https server now :)');
    })
  )
  .listen(3001);

Hashing


암호화(Encryption)

  • 암호화는 일련의 정보를 임의의 방식을 사용하여 다른 형태로 변환 후 해당 방식에 대한 정보를 소유한 사람을 제외하고 이해할 수 없도록 '알고리즘'을 이용해 정보를 관리하는 과정
  • 클라이언트에서 비밀번호를 입력했을 때 암호화 알고리즘을 이용해 비밀번호를 암호화한다. 이후 DB에 저장되어 있는 암호화된 비밀번호와 비교를 하고 일치한다면 정보 제공을 해준다.

Hasing

  • 어떠한 문자열에 '임의의 연산'을 적용하여 다른 문자열로 변환하는 것
  • 규칙
    1. 모든 값에 대해 해시 값을 계산하는데 오래걸리지 않아야 한다.
    2. 최대한 같은 해시 값을 피해야 하며, 모든 값은 고유한 해시 값을 가진다.
    3. 아주 작은 단위의 변경이라도 완전히 다른 해시 값을 가져야 한다.

Salt

  • 암호화해야 하는 값에 어떤 '별도의 값'을 추가하여 결과를 변형하는 것
  • 암호화만 해놓는다면 해시된 결과가 늘 동일
  • 원본값에 임의로 약속한 '별도의 문자열'을 추가하여 해시를 진행한다면 기존 해시값과 전혀 다른 해시값이 반환되어 알고리즘이 노출되더라도 원본값을 보호할 수 있도록 하는 안전 장치
  • 기존: (암호화 하려는 값) => (hash 값)
  • Salt 사용: (암호화 하려는 값) + (Salt 용 값) => (hash 값)

Salt 사용 시 주의점

  • Salt는 유저와 패스워드 별로 유일한 값을 가져야 한다.
  • 사용자 계정을 생성할 때와 비밀번호를 변경할 때 마다 새로운 임의의 Salt를 사용해서 해싱해야 한다.
  • Salt는 절대 재사용하지 말아야 한다.
  • Salt는 DB의 유저 테이블에 같이 저장되어야 한다.
  • 각 유저마다 다른 Salt를 가져야 한다.
profile
즐거운 코딩

0개의 댓글