개인 프로젝트를 진행하면서, 겉으로 보여지는 기능들을 참으로 중요하다. 대체적으로 UI/UX, 기능 구현, 애니메이션 기타 등 등으로 볼 수 있다. 물론 화려하고 기능적으로 우수하고 다 좋다. 하지만 사이트를 애써 만들었는데, 누군가에게 공격을 받아서 사용을 하지 못하면, 그게 무슨 소용인것일까?
그래서 우리는 코드를 다 작성을 한 후 또는 작성 중에 코드에 보안적 조치를 취해야 한다. 간단하게 생각나는 것은 로그인 과정에서 Injection에 관련된 공격들을 막아야하고, 회원가입을 진행 할 때에는 입력값 검증을 통해서 옳지 못한 단어나 해킹에 위협이 될만한 문자열들을 방지를 해야된다. 또한 커뮤니티같은 게시판을 운영을 하고 싶으면, XSS 공격이나 CSRF 공격 등을 방지해야한다. 세션 관련해서는 장기적으로 머무는 것은 안되고, 세션 토큰을 복제하지 못하기도 조치를 취해야한다. 진짜 일부만 말을 했어도 상당히 많은 대안을 세워야되는 것은 분명하다.
그럼 이제 내가 조치를 취한 것들을 하나씩 알아 볼 생각이다.

Http header를 강화를 해서 XSS, clickjacking, 중간자 공격(스니핑) 등의 여러 웹 취약점을 보호하는 helmet() 라이브러리 함수이다.
pnpm add helmet
위 명령어를 쳐서 설치가 가능하며, app.js에서 그림 1과 같은 방식의 선언을 통해서 조치를 취할 수 있다.

내가 현재 사용을 하고 있는 데이터베이스는 MongoDB이다. Express에서 사용이 가능한 라이브러리로 MongoDB 연산자를 제거를 해서 NoSQL Injection 공격을 방지할 수 있다.

세션을 MongoDB에 안전하게 저장하고, 그림 3과 같은 옵션으로 보안을 강화하였다. secret은 세션 데이터 암호화를 사용하고, httpOnly는 XSS 방지, secure는 https에서만 쿠키 전송 , sameSite 는 CSRF 방지, maxAge는 세션 만료 시간을 설정한 것이다. 기본적인 공격 방지를 진행 할 수 있다.

솔직히 요즘 시대에 좀 보안적 조치가 많이 미흡한데, 원래 패스워드는 해시화를 해서 저장을 해야된다. 평문이 아니라. 그래서 비밀번호를 해시화하는 함수를 사용해서 해시화된 비밀번호를 MongoDB에 저장하는 형태를 유지한다.
다음은 미들 웨어를 둬서 설정을 강화한 것이다.

회원가입을 진행할 때, 입력값 검증을 진행하는 Joi의 도움을 받아서 문자열 입력에 대한 검증을 진행한다. id값은 String 형태로 최소 길이 3글자부터 30글자까지고, nickname은 2글자부터 30글짜까지, password는 6글자부터 128글자까지 충족을 시켜야한다.

다음 코드는 인가된 사용자들만 사용이 가능한 형태로, 로그인이 되어있지 않은 사용자 또는 세션 만료로 인해서 로그인이 풀린자 등 본인을 증명할 수 없는 사용자가 사이트의 기능을 이용하려고 할 때, 사용이 가능한지를 확인하고 에러메세지를 일관되게 반환시켜주는 기능이다.

이거는 보안 뉴스 게시판에 기록한 기능이다. 관리자 및 사용자가 해당 게시판의 게시물에 대해서 'created', 'updated', 'deleted',"view"
이 중에서 하나의 action을 취한 내용들을 ip와 작업을 한 시각들을 기록하여, 이상이 발생을 했을 시에 History를 찾아봐서 확인을 할 수 있는 방도를 마련하는 중요한 기록 저장 방식이다.
이 외에도 여러 조치를 취했지만 가장 대표적인 것들을 위주로 소개를 하는 과정이었다. 최소한의 보안적 장치는 준비를 해야되고, 항상 머릿속에 각인을 해둬야한다.
'멀티캠퍼스' 카테고리의 다른 글
| 백엔드 nginx 연결 및 소셜 로그인 추가하기 (0) | 2025.10.20 |
|---|---|
| 웹 페이지 크롤링 하기 (0) | 2025.10.13 |
| 백엔드 로그인 구현 (0) | 2025.09.22 |
| spring 코드 기초 복습 (1) | 2025.09.15 |
| Servlet Assignment 코드 리뷰 (0) | 2025.09.08 |