🐱 Nest.js 둜그인 μ„œλΉ„μŠ€ λ§Œλ“€μ–΄λ³΄κΈ° (2)

이쀀석·2021λ…„ 12μ›” 17일
7

nestjs

λͺ©λ‘ 보기
3/3
post-thumbnail

μ„œλ‘ 

μ €λ²ˆ μ‹œκ°„μ— 둜그인 μ„œλΉ„μŠ€λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄μ„œ MVC νŒ¨ν„΄μ— λ§žμΆ°μ„œ Controller, Service μ½”λ“œλ₯Ό μƒμ„±ν•΄μ„œ μ˜μ‘΄μ„± μ£Όμž…κ³Ό μ‹€ν–‰ ν…ŒμŠ€νŠΈκΉŒμ§€ ν–ˆλ‹€. κ·Έλž˜μ„œ μš°λ¦¬λŠ” jwt λ₯Ό μ΄μš©ν•œ 둜그인 방식을 κ΅¬ν˜„ν•  μ˜ˆμ •μ΄κΈ° λ•Œλ¬Έμ— 그에 λ§žλŠ” 섀정을 이번 ν¬μŠ€νŒ…μ—μ„œ 닀뀄볼 μ˜ˆμ •μ΄λ‹€.

그럼 passport 와 jwt λ₯Ό μ΄μš©ν•΄μ„œ 둜그인 인증에 ν•„μš”ν•œ μ½”λ“œλ“€μ„ κ΅¬ν˜„ν•΄λ³΄λ„λ‘ ν•˜μž.

사전 μ€€λΉ„λ‘œ Controller, Service μ½”λ“œλŠ” μƒμ„±λ˜μ—ˆλ‹€κ³  κ°€μ •ν•˜κ³  μ§„ν–‰ν•˜λ‹ˆ 이전 ν¬μŠ€νŒ…μ„ μ°Έκ³ ν•΄μ„œ μ½”λ“œ μƒμ„±κΉŒμ§€λ§Œ ν•˜κ³  μ˜€μ‹œλ©΄ νŽΈν•˜κ²Œ 보싀 수 μžˆμ„ 것 κ°™μŠ΅λ‹ˆλ‹€.

λ³Έλ‘ 

μ €λ²ˆ μ‹œκ°„μ— passport λͺ¨λ“ˆμ— λŒ€ν•΄μ„œλŠ” μ„€μΉ˜λ₯Ό ν–ˆμ—ˆμœΌλ‚˜, λ‹€μ‹œ μ²˜μŒλΆ€ν„° 짚고 λ„˜μ–΄κ°€λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. (λ§Œμ•½ 이전 ν¬μŠ€νŒ…μ—μ„œ μ„€μΉ˜λ₯Ό ν•˜μ…¨μœΌλ©΄ ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€!)

πŸ“ Passport, JWT νŒ¨ν‚€μ§€ λ‹€μš΄λ‘œλ“œ

node ν™˜κ²½μ—μ„œ 많이 μ‚¬μš©ν•˜λŠ” 인증 미듀웨어인 passport 와 jwt λ₯Ό μ΄μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•΄μ£Όμ–΄μ•Ό ν•˜λŠ”λ° ν„°λ―Έλ„μ—μ„œ ν”„λ‘œμ νŠΈ 루트 λ””λ ‰ν† λ¦¬λ‘œ μ§„μž…ν•˜κ³  λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•΄μ€€λ‹€.

$ npm install --save @nestjs/passport passport passport-local
$ npm install --save-dev @types/passport-local

$ npm install --save @nestjs/jwt passport-jwt
$ npm install --save-dev @types/passport-jwt

κ·Έ λ‹€μŒμ— passport 와 jwt 섀정을 ν•˜κΈ° μœ„ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³΄λ„λ‘ ν•˜κ² λ‹€.

πŸ“ JWT μ„€μ •

λ¨Όμ €, jwt λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ guard, payload, strategy 3가지λ₯Ό μ„€μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. λ”°λΌμ„œ auth 폴더 밑에 jwt 폴더λ₯Ό μƒμ„±ν•˜κ³  3가지에 λŒ€ν•œ μ½”λ“œλ₯Ό 생성해쀀닀.

  • jwt.guard.ts
  • jwt.payload.ts
  • jwt.strategy.ts

