(Node.js 개발자 되기) 5. HTTP 프로토콜 속성과 세션 및 쿠키 HTTP 프로토콜 세션과 쿠키를 설명하기 전에 HTTP 프로토콜의 속성을 살펴보겠습니다. HTTP 프로토콜은 비연결 지향적입니다. 즉, 클라이언트와 서버가 대화(요청, 응답)를 교환합니다. pventi.tistory.com
알림을 구현하도록 FE 부분이 수정되었습니다.
.

상단의 내비게이션 바를 보시면 로그인 기능과 펜촉 기능(포스트 작성)이 있습니다.
다른 사람이 게시하도록 허용하면 홈페이지가 원치 않는 텍스트로 뒤덮입니다. 그러기 위해서는 회원가입을 통해 이용자를 확보하고 승인된 이용자만이 글을 작성하고 답글을 달 수 있도록 해야 합니다.
첫 번째 세션
이전 기사에서 우리는 세션에 대해 배웠습니다. 회원가입을 하고 DB에 정보를 저장해도 세션을 추가하지 않고는 가입상태를 유지할 수 없습니다.
1.1 쿠키 파서, 익스프레스 세션
npm i cookie-parser express-session
Express Session을 사용하려면 쿠키가 필요합니다.
파일 경로: index.js
const cookieParser = require('cookie-parser')
const session = require('express-session')
// .env file에 저장한 쿠키, 세션 키
const { SECRET_KEY_CS } = process.env;
...
app.use(cookieParser(SECRET_KEY_CS));
app.use(session({
secret : SECRET_KEY_CS,
resave : false,
saveUninitialized : false,
cookie : {
httpOnly : true,
secure : false
}
}))
비밀: 쿠키에 서명 추가
resave: 세션이 변경되지 않은 경우에도 세션을 다시 저장할지 여부입니다.
saveUninitialized: 세션에 저장할 항목이 없는 경우에도 처음부터 세션을 설정할지 여부입니다.
쿠키
> httpOnly(보안): 스크립트(XSS)를 통한 쿠키 도용 방지
> 보안 : https를 사용하지 않는 사이트에 대한 쿠키 전송 방지
1.2 로그인
이 장에서는 데이터베이스가 필요한 회원 등록 기능(회원 정보 저장) 없이 세션이 유지되는지 여부만 확인합니다.
파일 경로: 경로/표지판/router.js
...
router.get("/login", (req, res, next) => {
const { username, password } = req.body;
if(!req.session.user) {
req.session.user = {
id : username,
pw : password,
name : username,
authorized : true
}
}
res.status(200).render('index', { username })
})
자격 증명을 요청할 때 요청은 메일로 이루어지므로 req.body에서 사용자 이름과 암호를 검색합니다. 회원 정보는 데이터베이스에 별도로 저장되지 않기 때문에 인증 없이 세션에 값이 없으면 세션에 사용자 정보가 채워집니다. (실제로 세션 값을 설정하기 전에 사용자가 권한이 있는지 확인하는 코드가 있습니다.)
1.3 탈퇴
파일 경로: 경로/표지판/router.js
router.get('/logout', (req, res, next) => {
if(req.session.user){
req.session.destroy();
}
res.status(200).render(index, { username : undefined })
})
세션 삭제는 쉽습니다. 파괴 기능단순히 세션을 삭제하고 로그인 연결을 끊습니다.
2 결과

상단 내비게이션 바를 확인해보면 로그인 버튼이 사용자 이름 및 로그아웃 버튼으로 변경된 것을 확인할 수 있습니다.
GitHub – dotredbee/rest-basic: Rest-Basic-Server 1
Rest-Basic 서버 1. GitHub에서 계정을 생성하여 dotredbee/rest-basic 개발에 기여합니다.
github.com