클라이언트 인증 시 필요한 보안 조치를 추가해야 함
-> 재인증
CSRF(Cross Site Request Forgery)
ex)
글제목 : 관리자님 억울해요
글내용 :
<form id="hongForm" style="display:none" method="post" action="/post/save" >
<input type="hidden" name="title" value="회비 계좌 확인 요합니다">
<input type="hidden" name="id" value="admin">
<input type="hidden" name="content" value="이번 모임의 회비 납부 안내입니다<br>국민은행 01-0123-1234 홍길동">
<input type="submit">
</form>
<script>
document.getElementById('hongForm').submit();
</script>
admin이 이 글을 보기 위해 클릭하면 관리자 인증과 권한으로 글이 작성됨
글쓰기 화면에서 작성한 글과 위 js 같은 글로 들어온 쓰기 요청을 구별해야 함
글쓰기 화면에 선행되어야 하는 요청을 ejs에 보냄
이때 csrf 토큰 발부(긴 문장으로 이루어짐)
submit 버튼을 클릭했을 때 casrf 토큰이 같이 들어오게 함
해커가 csrf 토큰을 스니핑하여 토큰까지 넘어가게 js 작성할 수도 있음
-> 토큰은 일회용으로 사용 후 파기해야 함
...
const crypto = require('crypto');
...
//로그인 된 사용자만 글쓰기 화면 보여주기
router.get("/post/enter", function (req, res) {
if (req.session.user) {
req.session.csrf_token=crypto.randomBytes(32).toString('hex');
res.render("post/enter.ejs", { data: { id: req.session.user.userid }, csrf_token:req.session.csrf_token });
// csrf 토큰을 보내서 render
} else {
res.render("index.ejs", { data: { alertMsg: "로그인 먼저 해주세요" } });
}
});