| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- 카카오뷰 성장
- 카카오뷰 수익
- 엑셀 프린트하기
- 위드굿즈
- Axios 라이브러리
- 자기관리
- 카뷰 수익 인증
- 카카오뷰N잡
- 성공에 대한 거짓말
- 책 원씽
- 카카오뷰 부업
- ppt 도형 색
- 카카오뷰 탭이동
- 웹기초
- ppt 다이어그램
- 위드굿즈 굿즈샵
- 엑셀 기초 함수
- 이석증
- git 협업하기
- 도서 원씽
- 성공비법
- express.js 환경 셋팅
- HTML
- 실시간 통신
- 30일 글쓰기
- 카카오뷰 초보
- 카카오뷰 온라인 수익화
- CSS
- Git 팀 작업
- 원씽
- Today
- Total
김데이의 개발공부
[ TIL ] Day 43 - Passport 세션, 토큰 구조화 본문
[ TIL ] Day 43 - Passport 세션, 토큰 구조화
theday365 2025. 11. 25. 18:54🗓️ 수업 일자 : 2025.11.25
✨ 오늘의 수업 평가 : [ GOOD ] 머리가 터질 뻔했지만 배웠다 💥🤯📚
GPT 멱살잡이 해 가며 Passport 세션 / 토큰 전체 구조 및 흐름도 정리..
개인 프로젝트에서는 사용하지 않지만, 실무에서는 OAuth 써야하니까 기본 구조부터 공부했다
내일은 Passport OAuth 부분 공부 할 생각인데 벌써부터 머리가 지끈지끈😵💫
👩💻 [개인 프로젝트] 오늘 작업 내용 💻
- 스프린트 미션 3 : 멘토님 코멘트 관련 코드 수정
- 스프린트 미션 4 : User 파트 작업 준비 (스키마 작성, 파일 정리 등)
📝 오늘 배운 내용
- Passport 세션 구현하기
- Passport 토큰 구현하기
1. 개인 프로젝트
[스프린트 미션 3] 수정사항
- app.js 라우트 구조 수정
- route.js 파일에서의 라우팅 메서드 요청방식 수정
- API 실행 시 id 검증 과정 추가 : Patch / Delete 등 작업 수행 전 검증 필요
- 전체 응답 메세지 json 구조로 변경
[스프린트 미션 4] User 파트 작업 준비
Prisma ERD 모듈 : https://www.npmjs.com/package/prisma-erd-generator
(WSL:Ubuntu 에서 작업하는 경우 제대로 실행 안됨)

