김데이의 개발공부

[ TIL ] Day 43 - Passport 세션, 토큰 구조화 본문

코드잇 Node.js(BE) 부트 캠프/TIL (Today I Learn) 📑

[ 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 에서 작업하는 경우 제대로 실행 안됨)

기존 Prisma Schema에 User model 추가하고 관계 형성 (타 사이트 이용)
기존 Prisma Schema에 User model 추가하고 관계 형성 (타 사이트 이용)

 

 

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 구현하기

반응형