Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions week09/keyword/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
- OAuth 2.0

**"권한 부여를 위한 프로토콜(약속)"**

- **개념:** 사용자가 비밀번호를 직접 알려주지 않아도, 특정 애플리케이션이 사용자의 정보(구글, 카카오 등)에 접근할 수 있도록 권한을 위임해 주는 표준 프로토콜
- JWT

**"정보를 담은 토큰(티켓)의 형식"**

- **개념:** 인증에 필요한 정보(유저 ID, 만료 시간 등)를 암호화된 JSON 문자열로 만든 **토큰의 표준 규격**
- **구조:** `aaaaa.bbbbb.ccccc` 처럼 점(.)으로 구분된 세 부분(헤더, 페이로드, 서명)으로 이루어져 있다.
- **장점:** 서버가 별도의 세션 저장소(메모리)를 뒤지지 않아도, **토큰 자체만 보면 "이 사람이 누구고, 위조되지 않았는지" 바로 알 수 있다.**
- Bearer Token

**"토큰을 사용하는 방식(운반자)"**

- **개념:** HTTP 통신을 할 때 토큰을 서버로 보내는 **규칙 중 하나**
- **의미:** "Bearer"는 "소지자"라는 뜻입니다. 즉, **"이 토큰을 가지고 있는(Bearer) 사람에게 권한을 줘라"**라는 의미
- **사용법:** 주로 HTTP 헤더에 다음과 같이 담아서 보낸다.

> Authorization: Bearer <여기에_JWT_토큰>
>
- **주의점:** 마치 현금이나 영화 표와 같다. 잃어버리면 **주운 사람이 주인 행세**를 할 수 있으므로 HTTPS 등을 통해 탈취되지 않게 관리해야 한다.
69 changes: 69 additions & 0 deletions week09/mission/mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
### 미션 1: 하드코딩 제거

**Before (기존):**

```jsx
*// review.controller.js*
const userId = 1; *// 하드코딩// mission.controller.js*
const userId = 1; *// 하드코딩*
```

**After (개선):**

```jsx
*// review.controller.js*
const userId = req.user.id; *// JWT에서 가져옴// mission.controller.js*
const userId = req.user.id; *// JWT에서 가져옴*
```

### 미션 2: 사용자 정보 수정 API 추가

**새 API 추가:**

PATCH /api/v1/users/me

**Request:**

```json
{
"nickname": "새닉네임",
"gender": "MALE",
"birth_date": "1995-05-15",
"address_main": "서울시 강남구"
}
```

**Response:**

```json
{
"resultType": "SUCCESS",
"error": null,
"success": {
"id": 1,
"email": "[email protected]",
"nickname": "새닉네임",
"gender": "MALE",
"birth_date": "1995-05-15",
"address_main": "서울시 강남구"
}
}
```

### 미션 3: JWT 인증 미들웨어 적용 (auth.config.js)

**isLogin 미들웨어:**

```json
const isLogin = passport.authenticate('jwt', { session: false });
```

**보호된 API 목록:**
API인증 필요
POST /api/v1/users/signup 로그인 불필요
공개GET /api/v1/users/me 로그인 필요
PATCH /api/v1/users/me 로그인 필요
POST /api/v1/regions/:regionId/stores 로그인 필요
POST /api/v1/stores/:storeId/reviews 로그인 필요
POST /api/v1/stores/:storeId/missions 로그인 필요
POST /api/v1/missions/:missionId/challenge 로그인 필요
38 changes: 38 additions & 0 deletions week10/keyword/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
- CI/CD

**"코드 작성부터 배포까지의 과정을 자동화하는 것”**

**CI (Continuous Integration):**

- 여러 개발자가 작성한 코드를 자주(지속적으로) 합치고, 자동으로 테스트하여 에러를 미리 잡아내는 과정

**CD (Continuous Deployment/Delivery):**

- 테스트를 통과한 코드를 실제 사용자가 쓰는 서버에 자동으로 배포하는 과정

**핵심:** 개발자가 수동으로 서버에 파일을 올리는 수고를 없애고, 실수를 방지

- GitHub Actions

**"GitHub에서 제공하는 CI/CD 자동화 도구"**

- **역할:** CI/CD를 실현시켜 주는 구체적인 도구(Tool)
- **특징:** GitHub 리포지토리(저장소)와 찰떡궁합입니다. `.yml` 파일을 만들어 "누군가 코드를 `push`하면, 자동으로 빌드하고 테스트해라"라고 명령을 내릴 수 있다.
- **비유:** 공장의 '자동 조립 로봇'과 같다.
- Reverse Proxy

**"클라이언트와 서버 사이의 중계자"**

- **개념:** 사용자가 웹사이트에 접속할 때, 요청을 가장 먼저 받아서 내부의 실제 서버(Backend)로 전달해 주는 서버입니다. (대표적인 예: Nginx, Apache)

**왜 쓰는가?**

- **보안:** 실제 서버의 IP를 숨길 수 있다.
- **부하 분산 (Load Balancing):** 사용자가 많을 때 여러 서버로 요청을 나눠준다.
- **HTTPS 처리:** 암호화/복호화 과정을 여기서 담당하여 뒷단의 서버 부담을 줄인다.
- HTTPS

**"보안이 강화된 인터넷 통신 규약"**

- **개념:** 기존의 HTTP에 SSL/TLS라는 자물쇠를 채운 것이다.
- **역할:** 사용자가 보내는 데이터(비밀번호 등)를 암호화하여 해커가 중간에서 가로채도 내용을 알 수 없게 만든다.
82 changes: 82 additions & 0 deletions week10/mission/mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/.github/workflows/deploy-main.yml

```jsx
name: deploy-main

on:
push:
branches:
- main
workflow_dispatch:

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Configure SSH
run: |
mkdir -p ~/.ssh
echo "$EC2_SSH_KEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa

cat >>~/.ssh/config <<END
Host umc-server
HostName $EC2_HOST
User ubuntu
IdentityFile ~/.ssh/id_rsa
StrictHostKeyChecking no
END
env:
EC2_HOST: ${{ secrets.EC2_HOST }}
EC2_SSH_KEY: ${{ secrets.EC2_SSH_KEY }}

- name: Copy Workspace
run: |
ssh umc-server 'sudo mkdir -p /opt/app'
ssh umc-server 'sudo chown ubuntu:ubuntu /opt/app'
scp -r ./[!.]* umc-server:/opt/app

- name: Install dependencies
run: |
ssh umc-server 'cd /opt/app && npm install'
ssh umc-server 'cd /opt/app && npx prisma generate'

- name: Copy systemd service file
run: |
ssh umc-server '
echo "[Unit]
Description=UMC Workbook Project
After=network.target

[Service]
User=ubuntu
WorkingDirectory=/opt/app
ExecStart=/usr/bin/npm run start --prefix /opt/app/
Restart=always
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target" | sudo tee /etc/systemd/system/app.service
'

- name: Enable and restart service
run: |
ssh umc-server 'sudo systemctl daemon-reload'
ssh umc-server 'sudo systemctl enable app'
ssh umc-server 'sudo systemctl restart app'
```

오류 : SSH 연결 타임아웃 → ssh 모든 ip 허용

ec2에 .env 파일생성

sudo nano /opt/app/.env

prisma 마이그레이션

cd /opt/app && npx prisma migrate deploy

EC2 보안 그룹 → Custom TCP / 3001 / 0.0.0.0/0 추가
Loading