Skip to content

Commit 9d92cdc

Browse files
authored
Merge pull request #41 from Park-seoyun/main
9, 10주차 - 준/박서윤 워크북 과제 제출
2 parents f034c29 + 18553bb commit 9d92cdc

4 files changed

Lines changed: 212 additions & 0 deletions

File tree

week09/keyword/keyword.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
- OAuth 2.0
2+
3+
**"권한 부여를 위한 프로토콜(약속)"**
4+
5+
- **개념:** 사용자가 비밀번호를 직접 알려주지 않아도, 특정 애플리케이션이 사용자의 정보(구글, 카카오 등)에 접근할 수 있도록 권한을 위임해 주는 표준 프로토콜
6+
- JWT
7+
8+
**"정보를 담은 토큰(티켓)의 형식"**
9+
10+
- **개념:** 인증에 필요한 정보(유저 ID, 만료 시간 등)를 암호화된 JSON 문자열로 만든 **토큰의 표준 규격**
11+
- **구조:** `aaaaa.bbbbb.ccccc` 처럼 점(.)으로 구분된 세 부분(헤더, 페이로드, 서명)으로 이루어져 있다.
12+
- **장점:** 서버가 별도의 세션 저장소(메모리)를 뒤지지 않아도, **토큰 자체만 보면 "이 사람이 누구고, 위조되지 않았는지" 바로 알 수 있다.**
13+
- Bearer Token
14+
15+
**"토큰을 사용하는 방식(운반자)"**
16+
17+
- **개념:** HTTP 통신을 할 때 토큰을 서버로 보내는 **규칙 중 하나**
18+
- **의미:** "Bearer"는 "소지자"라는 뜻입니다. 즉, **"이 토큰을 가지고 있는(Bearer) 사람에게 권한을 줘라"**라는 의미
19+
- **사용법:** 주로 HTTP 헤더에 다음과 같이 담아서 보낸다.
20+
21+
> Authorization: Bearer <여기에_JWT_토큰>
22+
>
23+
- **주의점:** 마치 현금이나 영화 표와 같다. 잃어버리면 **주운 사람이 주인 행세**를 할 수 있으므로 HTTPS 등을 통해 탈취되지 않게 관리해야 한다.

week09/mission/mission.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
### 미션 1: 하드코딩 제거
2+
3+
**Before (기존):**
4+
5+
```jsx
6+
*// review.controller.js*
7+
const userId = 1; *// 하드코딩// mission.controller.js*
8+
const userId = 1; *// 하드코딩*
9+
```
10+
11+
**After (개선):**
12+
13+
```jsx
14+
*// review.controller.js*
15+
const userId = req.user.id; *// JWT에서 가져옴// mission.controller.js*
16+
const userId = req.user.id; *// JWT에서 가져옴*
17+
```
18+
19+
### 미션 2: 사용자 정보 수정 API 추가
20+
21+
**새 API 추가:**
22+
23+
PATCH /api/v1/users/me
24+
25+
**Request:**
26+
27+
```json
28+
{
29+
"nickname": "새닉네임",
30+
"gender": "MALE",
31+
"birth_date": "1995-05-15",
32+
"address_main": "서울시 강남구"
33+
}
34+
```
35+
36+
**Response:**
37+
38+
```json
39+
{
40+
"resultType": "SUCCESS",
41+
"error": null,
42+
"success": {
43+
"id": 1,
44+
"email": "user@example.com",
45+
"nickname": "새닉네임",
46+
"gender": "MALE",
47+
"birth_date": "1995-05-15",
48+
"address_main": "서울시 강남구"
49+
}
50+
}
51+
```
52+
53+
### 미션 3: JWT 인증 미들웨어 적용 (auth.config.js)
54+
55+
**isLogin 미들웨어:**
56+
57+
```json
58+
const isLogin = passport.authenticate('jwt', { session: false });
59+
```
60+
61+
**보호된 API 목록:**
62+
API인증 필요
63+
POST /api/v1/users/signup 로그인 불필요
64+
공개GET /api/v1/users/me 로그인 필요
65+
PATCH /api/v1/users/me 로그인 필요
66+
POST /api/v1/regions/:regionId/stores 로그인 필요
67+
POST /api/v1/stores/:storeId/reviews 로그인 필요
68+
POST /api/v1/stores/:storeId/missions 로그인 필요
69+
POST /api/v1/missions/:missionId/challenge 로그인 필요

