728x90
✓ 인증서 파일이 존재해야 합니다
$ mkcert -install
$ mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1
✓ 환경 변수에 데이터베이스 비밀번호가 존재해야 합니다.
DATABASE_PASSWORD= 비밀번호
DATABASE_PASSWORD= 비밀번호
✓ 성공적으로 데이터베이스에 연결해야 합니다
npm install --save-dev sequelize-cli
npx sequelize-cli init
npx sequelize-cli db:migrate
✓ 데이터베이스에 `Users` 테이블이 존재해야 합니다
npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string
✓ 로그인 요청시 잘못된 사용자 아이디 혹은 비밀번호를 전달할 경우, `not authorized` 메세지가 응답에 포함되어야 합니다.
✓ 로그인 요청시 정확한 사용자 아이디와 비밀번호를 전달할 경우, `ok` 메세지가 응답에 포함되어야 합니다
✓ 세션 아이디를 전달하기 위한 `connect.sid` 쿠키가 존재해야 합니다 (이 쿠키는 express-session 모듈이 만듭니다)
// 해당 모델의 인스턴스를 models/index.js에서 가져옵니다.
const { Users } = require('../../models')
module.exports = {
post: async (req, res) => {
// userInfo는 유저정보가 데이터베이스에 존재하고, 완벽히 일치하는 경우에만 데이터가 존재합니다.
// 만약 userInfo가 NULL 혹은 빈 객체라면 전달받은 유저정보가 데이터베이스에 존재하는지 확인해 보세요
const userInfo = await Users.findOne({
where: { userId: req.body.userId, password: req.body.password },
})
// TODO: userInfo 결과 존재 여부에 따라 응답을 구현하세요.
// 결과가 존재하는 경우 세션 객체에 userId가 저장되어야 합니다.
if (!userInfo) {
// 로그인 요청시 잘못된 사용자 아이디 혹은 비밀번호를 전달할 경우,
// `not authorized` 메세지가 응답에 포함되어야 합니다.
res.send({ message: 'not authorized' })
// your code here
} else {
// your code here
// HINT: req.session을 사용하세요.
// 로그인 요청시 정확한 사용자 아이디와 비밀번호를 전달할 경우, `ok` 메세지가 응답에 포함되어야 합니다
// 세션 아이디를 전달하기 위한 `connect.sid` 쿠키가 존재해야 합니다 (이 쿠키는 express-session 모듈이 만듭니다)
req.session.userId = userInfo.userId
res.status(200).send({ message: 'ok' })
}
},
}
✓ 쿠키 옵션중 Domain 옵션은 `localhost`로 설정되어야 합니다
✓ 쿠키 옵션중 Path 옵션은 `/`로 설정되어야 합니다
✓ 쿠키 옵션중 HttpOnly 옵션이 설정되어야 합니다
✓ 쿠키 옵션중 Secure 옵션이 설정되어야 합니다
✓ 쿠키 옵션중 SameSite 옵션은 `none`으로 설정되어야 합니다
app.use(
session({
// ✓ 쿠키 옵션중 Domain 옵션은 `localhost`로 설정되어야 합니다
// ✓ 쿠키 옵션중 Path 옵션은 `/`로 설정되어야 합니다
// ✓ 쿠키 옵션중 HttpOnly 옵션이 설정되어야 합니다
// ✓ 쿠키 옵션중 Secure 옵션이 설정되어야 합니다
// ✓ 쿠키 옵션중 SameSite 옵션은 `none`으로 설정되어야 합니다
secret: '@codestates',
resave: false,
saveUninitialized: true,
cookie: {
domain: 'localhost',
path: '/',
maxAge: 24 * 6 * 60 * 10000,
sameSite: 'none',
httpOnly: true,
secure: true,
},
})
)
login.js
✓ 로그인 이후 로그아웃를 요청하는 경우, 상태코드 200을 리턴해야 합니다
// 해당 모델의 인스턴스를 models/index.js에서 가져옵니다.
const { Users } = require('../../models')
module.exports = {
post: async (req, res) => {
// userInfo는 유저정보가 데이터베이스에 존재하고, 완벽히 일치하는 경우에만 데이터가 존재합니다.
// 만약 userInfo가 NULL 혹은 빈 객체라면 전달받은 유저정보가 데이터베이스에 존재하는지 확인해 보세요
const userInfo = await Users.findOne({
where: { userId: req.body.userId, password: req.body.password },
})
// TODO: userInfo 결과 존재 여부에 따라 응답을 구현하세요.
// 결과가 존재하는 경우 세션 객체에 userId가 저장되어야 합니다.
if (!userInfo) {
// 로그인 요청시 잘못된 사용자 아이디 혹은 비밀번호를 전달할 경우,
// `not authorized` 메세지가 응답에 포함되어야 합니다.
res.send({ message: 'not authorized' })
// your code here
} else {
// your code here
// HINT: req.session을 사용하세요.
// 로그인 요청시 정확한 사용자 아이디와 비밀번호를 전달할 경우, `ok` 메세지가 응답에 포함되어야 합니다
// 세션 아이디를 전달하기 위한 `connect.sid` 쿠키가 존재해야 합니다 (이 쿠키는 express-session 모듈이 만듭니다)
req.session.userId = userInfo.userId
res.status(200).send({ message: 'ok' })
}
},
}
Reference
const { Users } = require('../../models');
module.exports = {
post: async (req, res) => {
const userInfo = await Users.findOne({
where: { userId: req.body.userId, password: req.body.password },
});
// TODO: userInfo 결과 존재 여부에 따라 응답을 구현하세요.
// 결과가 존재하는 경우 세션 객체에 userId가 저장되어야 합니다.
if (!userInfo) {
// your code here
res.status(400).send({ data: null, message: 'not authorized' });
} else {
// your code here
// HINT: req.session을 사용하세요.
req.session.save(function () {
req.session.userId = userInfo.userId;
res.json({ data: userInfo, message: 'ok' });
});
}
}
}
logout.js
어째서인지 res.session.destroy()를 사용하지 않아도 테스트 케이스는 통과가 된다.
module.exports = {
post: (req, res) => {
// TODO: 세션 아이디를 통해 고유한 세션 객체에 접근할 수 있습니다.
// 앞서 로그인시 세션 객체에 저장했던 값이 존재할 경우, 이미 로그인한 상태로 판단할 수 있습니다.
// 세션 객체에 담긴 값의 존재 여부에 따라 응답을 구현하세요.
if (!req.session.userId) {
// your code here
res.status(400).send({ message: 'not authorized' })
} else {
res.status(200).send({ message: 'ok' })
// your code here
// TODO: 로그아웃 요청은 세션을 삭제하는 과정을 포함해야 합니다.
}
},
}
Reference
module.exports = {
post: (req, res) => {
// TODO: 세션 아이디를 통해 고유한 세션 객체에 접근할 수 있습니다.
// 앞서 로그인시 세션 객체에 저장했던 값이 존재할 경우, 이미 로그인한 상태로 판단할 수 있습니다.
// 세션 객체에 담긴 값의 존재 여부에 따라 응답을 구현하세요.
if (!req.session.userId) {
res.status(400).send({ data: null, message: 'not authorized' });
} else {
req.session.destroy();
res.json({ data: null, message: 'ok' });
}
},
};
userinfo.js
const { Users } = require('../../models')
module.exports = {
get: async (req, res) => {
// TODO: 세션 객체에 담긴 값의 존재 여부에 따라 응답을 구현하세요.
// HINT: 세션 객체에 담긴 정보가 궁금하다면 req.session을 콘솔로 출력해보세요
if (!req.session.userId) {
// your code here
res.status(400).send({ message: 'not authorized' })
} else {
// your code here
// TODO: 데이터베이스에서 로그인한 사용자의 정보를 조회한 후 응답합니다.
res.status(200).send({ message: 'ok' })
}
},
}
Reference
const { Users } = require('../../models');
module.exports = {
get: async (req, res) => {
// TODO: 세션 객체에 담긴 값의 존재 여부에 따라 응답을 구현하세요.
// HINT: 세션 객체에 담긴 정보가 궁금하다면 req.session을 콘솔로 출력해보세요
if (!req.session.userId) {
res.status(400).send({ data: null, message: 'not authorized' });
} else {
const result = await Users.findOne({
where: { userId: req.session.userId },
}).catch((err) => res.json(err));
res.status(200).json({ data: result, message: 'ok' });
}
},
};
728x90
'스프린트 > im-sprint-auth-session' 카테고리의 다른 글
im-sprint-auth-session-client (0) | 2021.11.22 |
---|