생성이 μ™„λ£Œλ˜μ—ˆμœΌλ©΄ ν•˜λ‚˜μ”© μž‘μ„±ν•˜λ©΄μ„œ μ–΄λ–€ κΈ°λŠ₯인지 μ•Œμ•„κ°€λ³΄λ„λ‘ ν•˜μž.

1️⃣ jwt.guard.ts μ½”λ“œ

μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ°μ „μ— μš°μ„  guard 에 λŒ€ν•΄μ„œ μ§šμ–΄λ³Ό ν•„μš”κ°€ μžˆμ„ 것 κ°™λ‹€. nest κ³΅μ‹λ¬Έμ„œ 쀑 FAQ νŒŒνŠΈμ— Request lifecycle μ΄λΌλŠ” νŒŒνŠΈκ°€ μžˆλ‹€. ν•΄λ‹Ή νŒŒνŠΈμ— λ”°λ₯΄λ©΄ μš”μ²­μ‹œ μ½”λ“œ 흐름은 λ‹€μŒκ³Ό κ°™λ‹€.

4, 5, 6λ²ˆμ„ 보면 Guard λΌλŠ” 뢀뢄이 μžˆλŠ”λ°, μš°λ¦¬κ°€ ν˜„μž¬ μž‘μ„±ν•˜λ €κ³  ν•˜λŠ” Guard 와 같은 μΉœκ΅¬μ΄λ‹€. λ”°λΌμ„œ Guard λ₯Ό 톡과해야지 본격적으둜 μš”μ²­μ˜ μ²˜λ¦¬κ°€ μ‹œμž‘λ˜λŠ” μ»¨νŠΈλ‘€λŸ¬μ— 도달 ν•  수 있게 λœλ‹€.

그러면 Guard λž€ 무엇인가? 단일 μ±…μž„μœΌλ‘œ λŸ°νƒ€μž„μ— μ‘΄μž¬ν•˜λŠ” νŠΉμ • 쑰건 (κΆŒν•œ, μ—­ν•  λ“±)에 λ”°λΌμ„œ μ§€μ •λœ μš”μ²­μ„ λΌμš°ν„° ν•Έλ“€λŸ¬μ— μ˜ν•΄ μ²˜λ¦¬ν• μ§€ μ—¬λΆ€λ₯Ό κ²°μ •ν•œλ‹€.

  • λ‹¨μΌμ±…μž„ : ν•œ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„μ„ κ°€μ§€λŠ” κ²ƒμœΌλ‘œ 객체지ν–₯ 5μ›μΉ™μ˜ SRP에 ν•΄λ‹Ή
    (μ—¬κΈ°μ„œ λ‹¨μΌμ±…μž„μ€ μš”μ²­μ„ μŠΉμΈν• μ§€ 말지 ν•˜λ‚˜λ§Œ κ°€μ§€λŠ” ν΄λž˜μŠ€λΌλŠ” μ˜λ―Έμ΄λ‹€.)

ν•˜μ§€λ§Œ Guard 보닀 λ¨Όμ € μ‹€ν–‰ μˆœμ„œλ₯Ό κ°€μ§€λŠ” λ―Έλ“€μ›¨μ–΄μ—μ„œ ν•΄μ£Όλ©΄ λ˜λŠ”λ° ꡳ이 μ™œ Guard λ₯Ό 또 λ§Œλ“€μ—ˆμ„κΉŒ? 라고 μ˜λ¬Έμ„ κ°€μ§ˆ 수 μžˆμ„ 것 κ°™λ‹€. 이런 μ˜λ¬Έμ„ κ³΅μ‹λ¬Έμ„œμ—μ„œ μ•„μ£Ό λ§λ”ν•˜κ²Œ ν•΄κ²°ν•΄μ£Όμ—ˆλŠ”λ° μ΄μœ λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  • λ―Έλ“€μ›¨μ–΄λŠ” 본질적으둜 λ©μ²­ν•΄μ„œ, next() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ ν›„ μ–΄λ–€ ν•Έλ“€λŸ¬κ°€ μ‹€ν–‰λ˜λŠ”μ§€ μ•Œ 수 μ—†λ‹€. (λ°˜λŒ€λ‘œ κ°€λ“œλŠ” λ‹€μŒμ— 싀행될 μž‘μ—…μ„ λͺ…ν™•ν•˜κ²Œ μ•Œκ³  μžˆλ‹€. λ”°λΌμ„œ μ •ν™•ν•œ μ§€μ μ—μ„œ 처리 λ‘œμ§μ„ 넣을 수 있고, μˆ˜ν–‰ν•  수 μžˆλ„λ‘ ν•œλ‹€.)
  • 원문은 ν•΄λ‹Ή 링크λ₯Ό μ°Έκ³ ν•΄μ£Όμ„Έμš”.

