서버 구조 및 요약
개발/작성자: 이모세
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}