week10/keyword/keyword.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
- CI/CD
2+
3+
**"코드 작성부터 배포까지의 과정을 자동화하는 것”**
4+
5+
**CI (Continuous Integration):**
6+
7+
- 여러 개발자가 작성한 코드를 자주(지속적으로) 합치고, 자동으로 테스트하여 에러를 미리 잡아내는 과정
8+
9+
**CD (Continuous Deployment/Delivery):**
10+
11+
- 테스트를 통과한 코드를 실제 사용자가 쓰는 서버에 자동으로 배포하는 과정
12+
13+
**핵심:** 개발자가 수동으로 서버에 파일을 올리는 수고를 없애고, 실수를 방지
14+
15+
- GitHub Actions
16+
17+
**"GitHub에서 제공하는 CI/CD 자동화 도구"**
18+
19+
- **역할:** CI/CD를 실현시켜 주는 구체적인 도구(Tool)
20+
- **특징:** GitHub 리포지토리(저장소)와 찰떡궁합입니다. `.yml` 파일을 만들어 "누군가 코드를 `push`하면, 자동으로 빌드하고 테스트해라"라고 명령을 내릴 수 있다.
21+
- **비유:** 공장의 '자동 조립 로봇'과 같다.
22+
- Reverse Proxy
23+
24+
**"클라이언트와 서버 사이의 중계자"**
25+
26+
- **개념:** 사용자가 웹사이트에 접속할 때, 요청을 가장 먼저 받아서 내부의 실제 서버(Backend)로 전달해 주는 서버입니다. (대표적인 예: Nginx, Apache)
27+
28+
**왜 쓰는가?**
29+
30+
- **보안:** 실제 서버의 IP를 숨길 수 있다.
31+
- **부하 분산 (Load Balancing):** 사용자가 많을 때 여러 서버로 요청을 나눠준다.
32+
- **HTTPS 처리:** 암호화/복호화 과정을 여기서 담당하여 뒷단의 서버 부담을 줄인다.
33+
- HTTPS
34+
35+
**"보안이 강화된 인터넷 통신 규약"**
36+
37+
- **개념:** 기존의 HTTP에 SSL/TLS라는 자물쇠를 채운 것이다.
38+
- **역할:** 사용자가 보내는 데이터(비밀번호 등)를 암호화하여 해커가 중간에서 가로채도 내용을 알 수 없게 만든다.

week10/mission/mission.md

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/.github/workflows/deploy-main.yml
2+
3+
```jsx
4+
name: deploy-main
5+
6+
on:
7+
push:
8+
branches:
9+
- main
10+
workflow_dispatch:
11+
12+
jobs:
13+
deploy:
14+
runs-on: ubuntu-latest
15+
steps:
16+
- name: Checkout
17+
uses: actions/checkout@v4
18+
19+
- name: Configure SSH
20+
run: |
21+
mkdir -p ~/.ssh
22+
echo "$EC2_SSH_KEY" > ~/.ssh/id_rsa
23+
chmod 600 ~/.ssh/id_rsa
24+
25+
cat >>~/.ssh/config <<END
26+
Host umc-server
27+
HostName $EC2_HOST
28+
User ubuntu
29+
IdentityFile ~/.ssh/id_rsa
30+
StrictHostKeyChecking no
31+
END
32+
env:
33+
EC2_HOST: ${{ secrets.EC2_HOST }}
34+
EC2_SSH_KEY: ${{ secrets.EC2_SSH_KEY }}
35+
36+
- name: Copy Workspace
37+
run: |
38+
ssh umc-server 'sudo mkdir -p /opt/app'
39+
ssh umc-server 'sudo chown ubuntu:ubuntu /opt/app'
40+
scp -r ./[!.]* umc-server:/opt/app
41+
42+
- name: Install dependencies
43+
run: |
44+
ssh umc-server 'cd /opt/app && npm install'
45+
ssh umc-server 'cd /opt/app && npx prisma generate'
46+
47+
- name: Copy systemd service file
48+
run: |
49+
ssh umc-server '
50+
echo "[Unit]
51+
Description=UMC Workbook Project
52+
After=network.target
53+
54+
[Service]
55+
User=ubuntu
56+
WorkingDirectory=/opt/app
57+
ExecStart=/usr/bin/npm run start --prefix /opt/app/
58+
Restart=always
59+
Environment=NODE_ENV=production
60+
61+
[Install]
62+
WantedBy=multi-user.target" | sudo tee /etc/systemd/system/app.service
63+
'
64+
65+
- name: Enable and restart service
66+
run: |
67+
ssh umc-server 'sudo systemctl daemon-reload'
68+
ssh umc-server 'sudo systemctl enable app'
69+
ssh umc-server 'sudo systemctl restart app'
70+
```
71+
72+
오류 : SSH 연결 타임아웃 → ssh 모든 ip 허용
73+
74+
ec2에 .env 파일생성
75+
76+
sudo nano /opt/app/.env
77+
78+
prisma 마이그레이션
79+
80+
cd /opt/app && npx prisma migrate deploy
81+
82+
EC2 보안 그룹 → Custom TCP / 3001 / 0.0.0.0/0 추가

0 commit comments

Comments
 (0)