HTTP의 특징중 하나는상태없음(stateless)- HTTP 요청을 통해 데이터를 주고 받을 때 요청이 끝나면 요청한 사용자의 정보 등을 유지하지 않는 특징
- 따라서 요청을 할 때 마다 서버에 연결을 해야한다.
방문자가 웹서버에 접속해 있는 상태를 하나의 단위로 보고 그것을
session이라고 함
웹서버는 이러한 각 단위에 세션 ID를 부여하고 같은 브라우저인지 구별한다.
브라우저를 닫거나 서버에서 이 세션 ID가 들어있는 쿠키를 삭제했을 때 삭제가 된다.
session을 사용한다고 해서 cookie를 안쓰는게 아니라 cookie에 중요 정보를 넣지 않았기 때문에 탈취 되더라도 해석이 의미없는 문자열인 세션ID가 들어있다.
세션 : 서버와 클라이언트의 연결이 활성화된 상태세션ID : 웹 서버 또는 DB에 저장되는 클라이언트의 유니크한 ID
Login 요청을 한다.login인증 을 하고 정보가 올바르면 세션 객체를 생성하고 세션 ID를 Set-cookie를 통해 클라이언트에게 전달한다.요청 헤더에 세션 ID 가 같이 전달된다 (쿠키이므로 통신시 계속 왔다갔다함)요청헤더에 세션ID를 확인해서 세션 객체를 검색하고 정보가 있으면 요청한 작업에 대해 응답해주고 통신을 종료한다.오버헤드 어떤 작업을 수행할 때 추가적인 비용이나 부담바이트 스트림 데이터를 연속적인 바이트들로 처리하는 방식, 데이터의 형식과 내용을 구분하지 않고 순차적으로 다룬다.직렬화 오버헤드 데이터나 객체를 직렬화하려면 해당 데이터를 바이트 스트림으로 변환해야 하는데 이 작업은 CPU 연산 및 메모리 할당을 필요로 한다.역직렬화 오버헤드 직렬화된 데이터를 역직렬화 하려면 바이트 스트림을 다시 원래의 데이터 구조로 변환해야 한다. 이 작업 역시 CPU 연산과 메모리 할당이 필요
// 사용자가 보낸 값을 보안을 위해 escape하기 위한 모듈입니다. // 예를 들어 foo&bar>>foo&bar 로 바꿉니다.
const escapeHtml = require('escape-html')
const express = require('express')
const session = require('express-session')
const app = express()
// 박종선바보멍청이 >> SHA256 >>
// 9e8821c8ef4ab43ba09310af54e98caedc13e314efdea720bf513b9b3675faf4 app.use(session({
name: "session-id",
secret:
"9e8821c8ef4ab43ba09310af54e98caedc13e314efdea720bf513b9b3675faf4"
,
resave: false,
saveUninitialized: false
}))
// 미들웨어 : auth
const isAuthenticated = (req,res, next) =>{
// 만약 세션이 있다면 다음 미들웨어로. 그게 아니라면. 다음 route로 제어권을 넘깁니다.
if (req.session.user) next()
else next('route') }
// 만약 isAuthenticated 하다면 logout을 보여준다. app.get('/', isAuthenticated, function (req, res) {
res.send(escapeHtml(req.session.user) + '님 환영합니다!') })
// 만약 isAuthenticated 하지 않다면 login을 보여준다. app.get('/', function (req, res) {
res.send('<p>로그인</p><form action="/login" method="post">' + 'Username: <input name="user"><br>' +
'Password: <input name="pass" type="password"><br>' + '<input type="submit" text="Login"></form>')미들웨어
여러가지 페이지들이 있을 것이다. 로그인을 무조건 해야 내가 만든 서비스를 이용하게 만든다. ⇒ 페이지마다 확인하는걸 만들 수 있지만 불편하다. 우리 서비스에 들어오는 모든 요청에 대해 어떤 미들웨어를 두는 것 이걸 기반으로 로그인 했는지 안했는지 알 수 있다.
stateless 하게 만들자는 이론이 담긴 방식JWT토큰 이 활용된다.

해시함수 와 솔트(salt) 사용한다.해시 함수 비밀번호와 같은 입력 데이터를 고정된 길이의 임의의 값으로 변환하는 함수다이제스트 라고 한다
키 스트레칭솔트 해시화된 비밀번호를 더 안전하게 만들기 위해 사용되는 임의의 값 소금친다
refresh토큰과 access토큰 을 기반으로 구현한다.refresh토큰 은 access토큰이 만료되었을 때 다시 access 토큰을 얻기 위해 사용되는 토큰
HTTP Header - Authorization 또는 HTTP Header - Cookie에 담아 요청을 하게 되는데 이 때 다음과 같은 규칙을 지키는 것이 좋다참고
https://80000coding.oopy.io/1f213f10-185c-4b4e-8372-119402fecdd0
https://st-lab.tistory.com/100
https://brilliantdevelop.tistory.com/33
https://code-lab1.tistory.com/321#google_vignette
https://blog.skby.net/l4-스위치와-l7-스위치-비교/
https://m.post.naver.com/viewer/postView.naver?volumeNo=27046347&memberNo=2521903