Basic

[Backend][Basic] REST API와 JWT 인증, AWS EC2를 이용한 배포 과정 완벽 가이드

천재단미 2025. 3. 19. 10:10
728x90
반응형

Basic

목차 ▽열기

 

 

 

REST API란?

REST API는 웹 서비스에서 데이터를 주고받기 위한 표준적인 방식입니다. REST(Representational State Transfer)는 클라이언트(사용자)와 서버(웹 애플리케이션) 간의 통신을 효율적으로 처리하는 아키텍처입니다.

REST API의 특징

  • 리소스 기반 설계: 모든 데이터(사용자, 상품, 게시글 등)는 각각의 URL을 통해 접근할 수 있습니다.
  • HTTP 메서드 활용: 데이터를 조작할 때, 다음과 같은 HTTP 메서드를 사용합니다.
    • GET : 데이터를 조회
    • POST : 데이터를 생성
    • PUT : 데이터를 수정
    • DELETE : 데이터를 삭제
  • 상태 유지 X(Stateless): 서버는 클라이언트의 상태를 기억하지 않으며, 요청마다 필요한 정보를 포함해야 합니다.
  • JSON 또는 XML 형식 사용: 응답 데이터는 보통 JSON 형식으로 제공되며, 가독성이 좋고 가볍습니다.

REST API 예제

클라이언트가 서버에 GET 요청을 보낼 때:

GET <https://api.example.com/users/1>

 

서버 응답 (JSON 형식):

{
    "id": 1,
    "name": "John Doe",
    "email": "johndoe@example.com"
}

이처럼 REST API는 웹 애플리케이션의 데이터를 효율적으로 제공하는 역할을 합니다.


API JWT 발급의 흐름

API를 안전하게 사용하려면 **인증(Authentication)**이 필요합니다. 가장 널리 사용되는 방법 중 하나가 JWT(JSON Web Token) 인증입니다.

JWT란?

JWT는 JSON을 기반으로 한 인증 토큰입니다. 사용자의 로그인 정보를 암호화하여 클라이언트와 서버 간의 보안을 유지합니다.

JWT 인증 과정

1️⃣ 사용자 등록 (Sign Up)

  • 사용자가 회원가입을 진행합니다.
  • 서버는 사용자의 정보를 데이터베이스에 저장합니다.

2️⃣ 로그인 요청 (Sign In)

  • 사용자가 이메일과 비밀번호를 입력하여 로그인합니다.
  • 서버는 해당 정보를 확인하고, 로그인 성공 시 JWT 토큰을 생성하여 반환합니다.

3️⃣ JWT 토큰 발급

  • 로그인 성공 시 서버는 JWT 토큰을 생성하여 클라이언트에 전달합니다.
  • 이 토큰은 사용자 정보(이메일, 역할 등)를 포함하며, 서명(Signature)으로 보호됩니다.

4️⃣ 클라이언트가 API 요청 시 JWT 포함

  • 사용자는 API를 호출할 때, 요청 헤더에 JWT 토큰을 포함합니다.
GET <https://api.example.com/profile>
Authorization: Bearer 

 

5️⃣ 서버에서 JWT 검증

  • 서버는 클라이언트가 보낸 JWT가 유효한지 확인합니다.
  • 유효하면 요청을 처리하고 응답을 반환합니다.

JWT 예제

JWT는 3개의 부분으로 구성됩니다:

Header(헤더), Payload(내용), Signature(서명)

{
  "alg": "HS256",
  "typ": "JWT"
}
.
{
  "userId": 123,
  "email": "john@example.com",
  "exp": 1672531199
}
.
[서명 값]

서명(Signature)은 JWT가 위조되지 않았음을 증명하며, 이 값이 올바르지 않으면 API 요청이 거부됩니다.


배포 과정 (AWS EC2 + Docker + GitHub Actions)

REST API가 완성되면, 실제 사용자가 접근할 수 있도록 배포(Deploy) 해야 합니다.

배포는 AWS EC2 + Docker + GitHub Actions를 활용하여 자동화할 수 있습니다.

배포 과정 개요

  1. 소스 코드 관리: GitHub에서 프로젝트 코드 관리
  2. CI/CD 트리거: GitHub Actions가 코드 변경을 감지하여 자동 배포 시작
  3. Docker 컨테이너 빌드: 소스 코드를 Docker 이미지로 변환
  4. 이미지 업로드: Docker Hub 또는 AWS ECR에 이미지 저장
  5. EC2 서버에 배포: EC2 인스턴스에서 최신 컨테이너 실행
  6. 헬스 체크 및 운영: API 상태 점검 후 정상적으로 서비스 실행

1. AWS EC2 인스턴스 설정

1️⃣ AWS 콘솔에서 EC2 인스턴스 생성

  • Ubuntu 기반 인스턴스 선택
  • SSH 키 설정 후 접속 (ssh -i my-key.pem ubuntu@ec2-ip-address)

2️⃣ 필요한 패키지 설치

sudo apt update
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker


2. Docker를 이용한 컨테이너

1️⃣ Dockerfile 작성

# Node.js 기반 Express 서버
FROM node:16
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

 

2️⃣ Docker 이미지 빌드

docker build -t my-rest-api .

 

3️⃣ 로컬에서 컨테이너 실행

docker run -d -p 3000:3000 my-rest-api

 

 


 

3. GitHub Actions을 활용한 CI/CD

GitHub Actions을 이용하면, 코드가 변경될 때 자동으로 빌드 → 테스트 → 배포를 수행할 수 있습니다.

GitHub Actions 워크플로우 파일 (.github/workflows/deploy.yml)

name: Deploy to AWS EC2

on:
  push:
    branches:
      - main  # main 브랜치에 push될 때 실행

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
    - name: 코드 체크아웃
      uses: actions/checkout@v2

    - name: Docker 빌드  푸시
      run: |
        docker build -t my-rest-api .
        docker tag my-rest-api <AWS_ECR_URL>/my-rest-api
        docker push <AWS_ECR_URL>/my-rest-api

    - name: EC2 배포 스크립트 실행
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.EC2_HOST }}
        username: ubuntu
        key: ${{ secrets.EC2_SSH_KEY }}
        script: |
          docker pull <AWS_ECR_URL>/my-rest-api
          docker stop my-rest-api || true
          docker rm my-rest-api || true
          docker run -d -p 3000:3000 <AWS_ECR_URL>/my-rest-api


4. EC2에서 최신 이미지 실행

배포가 완료되면 EC2 서버에서 실행 중인 컨테이너를 확인할 수 있습니다.

docker ps  # 실행 중인 컨테이너 확인


마무리

지금까지 REST API 개발, JWT 인증 과정, AWS EC2 + Docker + GitHub Actions 배포에 대해 알아보았습니다.

핵심 정리

REST API: 클라이언트와 서버 간 데이터를 주고받는 표준 방식

JWT 인증: API 요청 시 사용자 인증을 위한 토큰 방식

AWS 배포: GitHub Actions + Docker + EC2로 자동화된 배포 수행

이제 이 가이드를 활용하여 안정적이고 확장 가능한 API를 직접 구축해 보세요!

 

 

728x90
반응형
home
}