2. Passport 세션 구현하기
🪪 로그인 하기
| 순서 | 폴더명/파일명 | 작업 코드 | 내용 |
| 1 | app.js | app.use( session({ ...}) ); | express session 미들웨어 셋팅 |
| app.use(passport.initialize()); app.use(passport.session()); |
Passport를 사용하여 session을 사용하기 위한 대기 과정 | ||
| 2 | app.js | app.use('/user',userRoute); | 로그인 요청을 받음. 실제 로직이 있는 routers/userRouter.js 파일로 이동 |
| 3 | routers/userRouter.js | router.post( '/login', passport.authenticate('local'), login ); |
로그인을 하기 위한 비지니스 로직이 실행되기 전 passport.authenticate() 구문이 먼저 실행됨 → 해당 구문이 있는 /lib/passport/index.js로 이동 |
| 4 | /lib/passport/index.js | passport.use( 'local', localStrategy); |
passport가 사용 할 여러 전략 중에서 해당 구문을 통해 localStrategy를 찾아 실행함 localStrategy는 기본 전략이기 때문에 축약 버전 : passport.use(localStrategy); 으로도 사용 가능 |
| 5 | /lib/passport/ localstrategy.js |
const localStrategy = new LocalStrategy(...); |
로그인 정보가 제대로 입력 되었는지 확인하는 과정 1) new LocalStrategy : 인자로 비동기 함수를 전달 async function ( username, password, done ) : 인자에 사용된 done은 passport에서 사용되는 콜백함수 2) user 확인 절차 : 입력 한 username과 DB에 저장 된 username이 있는지 확인 3) password 확인 절차 : 입력한 password를 bcrypt를 사용해 올바른 패스워드인지 검증 4) 모든 작업이 제대로 확인 되면 done(null,user)가 실행되어 이전 파일인 /lib/passport/index.js로 이동, serializeUser()을 자동 호출 |
| 6 | /lib/passport/index.js | passport.serializeUser(); | user객체 전체가 아니라 user.Id만 세션에 저장(세션 생성) |
| 7 | routers/userRouter.js | router.post( '/login', passport.authenticate('local'), login ); |
최종적으로 로그인을 하기 위한 비지니스 로직이 실행 |
🪪 세션을 사용하여 글 쓰기
| 순서 | 폴더명/파일명 | 작업 코드 | 내용 |
| 1 | app.js | app.use( session({ ...}) ); | express session 미들웨어 셋팅 |
| app.use(passport.initialize()); app.use(passport.session()); |
Passport를 사용하여 session을 사용하기 위한 대기 과정 | ||
| 2 | app.js | app.use(passport.session()); | 글 쓰기 요청을 받으면, 글 쓰기 라우터로 이동 전 현재 user에 대한 재인증이 시작. Header 의 cookie값에 있는 session ID를 통해 저장된 세션에서 user ID를 찾아옴 → passport.deserializeUser() 이 실행될 차례! |
| 3 | /lib/passport/index.js | passport.deserializeUser(); | 전달 받은 userId를 이용하여 DB에서 user 정보를 찾은 뒤 req.user에 객체로 담아둠 |
| 4 | app.js | app.use('/post',postRoute); | 실제 로직이 있는 routers/postRouter.js 파일로 이동 |
| 5 | routers/postRouter.js | router.post( '/posts', authenticate, createPost ); |
글 쓰기 비지니스 로직이 실행되기 전 authenticate 미들웨어가 먼저 실행 됨 → 해당 구문이 있는 /middlewares/authenticate.js로 이동 |
| 6 | middlewares /authenticate.js |
if (!req.isAuthenticated()) {..} | passport.session()가 재인증 할 때 만들어 둔 req.isAuthenticated() 함수를 사용하여 검증 진행 → 해당 값이 true인 경우 정상 로그인이므로 POST 실행 |
| 7 | routers/postRouter.js | router.post( '/posts', authenticate, createPost ); |
최종적으로 글쓰기를 하기 위한 비지니스 로직이 실행 이때, req.user 조회하면 passport.deserializeUser()이 저장 한 user 정보가 확인 됨 |
3. Passport 토큰 구현하기
🔐토큰 로그인 하기
| 순서 | 폴더명/파일명 | 작업 코드 | 내용 |
| 1 | app.js | app.use(cookieParser()); | express가 쿠키를 읽지 못해서 해당 구문으로 준비 시킴 |
| app.use(passport.initialize()); | Passport를 사용하기 위한 대기 과정 | ||
| 2 | app.js | app.use('/user',userRoute); | 로그인 요청을 받음. 실제 로직이 있는 routers/userRouter.js 파일로 이동 |
| 3 | routers /userRouter.js |
router.post( '/login', passport.authenticate ('local', { session: false }), login ); |
로그인을 하기 위한 비지니스 로직이 실행되기 전 passport.authenticate() 구문이 먼저 실행됨. 단, 토큰 기반에서는 세션 미사용 {session: false}을 설정함 → 해당 구문이 있는 /lib/passport/index.js로 이동 |
| 4 | /lib/passport /index.js |
passport.use( 'local', localStrategy); |
passport가 사용 할 여러 전략 중에서 해당 구문을 통해 localStrategy를 찾아 실행함 |
| 5 | /lib/passport/ localstrategy.js |
const localStrategy = new LocalStrategy(...); |
로그인 정보가 제대로 입력 되었는지 확인하는 과정 (상세 내용은 세션 파트 참고) → 로그인 검증이 끝나면 기존 route 경로로 이동 |
| 6 | routers /userRouter.js |
router.post( '/login', passport.authenticate ('local', { session: false }), login ); |
로그인을 하기 위한 비지니스 로직이 실행 |
| 7 | routers /userRouter.js |
function login(req,res) { ... const { accessToken, refreshToken } = generateTokens(req.user.id); } |
사용할 access Token / refreshToken을 발급하는 과정 |
| /lib/token.js | function generateTokens(userId) { ... } | ||
| 8 | routers /userRouter.js |
setTokenCookies (res,accToken,refToken); |
만들어진 access Token / refreshToken을 쿠키로 변환하여 response로 클라이언트에 전달 |
🔐토큰을 사용하여 글 쓰기
| 순서 | 폴더명/파일명 | 작업 코드 | 내용 |
| 1 | app.js | app.use(cookieParser()); | express가 쿠키를 읽지 못해서 해당 구문으로 준비 시킴 |
| app.use(passport.initialize()); | Passport를 사용하기 위한 대기 과정 | ||
| 2 | app.js | app.use('/post',postRoute); | 글 쓰기 요청을 받음. 실제 로직이 있는 router 파일로 이동 |
| 3 | routers /userRouter.js |
router.post( '/posts', passport.authenticate ('access-token', { session: false }), createPost ); |
글 쓰기 비지니스 로직이 실행되기 전 access 토큰 검증용 passport.authenticate() 구문이 먼저 실행됨. 단, 토큰 기반에서는 세션 미사용 {session: false}을 설정함 → 해당 구문이 있는 /lib/passport/index.js로 이동 |
| 4 | /lib/passport /index.js |
passport.use ('access-token', accessTokenStrategy); |
passport가 사용 할 여러 전략 중에서 accessTokenStrategy 전략이 실행 됨 |
| 5 | /lib/passport/ jwtStrategy.js |
const accessTokenStrategy = new JwtStrategy( accessTokenOptions, jwtVerify ); |
받아 온 JWT를 검증하기 위한 구문 실행 1) accessTokenOptions : 쿠키에서 access Token 추출 2) jwtVerify : JWT payload.sub로 user 정보를 조회 3) done(null, user) : req.user 정보로 저장 |
| 6 | routers /userRouter.js |
router.post( '/posts', passport.authenticate ('access-token', { session: false }), createPost ); |
글 쓰기 비지니스 로직이 실행되면서 저장 된 req.user에서 user.email / user.name 등을 꺼내서 사용 할 수 있음 |
📃 내일은 뭘 배울까 🤔
- 스프린트 미션 4 : auth route / controller 구현 & 연계된 product, article 기능 추가
- Passport OAuth 구현하기
'코드잇 Node.js(BE) 부트 캠프 > TIL (Today I Learn) 📑' 카테고리의 다른 글
| [ TIL ] Day 45 - 실습 : User 개인 기능 (mypage & likes) 기능 구현 (0) | 2025.11.27 |
|---|---|
| [ TIL ] Day 44 - 실습 : Express User 기능 구현 with Token (0) | 2025.11.26 |
| [ TIL ] Day 42 - PASSPORT (node.js) 기본 문법(세션, 토큰) (0) | 2025.11.24 |
| [ TIL ] Day 41 + 해싱솔트, bcrypt 모듈, 유저 기능 세션 / 토큰 (0) | 2025.11.23 |
| [ TIL ] Day 40 & 41 - 인증과 인가 / 쿠키, 세션, 토큰, OAuth (0) | 2025.11.21 |