인증/보안[2021.10.20]

김정훈·2021년 10월 20일
0

HTTP

목록 보기
5/9

1. HTTPS

Hyper Text Transfer Protocol Secure Socket layer 의 약자

1. HTTPS
  - HTTP 요청을 SSL 또는 TLS라는 알고리즘을 이용해 내용을 
    암호화하여 데이터를 전송하는 방법
    
2. 인증에서 HTTPS를 사용하는 이유
  - HTTP보다 상대적으로 안전한 방법이며, 데이터 제공자의 신원을
    보장함
  - 클라이언트는 데이터 제공자가 제공해준 데이터를 사용할 수 밖에
    없으며, 요청과 응답을 중간에서 가로채는 중간자 공격에 취약
  - HTTPS 프로토콜의 특징 중 하나는 암호화된 데이터를 주고받기 때문에,
    중간에 인터넷 요청이 탈취되더라도 그 내용을 알아볼 수 없다.
    
3. 인증서
  - HTTPS 프로토콜의 또 다른 특징 중 하나는 브라우저가 응답과 함께 
    전달된 인증서 정보를 확인할 수 있다는 점
  - 브라우저는 인증서에서 해당 인증서를 발급한 CA 정보를 확인하고 인증된
    CA가 발급한 인증서가 아니라면 화면에 경고창을 띄워 서버와 연결이 안전하지 
    않다는 화면을 보여줌
    
4. 설치방법
  - 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에 커밋하지 않고, 암호처럼 다루어야함!
    

2. express.js를 이용한 https 서버 만들기

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);
  
  
//서버를 실행 후 3001번 포트에 접속하면 자물쇠가 잠겨있는
https 프로토콜을 이용하는 것을 확인 할 수있다.

2. Hashing

어떠한 문자열을 임의의 연산을 통해 다른 문자열로 변환 하는 것

Hashing의 세가지 철칙
1. 모든 값에 대해서 해시 값을 계산하는데 오래걸리지 않아야 한다.

2. 최대한 해시 값을 피해야 하며, 모든 값은 고유한 해시 값을 가진다
  - 아주 낮은 경우의 확률로 서로 다른 값이 같은 값의 해시값으로 존재 할 수 있고, 
    이런 경우를 최대한 피해야 한다.

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

3. Salt

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

1. 암호화만 진행한다면 해시된 결과과 늘 동일하며 해시된 값과 원래의 값을 
   테이블화 하며 decoding하는 경우가 발생할 수 있음
   
2. 원본 값에 별도의 값을 추가하여 해시를 진행한다면 전혀 다른 값으로 변화되어
   알고리즘이 노출되더라도 원본 값을 보호할 수 있도록 하는 안전장치
   
3. 기존 : (원본 값) => (해시 값)
   salt 사용 : (원본 값 + salt용 값) => (해시 값) 
   
   

서버가 클라이언트에게 일방적으로 전달하는 작은 데이터

단순히 서버에서 클라이언트에 쿠키를 전송하는 것만 의미하지 않고 
클라이언트에서 서버로 쿠키를 전송하는 것도 포함

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

2. 사용자 선호, 테마 등 장기간 보존해야 하는 정보 저장에 적합

서버는 쿠키를 통해 데이터를 저장하고 원할 때 데이터를 불러와 사용할 수 있다. 
하지만 데이터를 저장한 이후 아무 때나 데이터를 가져올 수 없고 데이터를 저장한 
이후 특정 조건들이 만족하는 경우에만 다시 가져올 수 있다.
이때 필요한 것이 조건이 쿠키의 옵션

* 쿠키의 옵션
  - Domain
    : 서버와 요청의 도메인이 일치하는 경우 쿠키 전송
  
  - Path
    : 서버와 요청의 세부 경로가 일치하는 경우 쿠키 전송
      세부경로는 서버가 라우트할 때 사용 하는 경로 
  
  - MaxAge or Expires
    : 쿠키의 유효기간 설정!!!!!
      지정된 시간, 날짜를 초과하면 자동으로 파괴
  
  - HttpsOnly
    : 스크립트의 쿠키 접근 가능 여부 결정
      기본값은 false로 지정 
  
  - Secure 
    : HTTPS 프로토콜 에서만 쿠키 접근 전송 여부 결정
  
  - SameSite
    : CORS의 요청의 경우 옵션 및 메서드에 따라 쿠키 접근 전송 여부 결정
    
이러한 쿠키의 특성을 이용하여 Stateless한 인터넷 연결을 
Stateful하게 유지할 수 있다.
  - HTTP(Stateless 무상태성)
  - 이리저리 페이지를 옮겨다녀도 장바구니에 담긴 상품이 유지 등
  
profile
프론트엔드 개발자를 꿈꾸고 있습니다!

0개의 댓글