728x90
반응형

Backend/NestJs 18

NestJS XSS 방어: sanitize-html과 DTO Transform으로 자동화하기

게시판이나 공지사항 기능을 만들다 보면, 사용자가 작성한 HTML 태그를 그대로 받아 저장해야 하는 경우가 생깁니다.이때 무방비하게 데이터를 받으면 XSS(교차 사이트 스크립팅) 공격의 표적이 되기 딱 좋은데요.저 역시 최근 프로젝트에서 이 문제를 해결하기 위해 고민을 거듭했고, 오늘은 그 해결 과정을 여러분과 공유하려고 해요.XSS 방어, 왜 반드시 필요할까요?악의적인 사용자가 태그나 onload 같은 이벤트 핸들러를 섞어 보내면, 다른 사용자가 해당 게시글을 열었을 때 악성 스크립트가 실행되는 끔찍한 일이 발생할 수 있습니다.💡 참고: XSS의 구체적인 개념과 원리, 그리고 왜 반드시 막아야 하는지에 대해서는 제가 이전에 자세히 정리해 둔 글이 있어요. 혹시 개념 정리가 먼저 필요하시다면 아래 링..

Backend/NestJs 2026.03.22

[NestJS] 사이드 프로젝트 Q&A, 디스코드 웹훅(Webhook)으로 실시간 알림 받기

사이드 프로젝트를 혼자 혹은 소규모 팀으로 운영하다 보면 가장 곤란한 순간이 언제인가요?저는 "사용자가 문의를 남겼는데, 며칠 뒤에야 발견했을 때" 였습니다.하루 종일 Admin 페이지를 새로고침하며 보고 있을 수도 없고, 그렇다고 별도의 알림 앱을 만들자니 배보다 배꼽이 더 큰 상황이 발생하죠.저도 최근 진행 중인 프로젝트에서 같은 고민을 하다가, 우리가 가장 익숙하고 자주 사용하는 디스코드(Discord) 로 알림을 쏘아주면 어떨까? 하는 생각이 들었습니다.오늘은 Prisma와 NestJS 환경에서 Q&A 게시글이 등록되면, 자동으로 디스코드 채널에 예쁜 Embed 메시지를 보내주는 기능을 구현한 과정을 공유하려 해요.아주 간단하지만 운영 퀄리티는 확실히 높여주는 꿀팁입니다! 구현 목표는 단순합니다...

Backend/NestJs 2026.01.26

[NestJS] Redis 가이드: ioredis와 CacheManager의 효율적인 공존

NestJS에서 Redis를 연동하려고 할 때 가장 고민되는 점은 무엇인가요? "공식 문서대로 @nestjs/cache-manager를 쓰자니 INCR 같은 원자적(Atomic) 연산이 안 되고, 그렇다고 ioredis만 쓰자니 단순 캐싱 로직까지 일일이 짜는 게 너무 번거롭다"는 점일 겁니다.게다가 무턱대고 두 라이브러리를 다 쓰면 Redis 커넥션이 두 배로 늘어나는 리소스 낭비까지 발생하죠.오늘은 이 모든 문제를 한 번에 해결하는 '실무형 하이브리드 아키텍처'를 소개합니다.단 하나의 Redis 연결을 재사용하여, 편리한 캐싱과 강력한 성능 제어를 동시에 잡는 방법을 단계별로 알아봅시다.1. 왜 이 조합이어야 할까요?우리는 세 가지 라이브러리를 조합해서 사용할 겁니다.@nestjs/cache-mana..

Backend/NestJs 2026.01.14

[NestJS] 이메일 시스템 설계: Nodemailer + Handlebars 레이아웃/파셜 완벽 적용기

지난 글에서 Gmail SMTP 연동까지 성공하셨나요?(이전 글 보기) 오늘은 거기서 한 단계 더 나아가, 실무 레벨의 이메일 시스템을 구축해 보려 합니다.단순히 HTML 파일 하나 불러와서 보내는 건 쉽습니다.하지만 메일 종류가 10개, 20개로 늘어난다면 어떨까요?"헤더 로고가 바뀌었어요, 메일 20개 다 수정해주세요." 이런 요청을 받았을 때 식은땀이 흐른다면, 오늘 소개할 Layouts(레이아웃)과 Partials(파셜) 구조가 정답입니다.제 실제 사이드 프로젝트 코드의 핵심 로직을 가져왔으니, 복사해서 여러분의 프로젝트에 맞게 녹여보세요!🤔 잠깐, 왜 EJS 대신 Handlebars인가요?Node.js 진영에는 EJS도 많이 쓰입니다.하지만 이메일 템플릿만큼은 Handlebars를 선호합니다...

Backend/NestJs 2026.01.12

[NestJS] 이메일 발송 기능 구현: Nodemailer와 Gmail SMTP 연동

서비스를 개발하다 보면 회원가입 인증, 비밀번호 찾기, 알림 등 이메일 발송 기능이 필요한 순간이 반드시 찾아옵니다.이번 글에서는 NestJS에서 nodemailer를 사용하여 가장 깔끔하고 안전하게 이메일 서비스를 구축하는 방법을 정리해 보았습니다. 특히 하드코딩 없이 ConfigService를 활용해 설정을 분리하는 실무적인 패턴을 중점으로 다뤄보겠습니다.1. 필수 패키지 설치가장 먼저 필요한 패키지들을 설치해야 합니다.NestJS는 Nodemailer를 래핑한 공식 패키지를 제공하고 있어 훨씬 편하게 사용할 수 있습니다.타입스크립트 환경이므로 타입 정의 파일도 함께 설치해 줍니다.# npm 사용 시npm install --save @nestjs-modules/mailer nodemailernpm i..

