최신 웹 애플리케이션의 취약점인 깨진 인증의 지속성은 여전히 중요한 우려 사항으로 남아 있으며, 이는 OWASP가 선정한 상위 10대 API 보안 위험 중 하나로 꼽히고 있습니다.

이러한 취약성의 영향은 매우 심각합니다. 기밀 정보의 불법적인 취득과 시스템 신뢰성 저하로 이어질 수 있습니다. 애플리케이션과 자산에 안전하게 액세스할 수 있는 수단을 구축하기 위해서는 강력한 인증 프로토콜을 사용하는 것이 필수적입니다.

널리 사용되고 있는 효율적인 토큰 기반 접근 방식인 JSON 웹 토큰(JWT)을 활용하여 사용자 인증을 Flask 애플리케이션에 통합할 수 있는 방법을 살펴보세요.

JSON 웹 토큰을 사용한 토큰 기반 인증

토큰 기반 인증은 토큰이라고 하는 인코딩된 기호 시퀀스를 사용하여 플랫폼 또는 리소스에 액세스하기 위한 권한을 확인하고 부여합니다. 이러한 유형의 인증은 세션 토큰, API 키 및 JSON 웹 토큰과 같은 여러 기술을 통해 실행될 수 있습니다.

JWT는 클라이언트 측 애플리케이션에서 서버로 사용자 인증 정보를 전송하는 효율적이고 안전한 수단을 제공합니다.

헤더, 페이로드, 서명으로 구성됩니다. 헤더에는 토큰 인코딩에 사용된 암호화 방법과 같은 토큰에 관한 메타데이터가 포함됩니다.

페이로드에는 식별자 및 권한 부여 수준을 포함한 실제 사용자 자격 증명이 포함됩니다. 궁극적으로 서명은 기밀 키를 사용하여 토큰의 무결성을 인증합니다.

JWT(JSON 웹 토큰)를 활용하면 사용자를 인증할 수 있을 뿐만 아니라

플라스크 프로젝트 및 몽고DB 데이터베이스 설정

작업을 시작하려면 명령줄 인터페이스를 사용하여 프로젝트의 새 디렉터리를 설정해야 합니다:

 mkdir flask-project
cd flask-project

Flask 애플리케이션 개발을 목적으로 로컬 가상 환경을 설정하기 위해 virtualenv를 설치하세요.

 virtualenv venv 

마지막으로 가상 환경을 시작해야 합니다.

 # Unix or MacOS: 
source venv/bin/activate

# Windows:
.\venv\Scripts\activate

이 프로젝트의 소스 코드는 관심 있는 사람이 액세스할 수 있는 GitHub 리포지토리에 호스팅되어 있습니다.

필수 패키지 설치

프로젝트 폴더의 루트 디렉터리에 ‘requirements.txt’ 파일을 생성하는 과정에는 프로젝트를 성공적으로 실행하는 데 필요한 모든 필수 소프트웨어 패키지가 나열된 텍스트 문서가 포함됩니다. 이러한 종속성은 프로젝트의 원활한 작동을 보장하는 데 필수적이며 프로젝트를 실행하기 전에 반드시 설치해야 합니다.따라서 실행 중 문제가 발생하지 않도록 ‘요구사항.txt’ 파일에 나열된 각 종속성을 신중하게 고려하고 그에 따라 설치하는 것이 좋습니다.

 flask
pyjwt
python-dotenv
pymongo
bcrypt

궁극적으로 이러한 패키지의 설치 프로세스를 실행하려면 지정된 명령을 실행하여 제공된 지침을 따르십시오. 컴퓨터 운영 체제에 pip(패키지 관리자)가 사전 설치되어 있어야 합니다. 그렇지 않은 경우 Windows, Mac 또는 Linux 장치에 설치를 진행하시기 바랍니다.

 pip install -r requirements.txt 

몽고DB 데이터베이스 생성

몽고DB 데이터베이스를 생성하세요. 로컬 MongoDB 데이터베이스를 구성하거나 클라우드 기반 MongoDB 플랫폼인 MongoDB Atlas를 통해 클러스터를 구현할 수 있습니다.

이 글도 확인해 보세요:  개발자와 디자이너를 위한 10가지 UI/UX 영감 사이트

데이터베이스의 환경 변수를 구성하는 과정에는 여러 단계가 포함됩니다. 먼저 데이터베이스를 생성한 후 연결 URI를 가져와야 합니다. 그런 다음 프로젝트의 루트 디렉터리에 .env 파일을 생성하고 해당 URI를 적절한 형식으로 추가해야 합니다.

 MONGO_URI="<insert-connection-uri>" 

프로젝트의 루트 디렉터리에 다음 코드를 포함하는 새 `utils/db.py` 파일을 생성하여 Flask 애플리케이션 내에서 데이터베이스 연결을 설정하는 것으로 마무리합니다:

 from pymongo import MongoClient

def connect_to_mongodb(mongo_uri):
    client = MongoClient(mongo_uri)
    db = client.get_database("users")
    return db

주어진 함수는 지정된 연결 URI를 사용하여 MongoDB 데이터베이스와의 연결을 쉽게 설정할 수 있도록 합니다. 해당 컬렉션이 아직 존재하지 않으면 새 “사용자” 컬렉션으로 생성된 후 해당 데이터베이스 인스턴스가 반환됩니다.

Flask 웹 서버 생성

 from flask import Flask
from routes.user_auth import register_routes
from utils.db import connect_to_mongodb
import os
from dotenv import load_dotenv

app = Flask(__name__)
load_dotenv()

mongo_uri = os.getenv('MONGO_URI')
db = connect_to_mongodb(mongo_uri)

