클라이언트(브라우저)와 서버가 통신을 하는데, 민감한 데이터 유출을 막기 위해서는 보안이 강화 되어야한다. 즉, Https는 프로토콜 내용을 암호화한 버전, 보안이 강화된 HTTP 프로토콜이다.
(HTTP + Secure) 인증서
, 암호화
, 동작방식
인증서
서버는 CA(Certificate Authority 인증서를 발급해주는 공인기관) 에서 몇가지 확인후 서버의 공개키와 정보를 CA의 비밀키로 암호화하여 인증서를 발급받는다.
클라이언트는 서버에게 암호화된 인증서와 CA 공개키를 전달 받고,브라우저에 제공된 해당 CA 기관의 공개키로 서버 인증서를 복호화한다.(암호를푼다) 그리거 신뢰할 사이트인지 확인한다.
HTTPS는 대칭키와 비대칭키 방식을 이용해 데이터를 암호화한다.
내가 이용하는 사이트가 보안된 웹인지 확인하려면 주소창 옆 자물쇠를 클릭한다.
https가 사용되었다 라고 뜰것
HTTPS의 또다른 특징 중 하나는 브라우저가 서버의 응답과 함께 전달된 인증서를 확인할 수 있다는 점입니다. 이러한 인증서는 서버의 신원을 보증하여 우리가 접속한 Naver가 해커가 정교하게 따라한 가짜 Naver가 아님을 보장해주는 역할을 합니다.
암호화는 데이터를 특정 키로 암호화해서 암호화된 데이터를 사용하려면 다시 특정 키로 복호화 하는과정을 거쳐야한다.
HTTPS에서는 클라이언트와 서버가 데이터를 암호화하여 주고받기 위해 비대칭키 방식과 대칭키 방식을 혼용하여 사용한다.
대칭키 방식
은 같은키 2개를 만든 뒤 서버와 클라이언트가 각각 갖는다. 그리고 전달할 데이터를 키로 암호화한다. 암호화된 데이터를 전달받아 사용하기 위해 다시 키로 복호화하는 방식이다.
대칭키 방식은 같은 비밀키를 만들고 넘겨줘야 하는 과정에서 키를 뺏길수가 있다.
비대칭키 방식
은 각각 공개키와 비밀키를 가지고 상대가 나의 공개키로 암호화한 데이터를 개인이 가진 비밀키로 복호화하는 것
서버와 클라이언트간의 CA를 통해 서버를 인증하는 과정과 데이터를 암호화하는 과정을 아우른 프로토콜을 TLS 또는 SSL이라고 말합니다. (*SSL과 TLS는 사실상 동일한 규약을 뜻하며 SSL이 표준화되며 바뀐 이름이 TLS입니다.)
클라이언트에서 입력한 정보를 서버가 받아서 해싱(암호화) 과정을 거친뒤 데이터베이스에 저장한다. 암호화는 salt(개발자만 아는 별도의값)소금 으로 변형한다.
쿠키는 서버에서 클라이언트에 영속성있는 데이터를 저장하는 방법이다. 서버는 클라이언트의 쿠키를 이용하여 데이터를 가져올 수 있으며, 클라이언트에서 서버로 쿠키를 다시 전송할 수도 있다.
쿠키로 상태유지
http는 무상태성(Stateless) 특징을 가진다. 즉, 정보를 저장하지 않는데 어떻게 장바구니나 검색 기록 등을 저장하는 것인가? 바로 쿠키 덕분인데. 서버가 일방적으로 클라이언트에 전달하는 작은 데이터이다.
장기간 저장해야하는 정보에 적합하다.
로그인시 아이디 비번 기억하는것 , 로그인유지 , 장바구니 등 로그인같은 민감한 정보는 암호화되어 저장된다.
로그인
클라이언트가 서버에게 권한을 받기위해 서버에게 인증을한다.(로그인,휴대폰인증 등) 인증을 성공한 상태가 된것을 세션이라 한다.
세션이 만들어지면, 고유한 세션 아이디값도 클라이언트에게 전달하여 쿠키에 저장한다.
쿠키를 통해 유효한 세션 아이디가 서버에 전달되고 → 세션 스토어에 해당 세션이 존재한다면 → 서버는 해당 요청에 접근 가능하다고 판단
로그아웃
세션기반인증은 불의를 방지하여 로그아웃 이 필요하다
서버는 세션 정보를 삭제해야하고 클라이언트는 삭제된 것을 쿠키에 갱신해야 한다.
express-session 모듈로 세션을 설정 할 수 있다.
secret
옵션의 비밀키를 이용해 암호화해 세션 id라는 것을 생성한다. 그리고 이것을 클라이언트에게 쿠키로 전송한다.
const express = require('express');
const session = require('express-session');
const app = express();
app.use(
session({
secret: '@codestates',
resave: false,
saveUninitialized: true,
cookie: {
domain: 'localhost',
path: '/',
maxAge: 24 * 6 * 60 * 10000,
sameSite: 'none',
httpOnly: false,
secure: true,
},
})
);