항해14기 본과정/항해14기 개발일지

[항해 14기] 개발일지27 (Swagger, Access/Refresh Token)

스쿼트잘함 2023. 5. 3. 21:03

Swagger, Access/Refresh Token

 

1. Swagger

1) 정의

- RESTful API를 문서화하고 시각화하는 도구(api명세)

- API를 개발, 테스트, 공유를 용이하게 하여 협업 생산성 증가
- API를 문서화하기 위한 명세 언어인 OpenAPI Specification을 사용, 자동으로 API 문서를 생성하고, 명세서ui제공
2) swagger-autogen

- swagger의 기본 틀을 자동생성하는 node.js 라이브러리

3) 사용법

- npm i swagger-ui-express swagger-autogen

- app.js에

const swaggerUi = require("swagger-ui-express");

const swaggerFile = require("./swagger-output");

app.use("/swagger", swaggerUi.serve, swaggerUi.setup(swaggerFile));

 

- 원하는 위치에 swagger.js생성 후

 // autogen 패키지 불러오기 및 실행
 const swaggerAutogen = require("swagger-autogen")();
 // 기본 설명 설정 알맞게 채워주세요
 const doc = {
   info: {
     title: "My API",
     description: "Description",
   },
   host: "localhost:3000",
   schemes: ["http"],
 };

 const outputFile = "./swagger-output.json";
 const endpointsFiles = [
   "./app.js" //저희 최종 실행 파일인 app.js
 ];

 swaggerAutogen(outputFile, endpointsFiles, doc);

- 이후 node ./swagger.js 실행

- 해당 url로 접속하여 확인

- 수정 시 swagger-output.json에서 변경

"/api/auth/login/user": {     
      "post": {
        "tags": ["auth"],
        "description": "로컬 유저 로그인",
        "parameters": [          
            {
              "name": "body",
              "in": "body",
              "schema": {
                "type": "object",
                "properties": {
                  "email": {"example":"jjm@jjm.com" },
                  "password": {"example":"1234abc"}                  
                }
              }
            }
          ],        
        "responses": {
          "200": {
            "description": "로그인 성공",
            "schema": {
              "type": "object",
              "properties": {
                "message": { "example": "로그인 완료" }
              }
            }
          }
        }
      },     
    },

 

 

 

2. Access/Refresh Token

1) Access Token

- 사용자의 권한이 확인(ex: 로그인) 되었을 경우 해당 사용자를 인증하는 용도로 발급
- Cookie로 jwt를 발급하고 설정한 Expires 기간이 지날 때 인증이 만료되게 하는것 또한 Access Token
- Stateless(무상태)상태 : Node.js 서버가 꺼졌다 켜져도 동일한 동작을하는 방식. jwt를 이용해 사용자의 인증 여부는 확인할 수 있지만 처음 발급한 사용자 본인인지 확인이 불가능
- 그 자체로 사용자를 인증하는 모든 정보를 가지고 있기 때문에 탈취된 시간이 길수록 피해가 큼

2) Refresh Token

- 특정한 사용자가 Access Token을 발급받기 위한 용도로 사용.

- 사용자의 인증정보를 사용자가 가지고 있는 것이 아닌, 서버에서 해당 사용자의 정보를 저장소(레디스 참조) 또는 별도의 DB에 저장하여 관리

-서버에서 특정 Token 만료가 필요할 경우 저장된 Token을 제거하여 사용자의 인증 제어가 가능, 사용자에게 발급한 Token이 탈취당할 경우 피해를 최소화 하기 위해서 사용

- 레디스 참고 링크(https://velog.io/@c1madang/Redis-Refresh-Token)
 

 

 

3. Refresh Token 적용

1) 5lv 적용 성공

2) 토큰 값을 주고 받는 과정에서 에러가 많이 발생(토큰 값을 전달해주는 방식과 토큰의 데이터 타입 등)

3) 리팩토링 진행 후 미니프로젝트에 반영 하였음(https://jujiprogram.tistory.com/60)