-
[인증/보안] SessioncodeStates front-end/node(server) 2023. 3. 8. 19:56반응형
목차
📌 Session
📍Session
쿠키는 클라이언트에 정보를 저장하는 방식
세션은 데이터를 서버에 저장하고 쿠키에는 데이터에 대한 아이디만 암호화된 상태로 부여한다
세션기반 인증 (Session-based Authentication) - 로그인
- 서버 : 사용자가 로그인을 한 것을 알고 있어야한다
- 클라이언트 : 인증 성공을 증명할 수단을 갖고 있어야 한다
❗️❗️이때, 사용자가 인증에 성공한 상태를 세션이라한다.
서버는 일종의 저장소에 세션 또는 세션 저장소(DB)을 저장
👉🏻👉🏻 웹사이트에서 로그인을 유지하는 수단으로 쿠키를 사용한다.
쿠키에는 서버에서 발급한 세션 아이디를 저장한다.
[인증/보안] Cookie
HTML 삽입 미리보기할 수 없는 소스 📌 Cookie 📍 Cookie 서버에서 클라이언트에 영속성있는 데이터를 저장하는 방법 서버는 클라이언트의 쿠키를 이용하여 데이터를 가져올 수 있다 http 프로토콜
hwantech.tistory.com
세션기반 인증 (Session-based Authentication) - 로그아웃
세션 아이디가 담긴 쿠키는 클라이언트에 저장되어 있어, 서버는 세션을 저장
서버는 세션 아이디로만 인증 여부를 판단
주의: 쿠키는 세션 아이디, 즉 인증 성공에 대한 증명을 갖고 있으므로, 탈취될 경우 서버는 해당 요청이 인증된 사용자의 요청이라고 판단합니다. 이것이, 우리가 공공 PC에서 로그아웃해야 하는 이유이다.
- 서버: 세션 정보를 삭제
- 클라이언트: 쿠키를 갱신하거나 삭제
express-session
express 서버에서는 쉽게 세션을 위한 공간을 다룰 수 있도록 만들어 놓았다.
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, }, }) );
🔗 [실습] 세션을 활용하여 로그인 상태 유지
대부분의 코드는 cookie와 비슷하므로 한번 더 링크를 올린다.
[인증/보안] Cookie
HTML 삽입 미리보기할 수 없는 소스 📌 Cookie 📍 Cookie 서버에서 클라이언트에 영속성있는 데이터를 저장하는 방법 서버는 클라이언트의 쿠키를 이용하여 데이터를 가져올 수 있다 http 프로토콜
hwantech.tistory.com
튜토리얼
쿠키 튜토리얼때와 로직은 비슷하다
세션의 쿠키 옵션 설정
server/index.js
express 미들웨어에서 쉽게 세션 공간을 만들어 놓았다.
app.use( session({ secret: '@codestates', resave: false, saveUninitialized: true, cookie: { domain: 'localhost', path: '/', httpOnly: true,
session은 req.session을 사용해 세션 객체에 userInfo.id를 저장
// 이번에는 쿠키 튜토리얼과 다르게 res가 아니라 req에 작성해야됩니다. 정해진 사용법이니 주의!! req.session.sessionId = userInfo.id
server/login 구현
server/controllers/users/login.js
const { USER_DATA } = require('../../db/data'); module.exports = (req, res) => { const { userId, password } = req.body.loginInfo; const { checkedKeepLogin } = req.body; const userInfo = { ...USER_DATA.filter((user) => user.userId === userId && user.password === password)[0], }; // session 옵션은 index.js 저장 if (!userInfo.id) { res.status(401).send('Not Authorized'); } else if (checkedKeepLogin) { //session은 req를 사용하니 주의! req.session.userId = userInfo.id; req.session.cookie.maxAge = 24 * 6 * 60 * 10000; // 로그인 정보를 저장하기 위해 redirect 사용 res.redirect('/userinfo'); } else { req.session.userId = userInfo.id; console.log(req.session) res.redirect('/userinfo'); } };
server/controllers/users/useInfo.js
const { USER_DATA } = require('../../db/data'); module.exports = (req, res) => { console.log(req.session) const userInfo = USER_DATA.filter((user) => user.id === req.session.userId)[0]; if (!userInfo) { res.status(401).send('Not Authorized'); } else { res.json({ ...userInfo, password: undefined }); } };
server/controllers/users/logout.js
// 이 소스 만능 req.session.destroy() res.status(205).send('Logged Out Successfully');
반응형'codeStates front-end > node(server)' 카테고리의 다른 글
[인증/보안] OAuth (0) 2023.03.09 [인증/보안] Token (0) 2023.03.08 [인증/보안] Cookie (0) 2023.03.07 [네트워크] 심화, TCP/IP, 네트워크 계층 모델, OSI 7계층 모델, ... (0) 2023.03.06 웹 표준 & 접근성 (0) 2023.02.28