HTTPS
- Hyper Text Transfer Protocol Secure Socket layer 의 약자
- HTTPS는 HTTP 요청을 SSL 혹은 TLS 알고리즘을 이용해, HTTP 통신을 하는 과정에서 내용을 암호화하여 데이터를 전송하는 방법
암호화
- HTTPS 프로토콜은 암호화된 데이터를 주고 받는다.
- HTTP는 데이터가 암호화되지 않은 상태기 때문에 해킹에 취약하다.
인증서
- HTTPS 프로토콜은 브라우저가 응답과 함께 전달된 인증서 정보를 확인할 수 있다.
- 인증서는 해당 서버가 신뢰할 수 있는 서버라는걸 나타내준다. (데이터 제공자 신원 보장)
- 인증서 내부에 도메인 정보가 포함되어 있어 클라이언트가 제공자 도메인과 인증서에 적혀있는 도메인을 비교, 확인할 수 있다.
CA(Certificate Authority)
- 공인 인증서 발급 기관
- 브라우저에는 CA가 발급한 공개키를 내장하고 있다.
사설 인증서 발급
설치
인증서 생성
- 로컬을 인증된 발급기관으로 추가
- 로컬 환경에 대한 인증서 만들기
$ 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
- 어떠한 문자열에 '임의의 연산'을 적용하여 다른 문자열로 변환하는 것
- 규칙
- 모든 값에 대해 해시 값을 계산하는데 오래걸리지 않아야 한다.
- 최대한 같은 해시 값을 피해야 하며, 모든 값은 고유한 해시 값을 가진다.
- 아주 작은 단위의 변경이라도 완전히 다른 해시 값을 가져야 한다.
Salt
- 암호화해야 하는 값에 어떤 '별도의 값'을 추가하여 결과를 변형하는 것
- 암호화만 해놓는다면 해시된 결과가 늘 동일
- 원본값에 임의로 약속한 '별도의 문자열'을 추가하여 해시를 진행한다면 기존 해시값과 전혀 다른 해시값이 반환되어 알고리즘이 노출되더라도 원본값을 보호할 수 있도록 하는 안전 장치
- 기존: (암호화 하려는 값) => (hash 값)
- Salt 사용: (암호화 하려는 값) + (Salt 용 값) => (hash 값)
Salt 사용 시 주의점
- Salt는 유저와 패스워드 별로 유일한 값을 가져야 한다.
- 사용자 계정을 생성할 때와 비밀번호를 변경할 때 마다 새로운 임의의 Salt를 사용해서 해싱해야 한다.
- Salt는 절대 재사용하지 말아야 한다.
- Salt는 DB의 유저 테이블에 같이 저장되어야 한다.
- 각 유저마다 다른 Salt를 가져야 한다.