λ˜ν•œ Guard λŠ” κΈ€λ‘œλ²Œ, 컨트둀러, 라우트둜 λ‚˜λ‰˜λŠ”λ° μ΄λŠ” Guard λ₯Ό κ°œλ°œμžκ°€ 어디에 μ„€μ •ν•˜λŠλƒμ— λ”°λΌμ„œ κΈ€λ‘œλ²Œλ‘œ μž‘λ™ν•˜κΈ°λ„ ν•˜κ³ , μ»¨νŠΈλ‘€λŸ¬μ—μ„œλ§Œ μž‘λ™ν•˜κΈ°λ„ ν•˜κ²Œ λœλ‹€.

이제 Guard 에 λŒ€ν•΄μ„œ κ°„λž΅ν•˜κ²Œ μ•Œμ•„λ³΄μ•˜μœΌλ‹ˆ μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³΄λ„λ‘ ν•˜μž. μ½”λ“œμ˜ λ‚΄μš©μ€ λ‹€μŒκ³Ό κ°™λ‹€.

import { Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {}
  • AuthGuard: Guard 의 μ „λž΅μ„ μ‹€ν–‰μ‹œμΌœμ£ΌλŠ” ν•¨μˆ˜κ°€ λ‚΄μž₯된 라이브러리둜 Guard κ°€ 싀행될 λ•Œ jwt.strategy.ts μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œμΌœμ„œ Guard 에 ν•„μš”ν•œ 둜직이 싀행될 수 μžˆλ„λ‘ 도와쀀닀. (μ΄λ•Œ μ „λž΅μ€ jwt 방식을 μ΄μš©ν•΄μ„œ μš”μ²­μœΌλ‘œλΆ€ν„° Guard λ₯Ό ν•œλ‹€.)

2️⃣ jwt.strategy.ts μ½”λ“œ

jwt.strategy.ts μ½”λ“œλŠ” Guard 의 μ „λž΅μ„ 담은 μ½”λ“œλ‘œ Strategy λ‚΄λΆ€μ˜ validate ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λ©΄μ„œ 인증 절차λ₯Ό 거치게 λœλ‹€.

μ½”λ“œλŠ” λ‹€μŒκ³Ό 같이 μž‘μ„±ν•  수 μžˆλ‹€.

import { Injectable, UnauthorizedException } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { Payload } from './jwt.payload';	// λ‹€μŒμ—μ„œ 곧μž₯ 생성할 μ˜ˆμ •

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      // 헀더 Authentication μ—μ„œ Bearer ν† ν°μœΌλ‘œλΆ€ν„° jwtλ₯Ό μΆ”μΆœν•˜κ² λ‹€λŠ” 의미
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: 'secret',	// jwt μƒμ„±μ‹œ λΉ„λ°€ν‚€λ‘œ μ‚¬μš©ν•  ν…μŠ€νŠΈ (λ…ΈμΆœ X)
      ignoreExpiration: false,  // jwt 만료λ₯Ό λ¬΄μ‹œν•  것인지 (κΈ°λ³Έκ°’: false)
    });
  }

  async validate(payload: Payload) {
    const user = payload.sub === '0'

    if (user) {
      return user; // request.user에 ν•΄λ‹Ή λ‚΄μš©μ„ λ„£μ–΄μ€€λ‹€ (Passport λΌμ΄λΈŒλŸ¬λ¦¬κ°€ ν•΄μ€Œ)
    } else {
      throw new UnauthorizedException('μ ‘κ·Ό 였λ₯˜');
    }
  }
}

μš°μ„ μ€ μ΄λ ‡κ²Œ 적고 λ„˜μ–΄κ°ˆ 수 μžˆλ„λ‘ ν•˜μž.

3️⃣ jwt.payload.ts μ½”λ“œ

