2022. 4. 11. 04:38ใProgramming Project ์์ ์ค/๋ด์ฉ ์ ๋ฆฌ
Project Git Hub
๐ ๋ชฉ์ฐจ
โ [BackEnd][Node.js][Nest.js] ์ฌ๋ด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ํ์ ๊ฐ์
โ [BackEnd][Node.js][Nest.js] ์ฌ๋ด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - JWT๋ฅผ ์ด์ฉํ Login
โ [BackEnd][Node.js][Nest.js] ์ฌ๋ด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - Custom Decorator
๐ ๋ถ๋ก
โ [Node.js] Node.js ๊ธฐ์ด
โ [JavaScript] ๊ธฐ๋ณธ ๋ฌธ๋ฒ
โ [BackEnd][Node.js] ์ฌ๋ด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ์ด๊ธฐ ๊ตฌ์ฑ
โ [BackEnd][Node.js] ์ฌ๋ด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ์ด๊ธฐ ๊ตฌ์ฑ : DB ์ฐ๊ฒฐ
โ [BackEnd][Node.js] ์ฌ๋ด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ์ด๊ธฐ ๊ตฌ์ฑ : DB ์ฐ๊ฒฐ(Sequelize)
โ [Web] URL์ ์ดํด
โ [Spring] Spring์ด๋?
โ[Node.js][Nest.js] ์ ํจ์ฑ ๊ฒ์ฌ์ Data ํ์ ๋ณํํ๊ธฐ - Pipe
โ[Node.js][Nest.js] Configuration (์ค์ )
โ[Node.js][Nest.js]TypeORM
โ [Node.js][Nest.js] Logger ๊ธฐ๋ฅ
โ[JavaScript] Promise์ async ๊ทธ๋ฆฌ๊ณ await
โ [Nest.js] API ์ค๊ณ - ์์ฒญ, ์๋ต ๊ฐ์ฒด (Request, Response Object)
โ [์ ๋ณด๋ณด์] JWT(JSON Web Token) ์ด๋?
โ [Nest.js] Middle Ware(๋ฏธ๋ค์จ์ด)
๐ค ๋ด๊ฐ ๋ง๋ Error
โ [Node.js][Error] Cannot find module '.dotenv'
๐ JWT๋ฅผ ์ด์ฉํ Login
๐ฝ ์ค์นํ๊ธฐ
๐ฆ ์์ํ๊ธฐ ์ ์
์ฐ๋ฆฌ๋ `JWT`๋ฅผ ์ด์ฉํ Login ๊ตฌํ์ ์ํด `Passport` Module๋ ํจ๊ป ์ด์ฉํ ๊ฒ์ด์์.
์๋ํ๋ฉด ํด๋น Module์ด `JWT`๋ฅผ ์ด์ฉํ ์ธ์ฆ ์ฒ๋ฆฌ, ์ธ๊ฐ ์ฒ๋ฆฌ ๋ฑ์ ๊ณผ์ ์ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ค์ด์ฃผ๊ธฐ ๋๋ฌธ์ธ ๊ฒ์ด์์.
๐ฆ Module ์๊ฐ
โ @nestjs/jwt : `Nest.js`์์ `JWT`๋ฅผ ์ด์ฉํ ์ ์๊ฒ ๋์์ฃผ๋ Module.
โ @nestjs/passport : `Nest.js`์์ `Passport`๋ฅผ ์ด์ฉํ ์ ์๊ฒ ๋์์ฃผ๋ Module.
โ Passport : `Passport` Module.
โ passport-jwt : `JWT` Module.
๋ช ๋ น์ด
npm install @nestjs/jwt @nestjs/passport passport passport-jwt --save
๐ฝ ๋ฑ๋กํ๊ธฐ
`auth Module` imports ๋ถ๋ถ์ ๋ด์ฉ์ ๋ฃ์ด ์ค ๊ฒ์ด์์.
๋จผ์ ์ฃผ๋ํ๋์ `Configuration`์ ํตํ์ฌ yml์ ์์ฑํ JWT๊ด๋ จ ๋ด์ฉ์ 9๋ฒ์งธ ์ค์ฒ๋ผ ๊ฐ์ ธ์จ ๋ค ํด๋น ๋ด์ฉ์ 31, 32๋ฒ์งธ ์ค์์ ์ด์ฉํด์ ๋ฏผ๊ฐ ์ ๋ณด๋ฅผ ์จ๊ฒจ์ค ๊ฒ์ด์์. ๋น์ฐํ ์ด ์ ๋ณด๋ค์ `.gitignore`์๋ ๋ฑ๋ก์ด ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ฃผ๋ํ๋ ๋ง๊ณ ๋ ๋๊ตฌ๋ ํ์ธํ ์ ์๋ ๊ฒ์ด์์.
`Configuration`์ ๋ํ ๋ด์ฉ์ `์ด ๊ณณ`์์ ํ์ธํ์ค ์ ์๋๋ก ์ค๋นํด ๋๊ฒ์.
31๋ฒ์งธ ์ค `secret`์ Token์ ๋ง๋ค ๋ ์ด์ฉํ๋ ๋น๋ฐ ๊ฐ์ ๋ฃ์ด์ฃผ๋ ๊ฒ์ด์์. ํ๋ฌธ์ผ๋ก ์ ๋ ฅํด๋ ๋๊ณ , ์ฃผ๋ํ๋์ ํ๋ฌธ์ base 64๋ก Encodingํ ๊ฐ์ ๋ฃ์ด ์ค ๊ฒ์ด์์.
`signOptions`์์ ์๋ช ์ ์ด๋ป๊ฒ ๊ตฌํํ ๊ฒ์ธ์ง๋ฅผ ์ ์ํด ์ฃผ๋ ๊ณณ์ธ ๊ฒ์ด์์.
32๋ฒ์งธ ์ค `ExpireIn`์ Token ๋ง๋ฃ ์๊ฐ์ ๋ฃ์ด์ค ๊ฒ์ด์์.
๐ฆ Passport ๋ฑ๋กํ๊ธฐ
32๋ฒ์งธ ์ค์ ์๋ก์ด ์๊ตฌ๊ฐ ์๊ธด๊ฒ์ด์์. ๋ฐ๋ก `PassportModule`์์ `register()`๋ฅผ ํธ์ถํ๋๋ฐ, ๊ทธ ์์ ๊ธฐ๋ณธ ์ ๋ต ๊ฐ์ผ๋ก `JWT`๋ฅผ ๋ฃ์ด์ค์ `JWT`๋ฅผ ์ด์ฉํ Login ๊ธฐ๋ฅ ๊ตฌํ์ ํ ์ ์๊ฒ ํด ์ฃผ๋ ๊ฒ์ด์์.
์ด์ `Service`์์ `SignIn` Method๋ฅผ ๋ง๋ค์ด ์ค ๊ฒ์ธ๋ฐ, ์์์ auth Module์ JWT๋ฅผ ๋ฑ๋กํ๊ธฐ ๋๋ฌธ์ `Service`์์ `JWT` ๋ด์ฉ์ ๊ฐ์ ธ์ฌ ์ ์๋ ๊ฒ์ด์์.
์์ ๊ฐ์ด ์์ฑ์ ๋ถ์ `userRepository`๋ฅผ `DI(Dependency Injection)` ํด์ฃผ์๋ฏ์ด `JWT`๋ ๋์ผํ๊ฒ ํด ์ค ๊ฒ์ด์์.
๐ฆ DTO ๋ง๋ค๊ธฐ
๋ก๊ทธ์ธ์ ํ ๋, ID์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ด๊ธฐ ์ํ DTO๋ฅผ ๋ง๋ค์ด ์ค ๊ฒ์ด์์.
์ญ์ `Pipe`๋ฅผ ์ด์ฉํ Validation์ ์ด์ฉํ๊ธฐ ์ํด ๋ง์ Decorator๊ฐ ๋ถ๋น ๋์ด ์๋ ๊ฒ์ด์์.
๐ฆ Service
๋จผ์ `Service` ๋ถ๋ถ์ ์ดํด ๋ณผ ๊ฒ์ด์์. ์ต์ด ๋งค๊ฐ ๋ณ์๋ก DTO๋ฅผ ๋ฐ๊ณ ๊ทธ DTO ๋ด์ฉ์ ID, Password๋ก ๋๋๊ธฐ ์ํด ๊ฐ๊ฐ ๋ณ์์ ๋ฃ์ด์ค ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค 146๋ฒ์งธ ์ค์ `Repository`์ `findOne()`์ ํตํด `Select`๋ฅผ ํ๋๋ฐ, ์ฃผ๋ํ๋์ ID์ Password ๊ฐ๋ง ํ์ํด์ `Select` Option์ 147๋ฒ ์ค๊ณผ ๊ฐ์ด ์ฃผ๊ณ , `where` Option์ ํตํด ์์ฒญ์ผ๋ก ๋ค์ด์จ ID๋ก ID๋ฅผ ์ฐพ๊ฒ ํ ๊ฒ์ด์์.
152๋ฒ์งธ ์ค์์ ํด๋น ๊ฐ์ด ์๋์ง์ ํจ๊ป ์ด์ฉ์๊ฐ ์ ๋ ฅํ ์ํธํ Data Base์ ์ ์ฅ๋์ด ์๋ ์ํธ๊ฐ ๊ฐ์์ง๋ฅผ ๋น๊ตํ ๋ค ๋ชจ๋ ์ฐธ(&& And ์ฐ์ฐ์)์ด๋ผ๋ฉด payload ์์ํ ๋ณ์์ ID๊ฐ์ ๋ฃ์ด์ค ๊ฒ์ด์์.
156๋ฒ์งธ ์ค์ `jwtService`์ `sing()`์ ํธ์ถํ๋๋ฐ, payload ๋ณ์ ๊ฐ์ ๋ณด๋ด ์ ์ ์๋ช ์ด ์ด๋ค์ง๊ฒ ๋ง๋ค๊ณ , ์ด๋ฅผ accessToken ์์ํ ๋ณ์์ ๋ฃ์ด์ค ๊ฒ์ด์์.
158 ~ 163๋ฒ์งธ๋ `Response(์๋ต)` ๊ฐ์ ์์ ๊ฐ์ด HTTP Status Code์ ํ๊ธ Message, ์์ด Message๋ฅผ ์ ๋ฌํ๊ณ , data Key์ accessToken ๊ฐ์ ๋ฃ์ด์ค ๊ฒ์ด์์.
์ด ๋ด์ฉ์ ์ ๋ฌํ๊ธฐ ์ํด Method ๋ฐํ Type์ ๋ณด๋ฉด Promise๋ฅผ ์ด์ฉํ๊ณ , ๋ง์ ๋ณ์๋ค์ ์ ๋ฌํ๋ ๊ฒ์ด์์.
๋ง์ฝ If๋ฌธ์ ํต๊ณผํ์ง ๋ชปํ๋ค๋ฉด Login์ด ์คํจํ๋ค๋ ์ ๋ณด๋ฅผ ๋ณด๋ผ ๊ฒ์ด์์.
Login์ ๋๊ฐ์ง ๊ฒฐ์ ์ด ์๋ ๊ฒ์ด์์. Login์ด ์ฑ๊ณตํ๊ฑฐ๋, Login์ด ์คํจํ๊ฑฐ๋, ์คํจ๋ฅผ ํ๋ค๋ ๊ฑด ID ํน์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ชป ์ ๋ ฅํด์ ๋ฐ์ํ๋ ๊ฒฐ๊ณผ์ผ ๊ฒ์ด์์.
๊ทธ ๋ด์ฉ์ ์์์ ๋ค ์ฒ๋ฆฌ๋ฅผ ํด์คฌ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ฉด Server ๋ฌธ์ ๋ก ํ๋จํ ์ ์๋ ๊ฒ์ด์์.
๊ทธ๋์ ์์ ๊ฐ์ด ์์ฑ์ ํด ์ค ๊ฒ์ด์์.
๐ฆ Controller
Controller๋ ์ต์ด `Service`์ `signIn()`์ ํธ์ถํ๋๋ฐ, ์ด์ฉ์๊ฐ Login์ ์ํด ์ ๋ ฅํ ๊ฐ์ ๋ด์ DTO๋ฅผ ์ ๋ฌํด์ ํธ์ถํ๋ ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค ๋ฐํ๊ฐ์ด ๋์์ค๋ฉด ์์ `Service`์์ ๋ฐํ๋๋ ๊ฐ๋ค์ด ์ ๋ ๊ฒ ์ค๊ธฐ ๋๋ฌธ์ ์๋ฃํ Type์ ์ ๋ ๊ฒ ์ค ์์ํ ๋ณ์ loginUser ๋ณ์์ ๊ฐ์ ๋ด์ res.status()๋ฅผ ํธ์ถํด์ 200์ ๋ํ ๋ด์ฉ์ ์ ๋ฌํ๊ณ , `Service`์์ ๋ง๋ Data๊ฐ `JSON` ํํ๋ก ์ ๋ฌ๋ ์ ์๊ฒ ํด ์ค ๊ฒ์ด์์.
๐ฝ ๊ฒฐ๊ณผ
๐ฆ POSTMAN
์ ์์ ์ผ๋ก Data๊ฐ ๋ฐํ๋๊ณ ์๊ณ , Access Token๊น์ง ์ ์ค๊ณ ์๋ ๊ฒ์ด์์.
์์ง `Vue.js`์์ Login ๋ถ๋ถ์ด ๊ตฌํ์ด ๋์ง ์์ `Vue.js`์์๋ ๋ค์ ํฌ์คํ ์ ์ค๋น ํด ๋๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ค์ ํฌ์คํ ์์๋ ์ธ๊ฐ ์ฒ๋ฆฌ์ ๋ํ ๋ด์ฉ์ ๊ณต๋ถํด ๋ณด๋๋ก ํ ๊ฒ์ด์์.
์ด์ ๊ธ : [BackEnd][Node.js][Nest.js] ์ฌ๋ด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ํ์ ๊ฐ์
๋ค์ ๊ธ : [BackEnd][Node.js][Nest.js] ์ฌ๋ด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์๋น์ค - ์ธ๊ฐ ์ฒ๋ฆฌ