1. 클라이언트가 페이지를 요청
2. 서버에서 쿠키를 생성
3. HTTP 헤더에 쿠키를 포함 시켜 응답
4. 브라우저가 종료되어도 쿠키 만료 기간이 있다면 클라이언트에서 보관하고 있음
5. 같은 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보냄
6. 서버에서 쿠키를 읽어 이전 상태 정보를 변경 할 필요가 있을 때 쿠키를 업데이트 하여 변경된 쿠키를 HTTP 헤더에 포함시켜 응답
npm install cookie-parser // 쿠키설치
const cookieParser = require('cookie-parser')
//일반쿠키 사용
app.use(cookieParser());
//cookie 옵션
const cookieConfig = {
httpOnly : true,
maxAge : 60 * 1000
};
//메인페이지
app.get('/', (req,res)=>{
res.render('index');
};
app.get('/setCookie', (req,res)=>{
//쿠키이름, 쿠키값, 옵션객체 순서로 옴
res.cookie('myCookie','myValue',cookieConfig);
res.send('set Cookie');
}
httpOnly
: 웹 서버를 통해서만 쿠키에 접근 가능, 자바스크립트에서 document.cookie
를 이용해서 쿠키에 접속하는 것을 차단maxAge
: 쿠키의 수명을 나타냄, 밀리초 단위expires
: 만료날짜를 GMT 시간으로 설정path
: 해당 디렉토리와 하위 디렉토리에서만 경로가 활성화 되고 웹 브라우저는 해당하는 쿠키만 웹 서버에 전송 즉, 쿠키가 전송될 URL 특정 가능(기본값: '/')domain
: 쿠키가 전송될 도메인을 특정 가능(기본값: 현재 도메인) -> 자주안씀secure
: 웹 브라우저와 웹 서버가 https로 통신하는 경우에만 쿠키를 서버에 전송 -> 자주씀signed
: 쿠키의 암호화를 결정(req.signedCookies 객체에 들어있음)//일반쿠키 사용
//app.use(cookieParser());
//암호화 쿠키
app.use(cookieParser("newJeans"))
//cookie 옵션
const cookieConfig = {
httpOnly : true,
maxAge : 60 * 1000,
signed : true, // 암호화 결정하는 옵션(req.signedCookies 객체에 들어있음)
};
//메인페이지
app.get('/', (req,res)=>{
res.render('index');
};
app.get('/getCookie', (req, res)=>{
// res.send(req.cookies);
res.send(req.signedCookies); //암호화쿠키
})
app.get('/clearCookie', (req,res)=>{
res.clearCookie('myCookie','myValue',cookieConfig)
// 쿠키이름, 쿠키값, 옵션객체값이 똑같아야 삭제됨
res.send('clear cookie');
얘는 부트스트랩 복붙
모달창 X 표시 id값 = close
오늘 그만보기 왼쪽에 체크박스 id = btn
isChecked
라는 변수에 저장되게 설정axios
방식으로 data
에 아까 저장한 체크박스 옵션(true, false)값을 보냄req.body.checked
에 담겨잇음true 일때 정상적으로 쿠키가 부여되는 것을 볼 수 있음
물론 false면 아무일도 안 일어남
const express = require('express')
const session = require('express-session')
const cookieParser = require('cookie-parser');
const app = express();
const PORT = 8000;
app.use(cookieParser());
app.use(session({
//세션 옵션설정
secret:'newJeans',
secure : false,
resave: false,
saveUninitialized : true,
cookie:{
httpOnly:false,
maxAge: 60*60*24,
}
}));
app.get('/', (req, res)=>{
//세션설정 req.session.키
req.session.name = '홍길동'
res.send("세션 설정 완료")
})
app.get('/name', (req,res)=>{
res.send({id:req.sessionID, name: req.session.name})
})
app.get('/destroy', (req, res)=>{
req.session.destroy((err)=>{
return;
})
res.redirect('/name')
//개인정보 페이지에서 세션정보를 지우고 나가야되는데 그 페이지가
//계속유지되면 문제가 됨
})
app.listen(PORT, ()=>{
console.log(`http://localhost:${PORT}`)
})
/ | /name |
httpOnly
: 값을 true로 하면 사용자가 자바스크립트를 통해서 세션을 사용할 수 없도록 강제secure
: 값을 true로 하면 https에서만 세션을 주고 받음secret
: 안전하게 쿠키를 전송하기 위한 쿠키 서명 값resave
: 세션에 수정사항이 생기지 않더라도 매 요청(req)마다 세션에 저장할 것인지, 세션에 항상 저장할건지 지정하는 값(보통 false로 설정함)saveUninitialized
: 세션에 저장할 내역이 없더라도 처음부터 세션을 생성할지 설정메인화면, 로그인화면
로그인을 하면 메인화면이 로그인 한 사람의 name값과 로그아웃 버튼으로 바뀜
세션을 삭제하고 확인 버튼을 누른 뒤 홈화면을 새로고침하면 다시 원래 로그인 버튼이 생긴걸 볼 수 있음
(member
는 변수명이라 맘대로 설정하면됨)
(result[0]
은 로그인을 했을 때 axios에 data에 담겨서 오는 정보임, 배열로와서 [0]붙여준거임)
req.session.member
에 result[0]
값을 저장
res.local
을 사용하면 지역변수를 전역변수처럼 사용할 수 있게 해줌user_id
, name
변수에 값이 안 들어가 있어서 오류가 나기 때문에 빈 값을 넣어주었음req.session.member
에 값이 있으면(true) user_id
와 name
에 컨트롤러에서 저장해줬던 변수(req.session.member
)값을 저장함user_id
가 있으면 name
과 로그아웃
버튼을 보여줌user_id
가 없으면 로그인
버튼을 보여줌