payload λŠ” jwt μ—μ„œ μ‚¬μš©μžκ°€ μ›ν•˜λŠ” 정보λ₯Ό λ„£λŠ” λΆ€λΆ„μœΌλ‘œ νƒ€μž…μ„ μ •μ˜ν•˜λŠ” μ½”λ“œμ΄λ‹€. λ”°λΌμ„œ μ‚¬μš©μžκ°€ λ³΄μ•ˆμ— μœ„ν˜‘μ΄ 가지 μ•ŠλŠ” μ„ μ—μ„œ μ›ν•˜λŠ” 정보λ₯Ό λ„£μ–΄μ„œ μ‚¬μš©ν•˜λ©΄ λ˜λŠ”λ° μš°μ„ μ€ μ•„λž˜μ™€ 같이 μž‘μ„±ν•΄μ„œ μ‚¬μš©ν•΄λ³΄λ„λ‘ ν•˜μž.

export type Payload = {
  email: string;
  sub: string;
};

μ—¬κΈ°κΉŒμ§€ μ™„λ£Œν–ˆμœΌλ©΄ 둜그인 ν›„ 인증에 λŒ€ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλŠ” μ½”λ“œλ“€μ€ λ§ˆλ¬΄λ¦¬κ°€ λ˜μ—ˆλ‹€.
λ§ˆμ§€λ§‰μœΌλ‘œ 둜그인 ν–ˆμ„ λ•Œ jwt 토큰을 λ§Œλ“€κ³ , ν•΄λ‹Ή ν† ν°μœΌλ‘œ 인증이 λ˜λŠ”μ§€ ν•œ 번 확인해보도둝 ν•˜μž.

πŸ“ 둜그인 ν•  λ•Œ JWT μƒμ„±ν•˜κΈ°

이제 λ“œλ””μ–΄ μ €λ²ˆ μ‹œκ°„μ— λ§Œλ“€μ—ˆλ˜ 둜그인 컨트둀러, μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©ν•  λ•Œκ°€ μ™”λ‹€.
λ¨Όμ € 둜그인 컨트둀러λ₯Ό 켜고 λ‹€μŒκ³Ό 같이 코딩을 해보도둝 ν•˜μž.

import { Controller, Post, Req } from '@nestjs/common';
import { LoginService } from './login.service';
import { Request } from 'express';

@Controller('login')
export class LoginController {
  constructor(private readonly loginService: LoginService) {}

  @Post()
  login(@Req() request: Request) {
    const { email, password } = request.body;
    return this.loginService.login(email, password);
  }
}

그리고 둜그인 μ„œλΉ„μŠ€ μ½”λ“œμ—μ„œλŠ” λ‹€μŒκ³Ό 같이 μž‘μ„±ν•  수 μžˆλ„λ‘ ν•œλ‹€.

import { Injectable, UnauthorizedException } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';

@Injectable()
export class LoginService {
  constructor(private jwtService: JwtService) {}

  login(email: string, password: string) {
    if (email === 'test@test.com' && password === 'test') {
      const payload = { email: email, sub: '0' };
      return this.jwtService.sign(payload);
    }
    throw new UnauthorizedException('μΈμ¦λ˜μ§€ μ•Šμ€ μ‚¬μš©μžμž…λ‹ˆλ‹€.');
  }
}

그리고 μ§€κΈˆ μš°λ¦¬κ°€ Passport, jwt κΈ°λŠ₯을 둜그인 컨트둀러, μ„œλΉ„μŠ€μ—μ„œ μ΄μš©ν•΄μ£ΌκΈ° μœ„ν•΄μ„œλŠ” μ˜μ‘΄μ„± μ£Όμž…μ΄ λ˜μ–΄μ•Ό ν•˜λŠ”λ° μ΄λŠ” 둜그인 λͺ¨λ“ˆ μ½”λ“œμ—μ„œ λͺ…μ‹œν•΄μ£Όλ©΄ λœλ‹€. μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

import { Module } from '@nestjs/common';
import { LoginController } from './login.controller';
import { LoginService } from './login.service';
import { PassportModule } from '@nestjs/passport';
import { JwtModule } from '@nestjs/jwt';
import { JwtStrategy } from '../jwt/jwt.strategy';

@Module({
  imports: [
    // session을 μ‚¬μš©ν•˜μ§€ μ•Šμ„ μ˜ˆμ •μ΄κΈ° λ•Œλ¬Έμ— false
    PassportModule.register({ defaultStrategy: 'jwt', session: false }),
    // jwt 생성할 λ•Œ μ‚¬μš©ν•  μ‹œν¬λ¦Ώ 킀와 만료일자 적어주기
    JwtModule.register({
      secret: 'secret',
      signOptions: { expiresIn: '1y' },
    }),
  ],
  controllers: [LoginController],
  providers: [LoginService, JwtStrategy], // strategy μ˜μ‘΄μ„± μ£Όμž…μ„ μœ„ν•΄μ„œ
})
export class LoginModule {}

