[TIL][Authentication] HTTPS 프로토콜과 구현

김태수·2020년 12월 10일
0

Authentication

목록 보기
1/1

인증에 대하여 공부하고있다

클라이언트와 서버를 가리지않고 중요하게 생각되는 인증에 대하여 공부하고 있다.
그 중요도가 높은 많큼 적지않게 어려움을 겪고있고 어렵게만 느껴진다..

하지만 대부분의 사이트가 가장 기본적인 인증인 로그인/로그아웃은 기본으로 갖고가고 있으며
클라이언트와 서버가 소통하는 중요한 통로이니, 좋은 프론트엔드 개발자가 되기 위하여 제쳐놓고 갈 수 없는
부분
이라 생각해 아직은 전부 이해할수 없지만 그나마 머리속안을 휘젓고 돌아다니는 지식이라도 정리를 해놔야겠다!


HTTPS 프로토콜

HTTPS는 기본적으로 HTTP와 같은 프로토콜이며, HTTP와 동일한 기능에 보안(Secure) 기능을 추가한
업그레이드 버전이라 할 수 있다!
HTTPS는 현대 웹에서 통상적으로 많이 사용하며, 보안 기능이 빠진 HTTP만을 사용하는 웹은
찾아보기 힘들다.
검색엔진최적화(Search Engine Optimization, SEO) 에서도 중요한데, 구글도 2014년 부터
보안의 중요성을 강조하며 HTTP를 사용하는 사이트보다 HTTPS를 사용하는 사이트에 점수를 더 주어
검색엔진에 노출이 잘 되게 하는 정책을 시행중이며, 크롬으로 HTTP사이트를 접속할 경우
경고메시지가 노출이 된다.

HTTPS의 특징은 인증서, CA, 비대칭 키 암호화 등이 있는데

  • 인증서 (Certificate)
    인증서의 경우 서버와 클라이언트를 오가는 reqest와 response에 올라가 날라가며, 해당 인증서에 기록되어있는 Domain을 비교해 제 3자로인한 도메인 변경등의 공격을 방지할 수 있다!

  • CA (Certificate Authority)
    CA는 인증서를 발급하는 공인기관이며, 해당 기관의 공인여부는 불변하지 않으며 각 브라우저(IE, Chrome 등..) 마다 각자 인증서를 발급한 CA가 다르다!

  • 비대칭 키 암호화 (RSA)
    비대칭 키 암호화는 A키로 특정 데이터를 암호화 한다면, A키의 페어인 B키로만 해당 데이터의 복호화가 가능하다! 해당 키중 하나는 클라이언트에 공개 해두고, 다른 하나는 서버에 숨겨놓는다!
    이 방식은 매우 복잡한 알고리즘이기 때문에 모든 통신과정에서 사용되지 않는다.


로컬 환경에서의 HTTPS 서버 구현

로컬 환경에서의 HTTPS 적용은 mkcert라는 프로그램을 통해 인증서를 만들어 적용할 수 있다.

MacOs 기준으로 homebrew를 사용하여 설치할 수 있으며

$ brew install mkcert

아래 명령어를 통해 나의 로컬 환경을 인증된 발급기관으로 추가할 수 있다.

$ mkcert -install

이제 나의 로컬 환경이 발급기관이 되었으니, 인증서를 만들 수 있다. localhost 환경에 대하여
인증서를 만드는 명령어는 다음과 같다.

$ mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1

이제 위와 같이 cert.pem (인증서) key.pem (개인키) 두 파일이 지정한 디렉토리에 만들어 졌을텐데, 이 두가지를 사용하여 https 서버를 만들 수 있다!
cert.pem 파일의 경우 인증서이기 때문에 노출되어도 상관 없지만, key.pem의 경우 비공개 개인키 이기 때문에
반드시 암호처럼 다루어야 한다. 때문에 git에 커밋하지 않게 조심하고, gitignore에 반드시 등록하도록 하자!!


HTTPS 서버 생성

node.js

const https = require('https'); //____ http 모듈 대신 https 모듈을 사용한다!!
const fs = require('fs');
https
  .createServer(
    {
      key: fs.readFileSync(__dirname + 'key.pem', 'utf-8'),
      cert: fs.readFileSync(__dirname + 'cert.pem', 'utf-8'),
    }, //____ fs모듈을 이용해 위에서 생성한 cert와 key를 불러온다!!
    function (req, res) {
      res.write('https 서버입니다!');
      res.end();
    }
  )
  .listen(3001);

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('https 서버입니다! 근데 익스프레스지롱');
    }) //____ node.js 방식에서 https.createServer의 두번째 인자만 express의 미들웨어로 교체해주면 된다!!
  )
  .listen(3001);

각각 node.js와 express.js를 이용한 방식이며, 두 방식간의 차이는 거의 없다!


기존에 HTTP로 구축해 놓았던 서버를 HTTPS로 터널링 해주고싶다면
ngrok 이라는 프로그램을 이용하면 된다! 이 부분은 추후 배포를 배우고 직접 해보며 공부해 봐야겠다!

profile
개발학습 일기

0개의 댓글