서버 구조 및 요약

  개발/작성자: 이모세

  Container: aws lightsail instance (5$/month)
  
  OS: ubuntu server 22.04 LTS
  
  Server: nginx server (:80 :443)
  
  Domain/static ip:
    data.swim.org
    15.164.120.19
  
  nginx reverse proxy
  
  App server: express (:3000)

  의존성 설치 목록
  [ dotenv, express,
    mysql2, cors,
    jsonwebtoken, bcryptjs,
    cookie-parser, morgan,
    express-rate-limit ]

  추가사항은 package.json 확인

  CORS: aws.swim.org
  DBMS: mysql server (:3306)
  
  ⚠️ SQL injection 체크되고 있음, 명시된 요청 방식/타입 외에 응답안됨. (400 / 200 → error)
  ⚠️ 1개 IP 초당 10회 요청가능 넘으면 데이터처리 안함.
  ⚠️ 1개 IP 15분당 5회 인증관련 요청가능 넘으면 데이터처리 안함.

디렉터리 구조

  ! 아직 코드 스플릿 안함. 아래처럼 될 예정임 !

  /src
  │ 
  ├── /controllers
  │     ├── authController.js : 인증 로직 처리
  │     ├── pageController.js : 사이트 페이지 관련 로직 처리
  │     ├── postController.js : 게시글 관련 로직 처리
  │     ├── qtDataController.js : Qt데이터 로직 처리
  │ 
  ├── /middleware
  │     ├── authMiddleware.js : 인증 관련 미들웨어 JWT 등
  │     ├── rateLimiter.js : 연결 속도 제한 컨트롤러들
  │ 
  ├── /routes
  │     ├── authRoutes.js  : 로그인, 로그아웃, 토큰 갱신 등 인증 관련 엔드포인트 정의
  │     ├── pageRoutes.js : 사이트를 구성하는 페이지 데이터 엔드포인트 정의
  │     ├── postRoutes.js : 게시글 페이지네이션 등 엔드포인트 정의
  │     ├── qtRoutes.js : qt페이지에서 요청하는 엔드포인트들 정의
  │ 
  ├── /config
  │     ├── db.js : 데이터베이스 연결 풀 설정
  │     ├── serverConfig.js : 서버 설정 값 정리
  │ 
  ├── .env : 환경 값 정의
  ├── app.js : 앱 초기화 및 미들웨어, 라우트를 설정
  ├── package.json : 의존성 패키지 목록

  /public
  │ 
  ├── /img
  │     ├── images : 정적으로 제공될 이미지 파일들



API 명세


정적컨텐츠

GET /

  : 이 페이지를 응답함.
  : index.html
  

GET /img/{fileName}

  : 이미지 파일을 응답함.
  : file.image(png,jpg)
  

GET /list/{date}

  : 큐티 리스트 페이지에 나오는 요약 정보 리턴
  : JSON
  : [
      {
          "source": string
          "url": string,
          "copy_right": string,
          "bible_code": num,
          "bible_start_jang": num,
          "bible_start_jul": num,
          "bible_end_jang": num,
          "bible_end_jul": num,
          "title": string
      },
      {...}
    ]
  


QT컨텐츠

GET /dailybible/{date}

  : 매일성경 한글 정보 리턴
  : JSON
  : [
      {
        "title": string,
        "bible_medit": string,
        "bible_pray": string,
        "bible_text": string,
        "bible_code": num,
        "bible_start_jang": num,
        "bible_start_jul": num,
        "bible_end_jang": num,
        "bible_end_jul": num
      }
    ]
  

GET /life/{date}

  : 생명의 삶 한글 정보 리턴
  : JSON
  : 데이터타입 생략
  

GET /spurgeon/{date}

  : 스펄전의 아침묵상 정보 리턴
  : JSON
  : 데이터타입 생략

GET /odb/{date}

  : 오늘의 양식 정보를 리턴
  : JSON
  : 데이터타입 생략

GET /living/{date}

  : 리빙라이프 정보를 리턴
  : JSON
  : 데이터타입 생략

GET /jplife/{date}

  : 일본어 생명의 삶 정보를 리턴
  : JSON
  : 데이터타입 생략

GET /dailybibleeng/{date}

  : 말씀묵상 영문 정보를 리턴
  : JSON
  : 데이터타입 생략

GET /arlife/{date}

  : 아랍어 생명의 삶 정보를 리턴
  : JSON
  : 데이터타입 생략

GET /likejesus/{date}

  : 예조 정보를 리턴
  : JSON
  : 데이터타입 생략

GET /dawn/{date}

  : 새나 정보를 리턴
  : JSON
  : 데이터타입 생략



인증

  15분에 5번으로 요청 제한됨.
  강제 https 사용
  

POST /api/register

  : 회원가입
  : body {
    username: string(email),
    password: string(암호화)
    }

POST /api/login

  : 로그인
  : Req
    body {
      username: string(email),
      password: string(암호화)
    }
  : Res
    cookie {refreshToken},
    body JSON {token}

POST /api/refresh

  : 인증갱신
  : Req
    cookies {refreshToken}
  : Res
    cookie {refreshToken},
    body JSON {token}

POST /api/logout

  : Res
    clearCookie {refreshToken}