멘토링 피드백
질문1
mysql과 redis의 데이터싱크 불일치
- redis는 key 설정이 중요하다 현재 req originalUrl을 key로 설정했음, 캐시를 체크하는 미들웨어는 redis에 originalUrl로 설정한 key의 데이터가 존재하면 무조건 다음 미들웨어로 넘어감 그래서 mysql과 데이터 싱크가 일치하지 않더라도 이전에 호출된 데이터 캐시가 존재하면 그 데이터를 redis에서 반환함 => 임베딩 데이터 관리방법?
- 피드백 : 새로운 데이터가 추가 되었을때 redis 데이터의 해시를 조회하고 새로운 데이터를 넣어줌
- 캐싱이 필요한 주소에 선택적으로 캐싱 => 자주호출 되는 메인화면이나 특정 데이터 들에 대해서만 캐싱을 구현
질문2
세션데이터가 redis에 입력되지 않음(질문못함)
- 그냥 세션을확인하느 미들웨어를 빼고 세션설정 미들웨어만 남겨야함?
추가피드백
XSS , CSRF방지
xss(Cross-Site Scripting 크로스 사이트 스크립팅)
- 사용자가 입력할 수 있는 폼이나 URL의 파라미터값을 통해 악의적인 코드를 삽입해 쿠리를 갈취하거나 악성코드를 실행하는것을 의미 => 유저가 피해를 받음
- 주로 여러사용자가 보게 되는 게시판에 악성스크립트가 담긴 글을 올리는 형태로 이뤄
막는방법
스크립트태그를 일반 텍스트로 변환
- 입력된 HTML 태그를 이스케이프하여 태그가 그대로 출력되지 않고 일반 텍스트로 처리 이렇게 함으로써 웹 애플리케이션에서 사용자가 입력한 HTML이 그대로 실행되는 것을 방지하고, 안전한 출력을 제공
var xss = require('xss');
var html = xss('<script>alert("xss");</script>');
console.log(html);
helmet 모듈 사용하기
- helmet은 express에서 사용하는 보안강화 모듈 헬멧을 써서 머리를 보호한다는 의미(좀 유치한데;)
app.disable('x-powerd-by');
- server와 x-Powerd-By 헤더를 노출시키지 않기위해 helmet 모듈사용
app.use(helmet.hidePoweredBy())
- 낚시 헤더 설정도 가능
app.use (helmet.hidePoweredBy ({setTo : 'PHP 4.2.0'}))
- 사용자 htttps 연결 유지하기
app.use(helmet.hsts({
maxAge: 90*24*60*60, // 90일동안 https 사용하도록
force: true, // 기본 설정을 무시
includeSubDomains: true,
preload: true
}));
- XSS방어
app.use(helmet.xssFilter()); // X-XSS-Protection 보안헤더 작성.
- 클릭재킹 방어
app.use(helmet.frameguard("deny"));
CSRF
- 사용자가 의도치한게 공격자가 의도한 행동을 하게 만드는 방식, 쿠키를 통한 인증방식에서 사용되는 공격기법
- ex) 특정페이지에 방문할때 자동으로 로그아웃되거나 게시글이 써지는 현상을 유도
해결방법
node.js csurf 모듈사용
const csrfProtection = csrf({ cookie: true }); // 쿠키에 csrf Secret을 저장. 만일 세션에 저장하고 싶다면 { cookie: false }로
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session(sessionOption));
/* 쿠키파서나 익스프레스-세션 미들웨어보다 아래에 위치해야 한다. 그리고 csrfProtection 미들웨어를 라우터에 장착 */
app.get('/purchase', csrfProtection, (req, res) => {
// 만일 /puchase 페이지로 접속(get) 하면 req.csrfToken()를 실행하여 템플릿 엔진(pug, nunjucks, ejs)에 csrf 토큰을 생성해서 저장 전달
res.render('index', { csrfToken: req.csrfToken() });
});
app.post('/purchase', csrfProtection, (req, res) => {
// /puchase 페이지에서 폼 submit이 오면(post) 폼 태그 안에 있던 csrf 토큰 값을 csrfProtection 미들웨어에서 검증하고 next()
res.send(req.body.text);
});
https://www.npmjs.com/package/helmet
helmet
help secure Express/Connect apps with various HTTP headers. Latest version: 7.0.0, last published: a month ago. Start using helmet in your project by running `npm i helmet`. There are 3712 other projects in the npm registry using helmet.
www.npmjs.com
https://hangem-study.readthedocs.io/en/latest/nodeJS/helmet/
Helmet - Front Study
헤더가 확실하게 설정되로록 미들웨어 스택의 앞부분에 사용하는 것이 가장 좋다. 익스프래스 3을 사용하는 경우, app.router 전에 미들웨러를 나열해야 합니다. 개별적으로 사용할 수도 있다. defau
hangem-study.readthedocs.io
[NODE / 보안] 📚 helmet 모듈 사용법 - 웹 보안은 내가 👮
helmet 모듈 helmet 모듈은 서버에서 다양한 HTTP 헤더를 자동 설정을 통해 서버 어플리케이션의 보안을 강화해주는 대표적인 노드 보안 모듈이다. 헬멧을 써서 내 머리를 보호하듯이, 내 웹서버를
inpa.tistory.com
[NODE / 보안] 📚 helmet 모듈 사용법 - 웹 보안은 내가 👮
helmet 모듈 helmet 모듈은 서버에서 다양한 HTTP 헤더를 자동 설정을 통해 서버 어플리케이션의 보안을 강화해주는 대표적인 노드 보안 모듈이다. 헬멧을 써서 내 머리를 보호하듯이, 내 웹서버를
inpa.tistory.com