1. 인증서비스 구현을 위해 필요한 지식
어떠한 사이트에 들어가서, 서비스를 이용하려면 로그인 같은 인증을 요하게 됩니다.
이러한 인증이 필요한 이유는 무엇일까요?
예전 강의에서 HTTP가 Stateless 라는 것을 배웠습니다.
그 부분을 다시 한번 복습해보겠습니다.
Stateless 가 무엇인지 알기 위한 예시

첫 번째 요청에서 서버에 이미 사용자 123이라고 말해도,
그 후 서버에게 다시 물어보면 서버는 내가 누군지 모릅니다.
왜 그럴까요 ?
HTTP가 stateless하기 때문입니다.
상태 비저장 프로토콜은 서버가 여러 요청 기간 동안 각 사용자에 대한 정보나 상태를 유지할 필요가 없습니다.
각 요청에 대한 연결을 재설정하는데 소요되는 시간/대역폭을 최소화하기 위한 것입니다.
인증 및 인가 절차의 기본흐름음 다음과 같습니다.

토큰은 클라이언트 측에 저장됩니다.
그 이후, 요청을 보낼 때마다 자신의 토큰을 함께 보내줍니다.
2. JWT에 대하여
이번에는 토큰을 생성할 때 사용하는 JWT라는 모듈에 대해 알아보겠습니다.
간단하게 설명하자면,
1. 정보를 안전하게 전해야하는 경우
2. 유저의 권한을 체크해야하는 경우
사용합니다.
해당 모듈은 JSON 형태로 발급됩니다.
구조는 아래와 같습니다.

빨간색 부분은 '헤더'입니다.
토큰에 대한 메타 데이터를 포함하고 있습니다.
ex. 어떤 해싱 알고리즘을 썼는지, SHA256이나 RSA 등..
보라색 부분은 '페이로드'입니다.
1. 유저 정보(issuer)
2. 만료 기간(expiration time)
3. 주제(subject)
등등.. 이 포함됩니다.
파란색 부분은 '서명'입니다.
토큰 전송자는 '헤더'부분과 '페이로드' 부분에 대해 암호화 알고리즘을 사용하여 서명을 만듭니다.
수신자는 이 부분을 확인하여 토큰의 정보가 변경되진 않았는지 확인할 수 있습니다.




비교하는 과정은 위와 같습니다.
클라이언트가 보낸 토큰의 헤더에는 사용한 해싱 알고리즘이 있습니다.
클라이언트가 보낸 토큰의 헤더와 페이로드에 대해 알고리즘을 적용해,
서버는 파란색 서명 파트를 만들어냅니다.
클라이언트가 보낸 서명 파트와 서버가 직접 만들어낸 서명 파트가 일치하면,
인증이 통과됩니다.
3. 간단한 인증 시스템 구현
위에서 배운 두 가지 내용을 적용한 간단한 인증 시스템을 직접 구현해보겠습니다.
1단계.. express 프레임워크 설치합니다.
2단계.. 프로젝트 폴더를 생성합니다.
3단계.. package.json 파일을 생성합니다.
--> 이 파일은 프로젝트의 정보와 의존성을 관리하는 문서입니다.
--> 패키지를 설치하면, 해당 패키지에 대한 정보가 이 문서에 기록됩니다.
4단계.. 필요한 jwt 모듈을 설치합니다.
npm install dotenv express jsonwebtoken nodemon
*dotenv는 환경 변수 생성을 위한 모듈입니다.
소스코드를 올릴 때, 비밀스러운 텍스트가 github에 올라가지 않도록
환경변수로 하여 다른 파일에다가 넣어 이 파일을 안 올라가게 할 것입니다.
dotenv에 대한 추가적인 설명은 아래와 같습니다.

Certainly! Here's an example case demonstrating how to use `dotenv` to manage environment variables in a Node.js application.
### Step-by-Step Example
1. **Install `dotenv`:**
First, you need to install the `dotenv` package in your Node.js project.
```sh
npm install dotenv
```
2. **Create a `.env` file:**
Create a file named `.env` in the root directory of your project. This file will store your environment variables.
```dotenv
# .env file
PORT=3000
DATABASE_URL=mongodb://localhost:27017/mydatabase
SECRET_KEY=mysecretkey
```
3. **Create a Node.js application file:**
Create an `app.js` file (or any entry point for your Node.js application). In this file, you will configure `dotenv` to load the environment variables.
```javascript
// app.js
const express = require('express');
const dotenv = require('dotenv');
// Load environment variables from .env file
dotenv.config();
const app = express();
const port = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.send('Hello, world!');
});
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
console.log(`Database URL: ${process.env.DATABASE_URL}`);
console.log(`Secret Key: ${process.env.SECRET_KEY}`);
});
```
4. **Run your application:**
Run your Node.js application using the command below.
```sh
node app.js
```
### Explanation
- **Step 1:** Installing `dotenv` makes it available for use in your project.
- **Step 2:** The `.env` file contains key-value pairs for environment variables (`PORT`, `DATABASE_URL`, and `SECRET_KEY` in this case).
- **Step 3:** In the `app.js` file:
- `dotenv.config()` loads the variables from the `.env` file into `process.env`.
- `process.env.PORT`, `process.env.DATABASE_URL`, and `process.env.SECRET_KEY` are used to access the environment variables.
- **Step 4:** When you run the application, `dotenv` loads the environment variables, and the application can use them to configure the server port, connect to the database, or handle secret keys securely.
This example demonstrates how `dotenv` helps manage environment variables, keeping them separate from your code and making it easier to manage different configurations for development, testing, and production environments.

그리고 이렇게 따로 둔 .env파일을 .gitignore에 등록하여, environment variables에 대한 정보가 git에 올라가는 것을 방지할 수 있습니다.

*jsonwebtoken은 토큰 생성을 위한 모듈입니다.
*nodemon은 서버를 재시작하지 않고도 수정한 사항이 반영되게 하는 모듈입니다.
'스터디 > Server' 카테고리의 다른 글
상품 관리 애플리케이션 만들기 4 - DTO와 getter, setter (0) | 2024.08.30 |
---|---|
상품 관리 애플리케이션 만들기 (1) - 3 프로젝트 전체 구조 잡기 (0) | 2024.08.29 |
JSON을 주고 받는 AJAX 코드 구조 (0) | 2024.08.27 |
비동기 상호작용이란? (2) | 2024.08.27 |
[백엔드 개발에 필요한 최소한의 js 지식] 자바스크립트에서의 함수 (0) | 2024.08.27 |