그리고 ν¬μŠ€νŠΈλ§¨μ„ μ΄μš©ν•΄μ„œ λ‘œκ·ΈμΈμ„ μ‹œλ„ν•˜λ©΄ λ‹€μŒκ³Ό 같이 JWT 토큰을 리턴해쀀닀. λ”°λΌμ„œ λ¦¬ν„΄λœ 토큰을 가지고 μ•žμœΌλ‘œ 인증을 μ§„ν–‰ν•˜λ©΄ λœλ‹€.

πŸ“ UseGuardλ₯Ό μ΄μš©ν•΄μ„œ 인증해보기

μ§€κΈˆ λ°œκΈ‰λœ 토큰은 어디에 잘 λ³΅μ‚¬ν•΄λ‘μ—ˆλ‹€κ°€ 이번 μ„Ήμ…˜μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜μž.

이제 λ§ˆμ§€λ§‰μœΌλ‘œ μ•„κΉŒ μ—΄μ‹¬νžˆ μ œμž‘ν•œ jwt κ΄€λ ¨ μ½”λ“œλ“€μ„ μ μš©ν•΄λ³΄λŠ” μ‹œκ°„μ„ 가지도둝 ν•˜μž.
그러기 μœ„ν•΄μ„œλŠ” κ°„λ‹¨ν•œ 컨트둀러 ν•˜λ‚˜λ₯Ό μ œμž‘ν•΄λ³΄μž.

src 폴더 밑에 user 폴더λ₯Ό λ§Œλ“€κ³  user.controller.ts μ½”λ“œλ₯Ό λ§Œλ“€μ–΄λ³΄λ„λ‘ ν•˜μž.

// user.controller.ts
import { Controller, Get, UseGuards } from '@nestjs/common';
import { JwtAuthGuard } from '../jwt/jwt.guard';

@Controller('user')
export class userController {
  @UseGuards(JwtAuthGuard)
  @Get('all')
  getAllUser() {
    return {
      success: true,
      user: {
        email: 'test@test.com',
      },
    };
  }
}

μœ„μ˜ μ½”λ“œλŠ” JwtAuthGuard λ₯Ό ν†΅κ³Όν•˜λ©΄ μ„±κ³΅μ΄λΌλŠ” λ©”μ‹œμ§€μ™€ ν•¨κ»˜ μœ μ € 이메일을 λ³΄μ—¬μ£ΌλŠ” μ‹μœΌλ‘œ μ•„μ£Ό κ°„λ‹¨ν•˜κ²Œ λ§Œλ“€μ—ˆλ‹€. μœ„μ™€ 같은 λ°©μ‹μœΌλ‘œ @UseGuards μ• λ…Έν…Œμ΄μ…˜μ„ μ΄μš©ν•΄μ„œ κΈ€λ‘œλ²Œ, 컨트둀러, λΌμš°νŠΈμ— μžμ‹ μ΄ μ›ν•˜λŠ” 곳이 인증을 λΆ€μ°©ν•  수 μžˆλ‹€.

그럼 포슀트맨으둜 ν…ŒμŠ€νŠΈλ₯Ό ν•΄λ΄μ•Όν•˜λŠ”λ° ν…ŒμŠ€νŠΈλŠ” λ‹€μŒκ³Ό 같이 ν•œλ‹€.

  1. λ¨Όμ € GET http://localhost:포트/user/all 둜 URL을 λ³€κ²½
  2. Headers νƒ­μœΌλ‘œ 이동 ν›„ λ‹€μŒμ˜ λ‚΄μš©μ„ μ λŠ”λ‹€.
  • KEY: Authentication
  • VALUE: Bearer <토큰>
    (Header 의 Authentication 킀에 Bearer 토큰을 λ„£λŠ” μ΄μœ λŠ” jwtStrategy μ½”λ“œμ—μ„œ jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken() 으둜 λͺ…μ‹œν•΄μ£Όμ—ˆκΈ° λ•Œλ¬Έμ΄λ‹€.)
  1. Sendλ₯Ό λˆŒλŸ¬μ„œ 리턴값을 ν™•μΈν•œλ‹€.

