#1 bcrypt란?
관리자 계정을 만들고 로그인하는 기능을 만드는 중 DB에 password 저장시 보안을 구현하기 위해 사용하는 기능을 정리해보았다.
bcrypt는 해쉬함수로 사용자의 비밀번호를 bcrypt로 여러번 해쉬 과정을 거쳐 암호화하여 보관한다.
#2 Mongoose의 미들웨어 활용
//스키마 생성 생략
userSchema.pre("save", async function(){
this.password = await bcrypt.hash(this.password, 3);
})
const User = mongoose.model("User", userSchema);
위 코드에서 this는, 스키마를 기반으로 새로 Create되는 User를 가르킨다.
두번째 인자로 오는 숫자는 몇번 암호화를 하는지에 대한 숫자이다.
#3 Form validation 위치
현재 프로젝트에서 form validation은 Controller에서 해준다.
React를 사용한다면 react-hook-form을 사용하는게 유용하다.
#4 로그인시 bcrypt 사용
compare method를 사용한다.
const check = await bcrypt.compare(password, user.password);
if(!check){
return res.status(400).render("login",
{
errorMessage: "아이디 혹은 비밀번호가 틀립니다."
});
}
return res.redirect("/");
#5 세션에 대하여
1. 정의
세션은 백엔드와 브라우저간 어떤 활동을 했는지 기억하는 것을 말한다.
백엔드는 기본적으로 요청을 처리하고 나면 연결이 끊어진다. 따라서 어떠한 처리가 없으면 이전 요청을 누가 보냈는지 등의 정보를 저장하지 않고, 브라우저 또한 기억하지 못한다.
이렇게 연결되었다가 끝나는 상태를 stateless라고 한다. FE와 BE 사이에 state가 없다는 의미.
2. 기능 개요
브라우저가 서버에 방문할 때, sesstion을 시작하는 코드(미들웨어)가 있다면, 서버에서 브라우저의 쿠키에 session id를 부여한다. 그리고 session storage에 해당 session에 대한 정보들을 담은 object를 저장한다.
브라우저가 서버에 요청을 보낼 때 마다 부여받은 session id를 함께 서버로 보낸다.
또 이 세션ID를 통해 session object에 추가적인 정보를 넣어줄 수 있다.
쿠키에 session 정보가 저장되는 이유는, 쿠키가 자동으로 서버에 정보를 전달하는 역할을 하기 때문.
3. express에서 session 사용하기
1) 설치
npm i express-session
2) 미들웨어 시작
3) template (해당 프로젝트는 ejs) 에서 req 정보에 접근하는 방법
=> res 내부에 locals이라는 빈 object가 있는데, 이는 template에서 접근할 수 있도록 설정되어있다.
4) connect mongo를 통해 세션을 MongoDB에 저장하는 설정
npm i connect-mongo
import MongoStore from "connect-mongo";
app.use(
session({
secret: "Hello!",
resave: false,
saveUninitialized: false,
store: MongoStore.create({mongoUrl:""}),
})
)
여기서 saveUninitialized를 true로 두면, 로그인하지 않은 익명 사용자들에 대해서 모두 session을 생성하게 된다. 이는 서버에 부하를 주게된다.
이 속성에 false를 두면, session이 수정되는 순간에만 세션을 db에 저장한다. 즉, 로그인 기능에서
//로그인 성공
req.session.loggedIn = true;
req.session.user = user;
return res.redirect("/");
위 구문이 실행된 순간에만 session이 생성된다는 뜻.
위와 같은 인증 방식이 session authentification이다. token을 사용하는 token authentification 방식도 있다.
#6 쿠키에 대하여
Name / Value / Domain / Path / Expire, Max-Age / Size / HttpOnly / Secure / SameSite / Partition Key / Priority
옵션들이 있다.
1. Domain : 해당 쿠키를 만든 backend의 주소를 저장.
여기에 저장되어있는 주소에 따라, 해당 쿠키 정보는 해당 주소로만 보내진다.
2. path : url
3. Expires : 만료에 대한 정보. "session"으로 저장되어있다면, 브라우저에서 프로그램을 닫으면 해당 쿠키가 사라진다.
Max-age : 만료 시간에 대한 정보. 아래와 같이 maxAge로 설정 가능
app.use(
session({
secret: "",
resave: false,
saveUninitialized: false,
cookie:{
maxAge: 10800000
},
store: MongoStore.create({mongoUrl:""}),
})
)
#7 환경 변수 설정
git 등에 중요 정보가 올라가지 않도록 해당 정보를 저장하는 파일을 따로 만드는 것.
.env로 만들고, 당연하게도 gitignore에 추가해줘야함.
관습적으로 환경 변수는 대문자로 써준다.
사용하기 위해서는 dot env라는 라이브러리 설치 필요
npm i dotenv
이후 파일에서 가장 먼저 dotenv를 require해줘야한다. 그렇지 않으면 미리 파일을 불러오지 못해 적용x.
이 프로젝트에서는 init.js 파일에서 해준다.
require("dotenv").config();
이를 위에서 import하는 방식으로 코드를 짠다.
import "dotenv/config";
//.env 파일 string 따옴표 없음.
DB_URL=urlcode
COOKIE_SECRIT=CODE
//접근할 파일
url = process.env.DB_URL
'프로젝트 기록 > 러시아어 사전 및 검색 웹' 카테고리의 다른 글
개발 과정 리뷰 -15- SummerNote 관련 (0) | 2024.03.25 |
---|---|
개발 과정 리뷰 -14- Status code 관련 개발 (0) | 2024.03.20 |
개발 과정 리뷰 -12- Mongoose 쿼리, 미들웨어 (0) | 2024.01.29 |
개발 과정 리뷰 -10- 형태소 추출 API 만들기(NestJS) (1) (0) | 2023.12.27 |
개발 과정 리뷰 -7- ejs와 html escape 개념 (0) | 2023.12.14 |