Backend/NestJs 2026.01.06

[NestJS] 인증의 완성: Redis와 HttpOnly Cookie로 보안 철벽 치기

지난 포스팅에서는 Prisma와 RDB를 사용하여 RTR(Refresh Token Rotation) 시스템을 구현했습니다.지금까지 우리는 Prisma로 유저를 관리하고 Passport로 인증 로직을 구현했습니다.하지만 실무 레벨의 인증 시스템이 되려면 해결해야 할 두 가지 숙제가 남아있습니다.DB 부하 문제: Refresh Token처럼 빈번하게 쓰고 지워지는 데이터를 RDB에 저장해야 할까?보안 문제 (XSS): 토큰을 프론트엔드의 localStorage에 저장해도 안전할까?오늘 우리는 Redis를 도입해 DB 부하를 없애고, HttpOnly Cookie를 적용해 스크립트 공격(XSS)을 원천 봉쇄하는 방법을, 실제 t사이드 프로젝트의 서비스 코드를 기반으로 알아보겠습니다.1. Prisma Schema..

Backend/NestJs 2026.01.02

[NestJS] Refresh Token Rotation(RTR) 구현 (Prisma + Passport)

지난 포스팅까지 우리는 JWT Access Token을 발급하고 검증하는 기초적인 인증 시스템을 만들었습니다.하지만 실무에서는 Access Token 하나만으로는 부족합니다.유효기간이 짧으면 사용자가 불편하고, 길면 보안이 취약해지기 때문이죠.오늘은 이 딜레마를 해결하는 Refresh Token, 그중에서도 가장 보안 강도가 높은 RTR(Refresh Token Rotation) 방식을 구현해 보겠습니다.단순히 유저 테이블에 토큰 문자열 하나를 저장하는 방식이 아닙니다.별도의 토큰 관리 테이블을 두고, 사용된 토큰을 isRevoked (무효화) 처리하여 재사용 공격까지 완벽하게 방어하는 실무 레벨의 코드를 공개합니다.1. RTR(Refresh Token Rotation)이란?일반적인 Refresh Tok..

Backend/NestJs 2025.12.31

[NestJS] 로그인 그 후, JWT 토큰 발급 및 인증 구현하기 (Prisma + Passport)

지난 포스팅에서는 Prisma와 Passport Local Strategy를 이용해 회원가입과 아이디/비밀번호 검증까지 완료했습니다.회원가입, 아이디/비밀번호 검증 포스팅 보러가기 하지만 로그인 API가 사용자 정보를 그대로 반환하고 끝난다면 반쪽짜리 기능이겠죠?이번 글에서는 로그인 성공 시 JWT(Json Web Token)를 발급하고, 클라이언트가 이 토큰을 가져왔을 때 유효성을 검증(Passport JWT Strategy)하는 과정을 다룹니다.(참고: 환경변수 관리를 위한 ConfigModule 설정은 이전 포스팅에서 다뤘으므로, 이미 세팅되어 있다고 가정하고 진행합니다.)1. 필수 패키지 설치JWT 생성과 검증을 담당할 패키지들을 설치합니다.# JWT 및 Passport-jwt 전략 패키지npm ..

Backend/NestJs 2025.12.20

[NestJS] Prisma + Passport 조합으로 로그인/회원가입 구현하기

웹 애플리케이션 개발의 시작은 언제나 '인증(Authentication)'입니다.하지만 NestJS를 처음 접하시는 분들에게 인증은 꽤나 높은 진입 장벽입니다.모듈(Module), 가드(Guard), 전략(Strategy) 같은 낯선 용어들이 쏟아지기 때문이죠.오늘은 보안의 기본인 비밀번호 암호화(Bcrypt)를 포함한 회원가입부터, Passport의 Local Strategy를 활용한 로그인까지의 과정을 하나의 흐름으로 정리해 드립니다.1. 사전 준비 (패키지 설치)인증 기능을 구현하기 위해 필요한 라이브러리들을 설치합니다.우리는 보안을 위해 비밀번호를 암호화할 것이고, 인증 구조를 잡기 위해 Passport를 사용합니다.# Passport 관련 패키지npm install --save @nestjs/p..

Backend/NestJs 2025.12.17

NestJS 모듈(Module) 완벽 정리: 의존성 주입부터 캡슐화까지 핵심 개념 파헤치기

NestJS로 백엔드 개발을 시작하셨나요?튜토리얼을 따라 하다가 문득 이런 의문이 들 수 있습니다."서비스(Service)랑 컨트롤러(Controller)만 만들면 되지, 왜 굳이 모듈(Module)이라는 파일에 등록해야 할까?"혹은 개발 도중 Nest can't resolve dependencies of the...라는 무시무시한 에러를 마주하고 당황하셨을 수도 있습니다.이 모든 문제의 열쇠는 바로 모듈(Module)에 있습니다.이번 글에서는 NestJS의 근간이 되는 모듈의 역할과 구조, 그리고 실무에서 자주 사용하는 패턴에 대해 아주 쉽게 정리해 드리겠습니다.1. 모듈(Module)이란 무엇인가요?NestJS 공식 문서에서는 모듈을 "@Module() 데코레이터가 달린 클래스"라고 정의합니다.하지만..

Backend/NestJs 2025.12.14