register_routes(app, db)

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

인증 API 엔드포인트 생성

Flask 애플리케이션의 보안을 보장하기 위해서는 인증 관련 작업을 관리할 적절한 API 엔드포인트를 설정하고 설계하는 것이 필수적입니다.

사용자 데이터에 대한 모델을 정의하는 과정에는 프로젝트의 루트 디렉터리 내에 “user\_model.py”라는 새 파일을 생성한 후 특정 코드 세트를 추가하는 작업이 포함됩니다.

 from pymongo.collection import Collection
from bson.objectid import ObjectId

class User:
    def __init__(self, collection: Collection, username: str, password: str):
        self.collection = collection
        self.username = username
        self.password = password
    def save(self):
        user_data = {
            'username': self.username,
            'password': self.password
        }
        result = self.collection.insert_one(user_data)
        return str(result.inserted_id)

@staticmethod
    def find_by_id(collection: Collection, user_id: str):
        return collection.find_one({'_id': ObjectId(user_id)})

@staticmethod
    def find_by_username(collection: Collection, username: str):
        return collection.find_one({'username': username})

앞서 언급한 코드는 데이터 표현의 원형으로 작동하는 “사용자” 클래스라는 분류를 설정하고, 사용자와 관련된 작업을 실행하기 위해 MongoDB 컴파일에 쉽게 개입할 수 있도록 여러 절차적 지침을 포함합니다.

“저장” 기능은 사용자 이름과 비밀 구문을 통해 지정된 개인의 시작되지 않은 기록을 MongoDB 축적에 고정적으로 보존하고, 저장된 아티팩트의 식별자를 검색합니다.

이 글도 확인해 보세요:  녹 매크로: 매크로를 사용하여 코드를 개선하는 방법

앞서 언급한 기법은 각 사용자에게 할당된 식별자 또는 고유 로그인 자격 증명을 활용하여 포괄적인 데이터베이스에서 사용자와 관련된 데이터를 추출하도록 설계되어 관련 정보를 효율적으로 검색할 수 있습니다.

인증 경로 정의

초기 단계에는 등록 경로를 정의하는 작업이 포함됩니다. 이 경로는 새로운 사용자 정보를 MongoDB 사용자 개요에 통합합니다. 프로젝트의 루트 폴더에서 새 경로/사용자\_auth.py 문서를 찾은 다음 그 안에 후속 코드를 삽입합니다.

로그인 페이지에 액세스하면 시스템은 제공된 자격 증명을 확인하여 사용자를 인증하는 프로세스를 수행합니다. 인증에 성공하면 사용자에 대한 고유한 JWT(JSON 웹 토큰)가 생성되며, 이는 성공적인 로그인을 나타내는 JSON 페이로드와 함께 쿠키로 저장됩니다. 반대로 자격 증명이 유효하지 않은 것으로 판명되면 시스템은 이를 나타내는 JSON 응답으로 응답합니다.

데코레이터 함수가 구현되어 향후 API 요청과 함께 제시된 JSON 웹 토큰(JWT)의 유효성을 검사합니다. 앞서 언급한 코드 블록은 register\_routes 함수 내에 통합될 예정입니다. 이 데코레이터 함수는 토큰의 부재, 만료 또는 진위 여부를 검사하여 후속 API 요청에서 합법적인 JWT 토큰의 존재를 확인합니다. 토큰이 이러한 테스트 중 하나라도 실패하면 적절한 JSON 응답이 반환됩니다.

마지막으로 보안 경로를 설정합니다.

이 엔드포인트의 기능은 데이터베이스에서 사용자 정보를 가져오는 것이지만, 해당 정보에 액세스하려면 클라이언트의 요청에 합법적인 토큰이 첨부되어야 합니다.

마지막으로 제공된 명령을 실행하여 개발 서버를 시작합니다.

 flask run 

권한 있는 사용자의 등록, 인증 및 액세스 제어를 검증하려면 Postman 또는 다른 API(애플리케이션 프로그래밍 인터페이스) 클라이언트와 같은 도구를 활용합니다. 이 방법을 통해 ” < route<"로 요청을 보내면 수신된 응답을 검사하여 이러한 특정 API 엔드포인트의 기능을 평가할 수 있습니다.

토큰 인증은 완벽한 보안 수단인가요?

JSON 웹 토큰은 웹 애플리케이션을 위한 안전한 사용자 인증 수단을 제공하지만, 무단 액세스에 대한 절대적인 보호 기능을 제공하지는 않는다는 점을 인식해야 합니다. 오히려 포괄적인 보안 전략 내에서 필수적인 구성 요소로 사용됩니다.

이 글도 확인해 보세요:  VPN 제공 업체가 말하는 '군사급 암호화'란 무엇인가요?

토큰 기반 인증과 다른 검증된 보안 수단을 함께 활용하는 것은 Flask 애플리케이션을 보호하는 데 매우 중요합니다.이러한 시스템을 주의 깊게 감시하고 건전한 보안 프로토콜을 지속적으로 구현하여 시스템을 보호하는 것이 필수적입니다.

By 이지원

상상력이 풍부한 웹 디자이너이자 안드로이드 앱 마니아인 이지원님은 예술적 감각과 기술적 노하우가 독특하게 조화를 이루고 있습니다. 모바일 기술의 방대한 잠재력을 끊임없이 탐구하고, 최적화된 사용자 중심 경험을 제공하기 위해 최선을 다하고 있습니다. 창의적인 비전과 뛰어난 디자인 역량을 바탕으로 All Things N의 잠재 독자가 공감할 수 있는 매력적인 콘텐츠를 제작합니다.