백엔드 개발에서 REST API 인증은 매우 중요한 요소 중 하나입니다. 보안이 중요한 현대 웹 애플리케이션에서 사용자의 정보를 안전하게 보호하기 위해 인증 방식을 적절히 구현하는 것은 필수적입니다. 이 글에서는 Python을 이용한 간단한 REST API 인증 구현 미니 프로젝트를 통해 REST API의 기본적인 인증 방식을 살펴보도록 하겠습니다.

프로젝트 환경 설정

이번 프로젝트에서는 Flask 프레임워크를 사용하여 REST API를 구축할 것입니다. Flask는 경량화된 웹 프레임워크로, RESTful API를 쉽게 만들 수 있도록 도와줍니다. 먼저, Flask와 필요한 패키지를 설치합니다.

pip install Flask Flask-JWT-Extended
Flask-JWT-Extended는 JSON Web Token(JWT)을 쉽게 사용할 수 있도록 지원하는 라이브러리입니다.

기본 구조 설정

프로젝트의 기본 구조를 설정합니다. 다음과 같은 폴더와 파일을 생성합니다.

/my_flask_app
    ├── app.py

이제 app.py 파일을 열고 Flask 애플리케이션을 설정해 보겠습니다.

from flask import Flask, jsonify, request
from flask_jwt_extended import JWTManager, create_access_token, jwt_required

app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'your_jwt_secret_key'  # JWT 암호화 키 설정
jwt = JWTManager(app)

users = {}

@app.route('/register', methods=['POST'])
def register():
    username = request.json.get('username')
    password = request.json.get('password')
    
    if username in users:
        return jsonify({"msg": "User already exists!"}), 400
    
    users[username] = password
    return jsonify({"msg": "User created!"}), 201

@app.route('/login', methods=['POST'])
def login():
    username = request.json.get('username')
    password = request.json.get('password')
    
    if username not in users or users[username] != password:
        return jsonify({"msg": "Bad username or password"}), 401
    
    access_token = create_access_token(identity=username)
    return jsonify(access_token=access_token), 200

@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():
    return jsonify(msg="This is a protected route"), 200

if __name__ == '__main__':
    app.run(debug=True)

코드 설명

  1. 사용자 등록 (/register): 사용자가 username과 password를 JSON 형태로 POST 요청을 통해 등록할 수 있습니다. 이미 존재하는 username일 경우 400 에러를 반환합니다.
  2. 로그인 (/login): 사용자가 로그인하면, 입력한 username과 password가 맞는지 확인합니다. 인증에 성공하면 JWT를 생성하여 반환합니다.
  3. 보호된 경로 (/protected): @jwt_required() 데코레이터를 사용하여 이 경로에 접근하기 위해서는 JWT 인증이 필요합니다.
  4. 테스트용 Postman 사용

    위의 API를 테스트하기 위해 Postman을 사용할 수 있습니다. 각 엔드포인트에 대해 테스트 요청을 보내보세요.

  5. 회원가입: POST http://localhost:5000/register에 JSON 형태로 {"username": "testuser", "password": "testpass"}를 보내면 사용자 등록이 됩니다.
  6. 로그인: POST http://localhost:5000/login에 동일한 JSON을 보내면 JWT를 포함한 응답을 받을 수 있습니다.
  7. 보호된 경로 접근: GET http://localhost:5000/protected에 Authorization 헤더에 Bearer <JWT>를 포함하여 요청하면 보호된 리소스에 접근할 수 있습니다.

마무리

이번 포스팅을 통해 Python의 Flask를 이용한 간단한 REST API 인증 시스템을 구현해보았습니다. JWT를 사용하여 사용자 인증을 처리함으로써 보안성을 높이고, 간편한 API 설계를 통해 사용자 경험을 개선할 수 있습니다. 향후 이 시스템을 확장하여 사용자 권한 관리, 비밀번호 해싱, 데이터베이스 연동 등을 추가하면 더욱 완성도 높은 프로젝트로 발전시킬 수 있습니다. 백엔드 개발의 기초부터 차근차근 다뤄보시는 것도 좋은 방법입니다.