
req, res, 그리고 next 함수에 액세스 권한을 갖는 함수이다.
즉, Express내에서 우리가 작성하는 대부분의 코드는 미들웨어라고도 볼 수 있다.
next :
const express = require('express');
const app = express();
const port = 8080;
//GET http://localhost:8080/
app.get('/', (req, res, next) => {
console.log("1")
next()
})
app.get("/", (req, res, next) => {
console.log("2")
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
결과 값은 다음과 같다.
//console.log()
Example app listening on port 8080
1
2
next()가 다음 함수, route를 실행시킨다는 사실이다.const validate = (req,res,next) => {
const err = validationResult(req);
if (!err.isEmpty()) {
return res.status(400).json(err.array())
} else {
return next();
}
}
router
.route('/')
.get(
[
body('userId').notEmpty().isInt().withMessage('userId는 숫자여야 합니다.'),
validate
]
, (req, res,next) => {//채널 전체 조회
const { userId } = req.body;
let sql = `SELECT * FROM channels WHERE user_id = ?`
conn.query(sql, userId,
function (err, results) {
if (err) {
console.log(err);
return res.status(400).end();
}
if (results.length)
res.status(200).json(results)
else
notFoundChannel(res);
}
)
})
const express = require('express');
const router = express.Router();
const conn = require('../mariadb')
const { body,param, validationResult } = require('express-validator')
router.use(express.json()) // http 외 모듈 'json' 사용
const validate = (req,res,next) => {
const err = validationResult(req);
if (err.isEmpty()) {
return next();
} else {
return res.status(400).json(err.array())
}
}
// 로그인
router.post(
'/login',
[
body('email').notEmpty().isEmail().withMessage('올바른 이메일 형식을 입력해주세요'),
body('password').notEmpty().isString.withMessage('비밀번호 확인 필요'),
validate
],
function (req, res) {
const { email, password } = req.body;
let loginUser = {};
let sql = `SELECT * FROM users WHERE email = ?`
conn.query(sql,email,
function (err, results) {
if (err) {
console.log(err);
return res.status(400).end();
}
loginUser = results[0];
if (loginUser && loginUser.password === password) { //email이 db에 저장된 회원인지 확인
res.status(200).json({
message: `${loginUser.name}님 로그인 되었습니다.`
})
}
else {
res.status(404).json({
message : "이메일 또는 비밀번호가 틀렸습니다"
})
}
}
);
})
// 회원 가입
router.post(
'/join',
[
body('email').notEmpty().isEmail().withMessage('올바른 이메일 형식을 입력해주세요'),
body('name').notEmpty().isString.withMessage('이름 확인 필요'),
body('password').notEmpty().isString.withMessage('비밀번호 확인 필요'),
body('contact').notEmpty().isString.withMessage('연락처 확인 필요'),
validate
],
function (req, res) {
const { email, name, password, contact } = req.body;
let sql = `INSERT INTO users (email, name, password, contact) VALUES (?, ?, ?, ?)`;
let values = [email, name, password, contact];
conn.query(sql,values,
function (err, results, fields) {
if (err) {
console.log(err);
return res.status(400).end();
}
res.status(201).json(results);
}
)
});
router
.route('/users')
.get(//회원 개별 조회
[
body('email').notEmpty().isEmail().withMessage('올바른 이메일 형식을 입력해주세요'),
validate
],
function (req, res) {
let { email } = req.body;
let sql = `SELECT * FROM users WHERE email = ?`
conn.query(sql,email,
function (err, results, fields) {
if (err) {
console.log(err);
return res.status(400).end();
}
res.status(200).json(results)
}
);
})
.delete( //회원 탈퇴
[
body('email').notEmpty().isEmail().withMessage('올바른 이메일 형식을 입력해주세요'),
validate
],
function (req, res) {
let { email } = req.body;
let sql = `DELETE FROM users WHERE email = ?`
conn.query(sql, email,
function (err, results, fields) {
if (err) {
console.log(err);
return res.status(400).end();
}
if (results.affectedRows === 0) {
return res.status(400).end();
} else {
res.status(200).json(results)
}
}
);
})
module.exports = router // 모듈화 진행

인증 ( = 로그인)
인가
쿠키
세션
개념
JSON 형태의 데이터를 안전하게 전송하기 위한 (웹에서 사용하는) 토큰장점

1. 로그인 요청 (인증)
2. 서버에서 자격 증명 확인
3. JWT 반환
4. 인가 요청
5. 서버에서 JWT 확인
6. 인가 처리
7. JWT 만료 및 갱신
요약
사용자 로그인 → 서버에서 JWT 발급
클라이언트는 JWT를 저장하고, 이후 요청에 JWT를 포함
서버는 JWT를 확인하고, 유효하면 요청 처리

npm install jsonwebtoken
var jwt = require('jsonwebtoken');
var token = jwt.sign({ foo: 'bar' }, 'shhhhh');
//token 생성 = jwt 서명을 했다. (페이로드, 나만의 암호키) + SHA256
console.log(token);
// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE3MjcyNTk2NzR9.bMtomWZJnk2UjLV4KSIN-sIM8pp4nl1-MyoDafoOMf4
// 검증
// 만약 검증에 성공하면, 페이로드 값을 확인할 수 있음
let decoded = jwt.verify(token, 'shhhhh');
console.log(decoded);
// { foo: 'bar', iat: 1727259674 }
shhhhh 암호키를 안전하게 사용해보자var jwt = require('jsonwebtoken');
var privateKey = 'shhhhh';
var token = jwt.sign({ foo: 'bar' }, privateKey);
//token 생성 = jwt 서명을 했다. (페이로드, 나만의 암호키) + SHA256
console.log(token);
// 검증
// 만약 검증에 성공하면, 페이로드 값을 확인할 수 있음
let decoded = jwt.verify(token, privateKey);
console.log(decoded);
.env (environment 환경 변수 설정 값) 이용하기.envdotenv 모듈을 사용해서 쓰자npm을 통해 dotenv를 설치후 패키지 최상위 경로에 .env 파일을 생성한 후 저장할 데이터들을 작성한다.var jwt = require('jsonwebtoken');
require('dotenv').config({ path: './.env' });
console.log('Private Key:', process.env.PRIVATE_KEY);
var token = jwt.sign({ foo: 'bar' }, process.env.PRIVATE_KEY);
//token 생성 = jwt 서명을 했다. (페이로드, 나만의 암호키) + SHA256
console.log(token);
// 검증
// 만약 검증에 성공하면, 페이로드 값을 확인할 수 있음
let decoded = jwt.verify(token, process.env.PRIVATE_KEY);
console.log(decoded);
const express = require('express');
const router = express.Router();
const conn = require('../mariadb');
const { body, param, validationResult } = require('express-validator');
//jwt, dotenv 모듈설정
const jwt = require('jsonwebtoken');
const dotenv = require('dotenv')
dotenv.config();
router.use(express.json()); // http 외 모듈 'json' 사용
const validate = (req,res,next) => {
const err = validationResult(req);
if (err.isEmpty()) {
return next();
} else {
return res.status(400).json(err.array())
}
}
// 로그인
router.post(
'/login',
[
body('email').notEmpty().isEmail().withMessage('올바른 이메일 형식을 입력해주세요'),
body('password').notEmpty().isString().withMessage('비밀번호 확인 필요'),
validate
],
function (req, res) {
const { email, password } = req.body;
let loginUser = {};
let sql = `SELECT * FROM users WHERE email = ?`
conn.query(sql,email,
function (err, results) {
if (err) {
console.log(err);
return res.status(400).end();
}
loginUser = results[0];
if (loginUser && loginUser.password === password) { //email이 db에 저장된 회원인지 확인
//토큰 발행
const token = jwt.sign({
email: loginUser.email,
name: loginUser.name
}, process.env.PRIVATE_KEY);
res.cookie("token", token);
res.status(200).json({
message: `${loginUser.name}님 로그인 되었습니다.`,
token: token
})
}
else {
res.status(404).json({
message : "이메일 또는 비밀번호가 틀렸습니다"
})
}
}
);
})
*res*.cookie("token", token); 을 통해 쿠키를 만들수 있다.
Cookie의 속성
다음과 같이 설정 변경이 가능하다.
res.cookie("token", token, {
httpOnly:true
});
다음과 같이 유효시간과 발행자를 설정해줄수 있다.
const token = jwt.sign({
email: loginUser.email,
name: loginUser.name
}, process.env.PRIVATE_KEY, {
expiresIn: '30m',
issuer: "ssommae"
});