Skip to content

Latest commit

 

History

History
224 lines (209 loc) · 5.94 KB

ex03.md

File metadata and controls

224 lines (209 loc) · 5.94 KB

Exercise 03 - 🍪쿠키나라🍪의 이민 시스템!

제출할 폴더 이름 : ex03
제출할 파일 이름 : Express 프로젝트에 필요한 모든 파일
사용 가능한 외부 모듈 : express, jsonwebtoken, passport, passport-local, bcrypt, passport-jwt, sequelize, validator, dotenv, nodemon, Expressjs team에서 지원하는 middleware
참고사항 : 없음

🍪쿠키나라🍪 에서 단순하게 여행을 오는 것만이 아니라 이민을 오는 것을 허용하게 되었습니다!

지금까지 여권관련 업무를 완벽하게 수행하였기 때문에 새로운 이민 관련 시스템을 구축하는데에도 담당자로 선정이 되셨습니다!

여러분들은 아래의 사항을 지켜서 구현해 주세요!

제약 사항

  • JWT SECRET KEY는 code 내부에 raw로 작성되어 있으면 안됩니다.
  • expiraton을 설정 하여야 합니다.
  • 인증유저를 구분하는 로직은 middle ware로 구현을 해야 합니다.
  • jwt의 payload 내부에는 불필요한 정보와 민감한 정보는 없어야 합니다.
  • jwt의 payload 내부에는 user에 대해서 구분 할 수 있는 값이 포함되어야 만 합니다.
  • passport-jwt 검증하는 로직에서 req.user 에 해당 user의 DB object가 주입되어야 합니다.
  • Token 전달 방식은 Bearer Authentication 를 이용합니다.
  • user의 password는 반드시 bcrypt 모듈을 통해 Hash 값을 저장시켜야 합니다.
  • bcrypt 의 saltRounds 는 적절한 값으로 지정되어 있어야 합니다.
  • DB는 MySQL(MariaDB) 를 사용하여야 합니다.
  • DB 모델은 아래와 같은 구조로 만들어야 합니다.
    • dbDiagram
  • user의 name password는 아래의 조건으로 검증을 해야 합니다.
    • username은 영문 소문자와 숫자만 허용. 6글자 이상.
    • password는 영문 대문자,소문자,숫자가 각각 있어야하며, 8글자 이상.
  • Primary key는 모두 auto increment로 작동되어야 합니다.
  • 아래의 API 명세에 있는 기능을 구현하되 출입국 여부는 신경쓰지 않아도 됩니다!
  • 핸들링 되지 않은 서버 오류는 없어야 합니다.

API 명세

  • URL /immigrate
    • 새로운 시민을 생성하는 ENDPOINT
  • Method POST
  • Params
    • None
  • Query
    • None
  • Body - json
    • name
      • type: string
    • password
      • type: string
    • passwordConfirm
      • type: string
  • Header
    • None
  • Cookies
    • None
  • 이민 성공시
    • body
      {
        "msg" : "🍪 쿠키의 세상의 주민이 되신 걸 환영 합니다~! 🍪"
      }
  • 잘못된 요청 시
    • body
      {
        "msg" : "🍪 쿠키의 세상의 주민이 되실 수 없습니다. 🍪",
        "reason": [
          "password 검증 실패" // 해당하는 오류 항목 들을 추가 해주세요.
        ]
      }

  • URL /token
    • token를 발급받는 ENDPOINT
  • Method POST
  • Params
    • None
  • Query
    • None
  • Body - json
    • name
      • type: string
    • password
      • type: string
  • Header
    • None
  • Cookies
    • None
  • 발급 성공시
    • body
      {
        "msg" : "🍪 신분증 발급 성공! 🍪",
        "token" : "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjQyNDI0MjQyNDIsInVzZXJuYW1lIjoiamFlc2tpbSJ9.BMexiK1IQG8CQ8ckiI3kB3JsXArhZnAEZI0NFFYnCs4"
      }
  • 잘못된 요청 시
    • body
      {
        "msg" : "🍪 신분증 발급 실패! 🍪",
        "reason": [
          "password 검증 실패" // 해당하는 오류 항목 들을 추가 해주세요.
        ]
      }

  • URL /me
    • 해당 사용자의 출입국 정보를 반환하는 ENDPOINT
  • Method GET
  • Params
    • None
  • Query
    • None
  • Body
    • None
  • Header
    • Authorization
      • bearer <token>
  • Cookies
    • None
  • 정상응답
    • body
      {
        "msg" : "🍪 <name>님의 출입국 정보! 🍪",
        "data" : {
          "entry" : [
            "2021-07-18T18:23:26.260Z"
          ],
          "exit" : [
            "2021-07-18T18:23:26.260Z"
          ]
        }
      }
  • 잘못된 요청 시
    • body
      {
        "msg" : "🍪 출입국 조회 실패! 🍪",
        "reason": [
          "token 검증 실패" // 해당하는 오류 항목 들을 추가 해주세요.
        ]
      }

  • URL /entry
    • 해당 사용자의 입국정보를 남기는 ENDPOINT
  • Method GET
  • Params
    • None
  • Query
    • None
  • Body
    • None
  • Header
    • Authorization
      • bearer <token>
  • Cookies
    • None
  • 정상응답
    • body
      {
        "msg" : "🍪 <name>님의 입국이 정상적으로 처리되었습니다! 🍪"
      }
  • 잘못된 요청 시
    • body
      {
        "msg" : "🍪 쿠키 나라 입국 실패! 🍪",
        "reason": [
          "token 검증 실패" // 해당하는 오류 항목 들을 추가 해주세요.
        ]
      }

  • URL /exit
    • 해당 사용자의 출국정보를 남기는 ENDPOINT
  • Method GET
  • Params
    • None
  • Query
    • None
  • Body
    • None
  • Header
    • Authorization
      • bearer <token>
  • Cookies
    • None
  • 정상응답
    • body
      {
        "msg" : "🍪 <name>님의 입국이 정상적으로 처리되었습니다! 🍪"
      }
  • 잘못된 요청 시
    • body
      {
        "msg" : "🍪 쿠키 나라 출국 실패! 🍪",
        "reason": [
          "token 검증 실패" // 해당하는 오류 항목 들을 추가 해주세요.
        ]
      }