๋ชฉ๋ก๐Ÿ‘ฉ‍๐Ÿ’ป ๋ฐฑ์—”๋“œ(Back-End) (156)

๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[Nest JS ๋กœ CRUD ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ] (28) Passport, JWT ๋ฅผ ์ด์šฉํ•ด์„œ ํ† ํฐ ์ธ์ฆ ํ›„ ์œ ์ € ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

=> ๋”ฐ๋ผํ•˜๋ฉด์„œ ๋ฐฐ์šฐ๋Š” NestJS ๐Ÿงธ Passport, JWT ๋ฅผ ์ด์šฉํ•ด์„œ ํ† ํฐ ์ธ์ฆ ํ›„ ์œ ์ € ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ JWT ์ด์šฉํ•ด์„œ ์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธ ํ•  ๋•Œ ํ† ํฐ ์ƒ์„ฑ ์œ ์ €๊ฐ€ ์š”์ฒญ ๋ณด๋‚ผ ๋•Œ ์š”์ฒญ ์•ˆ์— ์žˆ๋Š” Header ์— ํ† ํฐ ๋„ฃ์Œ (์š”์ฒญ ์•ˆ์— Payload ์ž‡์Œ) ํ† ํฐ์ด ์œ ํšจํ•œ ํ† ํฐ์ธ์ง€ ์„œ๋ฒ„์—์„œ secret text ์ด์šฉํ•˜์—ฌ ์•Œ์•„๋‚ด๋ฉด, Payload ์•ˆ์— ์œ ์ € ์ด๋ฆ„ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ˆ์˜ ์œ ์ € ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ด => ์ด๋Ÿฌํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ชจ๋“ˆ์ด Passport ๐Ÿงธ Passport //passport-jwt ๋ชจ๋“ˆ์„ ์œ„ํ•œ ํƒ€์ž… ์ •์˜ ๋ชจ๋“ˆ @types/passport-jwt npm install @types/passport-jwt --save ๐ŸŽ€ jwt.strategy.ts import { Injectable,..

[Nest JS ๋กœ CRUD ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ] (27) JWT ๋ฅผ ์ด์šฉํ•ด์„œ ํ† ํฐ ์ƒ์„ฑํ•˜๊ธฐ

=> ๋”ฐ๋ผํ•˜๋ฉด์„œ ๋ฐฐ์šฐ๋Š” NestJS ๐Ÿงธ JWT (JSON Web Token) ๋กœ๊ทธ์ธํ•œ ๊ณ ์œ  ์œ ์ €๋ฅผ ์œ„ํ•œ ํ† ํฐ์„ ์ƒ์„ฑํ•ด์•ผ ํ•จํ† ํฐ์„ ์ƒ์„ฑํ•  ๋•Œ JWT ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•จ ๋‹น์‚ฌ์ž๊ฐ„์— ์ •๋ณด๋ฅผ json ๊ฐœ์ฒด๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ์ปดํŒฉํŠธํ•˜๊ณ  ๋…๋ฆฝ์ ์ธ ๋ฐฉ์‹์„ ์ •์˜ํ•˜๋Š” ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€ (RFC 7519) ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „ํ•  ๋•Œ OR ์œ ์ €์˜ ๊ถŒํ•œ ๊ฐ™์€ ๊ฒƒ์„ ์ฒดํฌํ•  ๋•Œ ์‚ฌ์šฉํ•จ ๐Ÿงธ JWT ๊ตฌ์กฐ ๐ŸŽ€ Header ํ† ํฐ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ํฌํ•จ (ํƒ€์ž…, ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜, SHA256, RSA ..) ๐ŸŽ€ Payload ์œ ์ € ์ •๋ณด, ๋งŒ๋ฃŒ๊ธฐ๊ฐ„, ์ฃผ์ œ ๋“ฑ ๐ŸŽ€ Verify Signature ํ† ํฐ์ด ๋ณด๋‚ธ ์‚ฌ๋žŒ์— ์˜ํ•ด ์„œ๋ช…๋˜์—ˆ์œผ๋ฉฐ ์–ด๋–ค ์‹์œผ๋กœ๋“  ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•—๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์„œ๋ช… ํ—ค๋” ๋ฐ ํŽ˜์ด๋กœ๋“œ ์„ธ๊ทธ๋จผํŠธ, ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜, ๋น„๋ฐ€ ๋˜๋Š” ๊ณต๊ฐœํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜..

[Nest JS ๋กœ CRUD ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ] (25) ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” ํ•˜๊ธฐ

=> ๋”ฐ๋ผํ•˜๋ฉด์„œ ๋ฐฐ์šฐ๋Š” NestJS ๐Ÿงธ ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” ํ•˜๊ธฐ ์œ ์ €๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋จ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™”ํ•ด์„œ ์ €์žฅํ•˜๊ธฐ ๐ŸŽ€ bcryptjs bcrypt ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™” ํ•œ ํ›„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ธฐ npm install bcryptjs --save ๐Ÿงธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ• 1) ์›๋ณธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ทธ๋Œ€๋กœ ์ €์žฅ 2) ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™” ํ‚ค์™€ ํ•จ๊ป˜ ์•”ํ˜ธํ™” (์–‘๋ฐฉํ–ฅ) 3) SHA256 ๋“ฑ hash ๋กœ ์•”ํ˜ธํ™”ํ•ด์„œ ์ €์žฅ (๋‹จ๋ฐฉํ–ฅ) ๐ŸŽ€ user.repository.ts import { EntityRepository, Repository } from "typeorm"; import { User } from "./user.entity"; import { AuthCredentialsDto..

[Nest JS ๋กœ CRUD ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ] (24) ์œ ์ € ์ด๋ฆ„์— ์œ ๋‹ˆํฌํ•œ ๊ฐ’ ์ฃผ๊ธฐ

=> ๋”ฐ๋ผํ•˜๋ฉด์„œ ๋ฐฐ์šฐ๋Š” NestJS ๐Ÿงธ ์œ ์ € ์ด๋ฆ„์— ์œ ๋‹ˆํฌํ•œ ๊ฐ’ ์ฃผ๊ธฐ ์œ ์ € ์ƒ์„ฑํ•  ๋•Œ ์œ ์ € ์ด๋ฆ„์ด ์ด๋ฏธ ์‚ฌ์šฉ๋˜๋Š” ์œ ์ € ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ ค ํ•œ๋‹ค๋ฉด ์—๋Ÿฌ ๋ณด๋‚ด๊ธฐ 1) repository ์—์„œ findOne ๋ฉ”์†Œ๋“œ ์ด์šฉํ•˜์—ฌ ์ด๋ฏธ ๊ฐ™์€ ์œ ์ € ์ด๋ฆ„์„ ๊ฐ€์ง„ ์•„์ด๋””๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ ์—†๋‹ค๋ฉด ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๊ธฐ -> ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฒ˜๋ฆฌ๋ฅผ ๋‘๋ฒˆ ํ•ด์•ผ ํ•จ 2) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ ˆ๋ฒจ์—์„œ ๋งŒ์•ฝ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์œ ์ €๊ฐ€ ์žˆ๋‹ค๋ฉด ์—๋Ÿฌ ๋˜์ง€๊ธฐ ๐Ÿงธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ ˆ๋ฒจ์—์„œ ๋งŒ์•ฝ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์œ ์ €๊ฐ€ ์žˆ๋‹ค๋ฉด ์—๋Ÿฌ ๋˜์ง€๊ธฐ ๐ŸŽ€ user.entity.ts import { BaseEntity, Column, Entity, PrimaryColumn, PrimaryGeneratedColumn, Unique } from "typeorm"; @Entity() //..