🎯 Achievement Goals


  • HTTP와 HTTPS의 차이점을 이해할 수 있다.
  • 암호화와 hashing, salting 등의 개념을 이해할 수 있다.
  • 권한 부여(Authorization)와 인증(Authentication)에 대해 이해할 수 있다.
  • 쿠키의 작동 원리를 이해할 수 있다





👉 HTTPS


https


HTTPS는 HTTP를 안전하게 만드는 방식이다

HTTP

  • 인터넷 상에서 정보를 주고 받기 위한 프로토콜(통신규약)
  • 클라이언트와 서버 사이에 이루어지는 요청/응답 프로토콜
  • 암호화되지 않은 방법으로 데이터를 전송한다.(악의적으로 이용 가능)

HTTPS

  • 보안이 강화된 HTTP 이다.
  • Hypertext Transfer Protocol Over Secure Socket Layer의 약자
  • 모든 HTTP 요청과 응답 데이터는 네트워크로 보내지기 전에 암호화한다.




👉 HTTPS 사설 인증서 발급 및 서버 구현


mkcert라는 프로그램을 이용해서 로컬 환경에 신뢰할 수 있는 인증서를 만들 수 있다.


//Ubuntu
$ sudo apt install libnss3-tools
$ wget -O mkcert 
https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64
$ chmod +x mkcert
$ sudo cp mkcert /usr/local/bin/

// 인증서 생성
$ mkcert -install
$ mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1


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('hi, useonglee~ :)');
    })
  )
  .listen(3001);




👉 Hashing


암호화는 일련의 정보를 임의의 방식을 사용하여 다른 형태로 변환하고, 해당 방식에 대한 정보를 소유한 사람을 제외하고 이해할 수 없도록 정보를 관리하는 과정이다.


Hashing은,

  1. 모든 값에 대해 해시 값을 계산하는데 오래 걸리지 않아야 한다.
  2. 모든 값은 고유한 해시 값을 가져야 한다.
  3. 아주 작은 단위의 변경이라도 완전히 다른 해시 값을 가져야 한다.


해싱


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

  1. 암호화만 해놓는다면 해시된 결과가 늘 같다.

  2. 원본값에 임의로 약속된 별도의 문자열을 추가하여 기존 해시값과 전혀 다른 해시 값이 반환되어 노출되더라도 원본값을 보호할 수 있도록 하는 안전장치이다.

  3. 기존: (암호화 하려는 값) => (hash 값)
    salt: (암호화 하려는 값) + (salt 값) => (hash 값)


salt





Cookie는 서버가 웹 브라우저에 정보를 저장하고 불러올 수 있는 수단이다.

해당 도메인에 대해 쿠키가 존재하면, 웹 브라우저는 도메인에게 http 요청 시 쿠키를 함께 전달한다.


cookie


하지만 데이터를 저장한 이후 아무 때나 데이터를 가져올 수 없다. 데이터를 저장한 이후 특정 조건들이 만족하는 경우에만 다시 가져올 수 있다.


cookieOptions



sameSite



express-session 쿠키 설정

// 오늘 내가 사용한 쿠키 설정이다.
app.use(
  session({
    secret: '@useonglee',
    resave: false,
    saveUninitialized: true,
    cookie: {
      domain: 'localhost',
      path: '/',
      maxAge: 24 * 6 * 60 * 10000,
      sameSite: 'none',
      httpOnly: true,
      secure: true,
    },
  })
);









🙌 느낀점


오늘 웹에 대해서 더 깊은 공부를 하였는데, 생각보다 이론들이 재밌어서 좋았다. 그리고 express-session 라이브러리를 사용해서 POST/login 요청과 POST/logout 요청 API를 구현했는데 어제 내가 혼자 공부했던 내용과 비슷하기로 했고, 쉽게 구현할 수 있는 문제들이여서 과제를 잘 마무리할 수 있었다!! 엔지니어분들도 웹 인증에 대해서 정말 중요하다고 강조하셨고, 다음주 H.A 시험에도 인증 구현 부분이 가장 많이 나올 것 같다는 이야기를 들었으니 주말에 복습을 통해 완벽히 다뤄보자!





👊 내일의 TIW(today I Will)

Token