λ”°λΌμ„œ μ„±κ³΅ν•˜κ²Œ 되면 λ‹€μŒκ³Ό 같이 κ²°κ³Όκ°€ λœ¬λ‹€.

λ§Œμ•½ μ‹€νŒ¨ν•˜λ©΄ λ‹€μŒκ³Ό 같이 κ²°κ³Όκ°€ λœ¬λ‹€. (Bearer 111<토큰> 으둜 μ΄μƒν•˜κ²Œ μˆ˜μ •)

μš°λ¦¬λŠ” μ„Έμ…˜μ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³  jwt 토큰을 μ΄μš©ν•΄μ„œ 인증을 κ΅¬ν˜„ν•˜μ˜€λŠ”λ°, μš”μ¦˜ 운영 ν™˜κ²½μ—μ„œ ν•˜λ‚˜μ˜ μ„œλ²„λ§Œ μ‚¬μš©ν•˜λŠ” 것이 μ•„λ‹ˆκ³  μ—¬λŸ¬ 개의 μ„œλ²„λ₯Ό λ™μ‹œμ— 돌리게 λœλ‹€.

그리고 μ„Έμ…˜μ€ μ„œλ²„μ— μ’…μ†λ˜κΈ° λ•Œλ¬Έμ— 각각 μ„œλ²„λ§ˆλ‹€ λ‚΄κ°€ μƒμ„±ν•œ μ„Έμ…˜μ΄ 동기화가 λ˜μ–΄μ•Όμ§€ λ‘œλ“œλ°ΈλŸ°μ„œλ‘œ λ‹€λ₯Έ μ„œλ²„λ‘œ μ΄λ™λ˜λ”λΌλ„ μ»¨ν…μŠ€νŠΈλ₯Ό μžƒμ§€ μ•Šκ³  μž‘μ—… ν•  수 μžˆλ‹€.

이런 뢀뢄이 λ²ˆκ±°λ‘œμ›Œμ„œ jwt 토큰을 μ΄μš©ν•΄μ„œ 인증을 κ΅¬ν˜„ν•˜λŠ” 것이고 이 방법을 μ‚¬μš©ν•˜λ©΄ μ„œλ²„λ§ˆλ‹€ μ„Έμ…˜μ„ μ‚¬μš©ν•  ν•„μš”κ°€ μ—†κ²Œ λœλ‹€.

κ²°λ‘ 

λ­”κ°€ 벼락처럼 Passport 와 jwt λ₯Ό μ΄μš©ν•œ 둜그인 κ΅¬ν˜„μ΄ μ§€λ‚˜κ°€κ²Œ λ˜μ—ˆλŠ”λ°, 사싀 아직 μ„μ—°μΉ˜ μ•Šμ€ 뢀뢄듀이 있고 μ™„λ²½ν•˜κ²Œ μ΄ν•΄λœ 것이 μ•„λ‹ˆλ‹€. λ”°λΌμ„œ 계속 곡뢀λ₯Ό ν•  μ˜ˆμ •μ΄κ³  μƒˆλ‘­κ²Œ μ•ˆ 사싀이 있으면 쀑간 쀑간 ν¬μŠ€νŒ… λ‚΄μš©μ„ μˆ˜μ •ν•˜κ±°λ‚˜ μΆ”κ°€ν•  수 μžˆλ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

그리고 μ§€κΈˆμ€ ν•˜λ“œμ½”λ”©μœΌλ‘œ 값을 λΉ„κ΅ν•˜κ³  μ²˜λ¦¬ν•˜μ˜€λŠ”λ°, λ‹€μŒ ν¬μŠ€νŒ…μ—λŠ” λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ—°λ™ν•˜κ³  nest κΈ°λŠ₯을 μ’€ 더 적극적으둜 ν™œμš© ν•  수 μžˆλŠ” λ°©μ•ˆμ„ μž‘μ„±ν•΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

κΈ΄κΈ€ λ΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

그럼 이만 총총..πŸƒπŸ»β€β™€οΈ

profile
호주 μ›Œν™€μ€‘

2개의 λŒ“κΈ€

comment-user-thumbnail
2023λ…„ 8μ›” 20일

λ„ˆλ¬΄ μ’‹μ•„μš”

1개의 λ‹΅κΈ€