Chapter 4-8 HTTP 기본 인증 Basic Authentication, Flask-HTTPAuth

2025. 4. 22. 18:51·Flask

HTTP 기본 인증(Basic Authentication, Flask-HTTPAuth)

Flask-HTTPAuth란?

Flask에서 HTTP 기본 인증은 클라이언트가 요청을 보낼 때 HTTP 헤더에 사용자 이름과 비밀번호를 포함시켜 인증을 수행하는 방법입니다. Flask에서 기본 인증을 쉽게 구현하기 위해 Flask-HTTPAuth 라이브러리를 사용할 수 있습니다. 이 라이브러리는 인증 메커니즘을 간편하게 설정할 수 있도록 도와줍니다.

Flask-HTTPAuth 설치

Flask-HTTPAuth는 Flask 애플리케이션에서 HTTP 기본 인증을 쉽게 구현할 수 있게 도와주는 라이브러리입니다. 이를 설치하려면 아래 명령어를 사용합니다:

pip install Flask-HTTPAuth
  • Flask-HTTPAuth 공식 문서
  • Flask-HTTPAuth PyPI 페이지
  • Flask-HTTPAuth GitHub 저장소

Flask-HTTPAuth 인증 설정 방법

Flask에서 기본 인증을 설정하려면 HTTPBasicAuth 클래스를 사용하여 인증을 처리할 수 있습니다. 아래는 기본적인 설정 예시입니다.

app.py (Flask 애플리케이션)

from flask import Flask, jsonify, render_template
from flask_httpauth import HTTPBasicAuth

app = Flask(__name__)
auth = HTTPBasicAuth()

# 사용자 정보
users = {
    "admin": "secret",  # 사용자명: 비밀번호
    "guest": "guest"
}

# 인증 함수 정의
@auth.verify_password
def verify_password(username, password):
    if username in users and users[username] == password:
        return username  # 인증 성공 시 사용자명 반환

# 인증된 사용자만 접근 가능한 페이지
@app.route('/protected')
@auth.login_required  # 로그인된 사용자만 접근 가능
def protected():
    return render_template('secret.html')  # 보호된 콘텐츠를 렌더링

# 기본 홈 페이지
@app.route('/')
def index():
    return render_template('index.html')  # 홈 페이지

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

verify_password 함수 설명

  • @auth.verify_password 데코레이터는 사용자 이름과 비밀번호가 올바른지 확인하는 함수입니다.
  • 사용자가 보내는 **username**과 **password**를 확인하고, 유효하면 해당 사용자 이름을 반환합니다.
  • 실제 서비스에서는 보통 데이터베이스에서 사용자 정보를 가져오거나, OAuth와 같은 더 안전한 방법을 사용합니다.

보호된 페이지에 대한 접근

@auth.login_required 데코레이터는 해당 라우트에 접근할 수 있는 사용자가 인증된 사용자만을 허용하도록 합니다. 인증되지 않은 사용자가 해당 페이지에 접근하면 자동으로 인증을 요청하게 됩니다.

index.html (홈 페이지)

<!DOCTYPE html>
<html>
<head>
    <title>Home Page</title>
</head>
<body>
    <h1>Welcome to the Home Page</h1>
    <a href="/protected">Go to Protected Resource</a>
</body>
</html>
  • 홈 페이지에서 "Go to Protected Resource" 링크를 클릭하면, 보호된 리소스(protected)로 이동하게 됩니다. 이 페이지는 인증이 되어 있어야만 접근할 수 있습니다.

secret.html (보호된 페이지)

<!DOCTYPE html>
<html>
<head>
    <title>Secret Page</title>
</head>
<body>
    <h1>Secret Page</h1>
    <p>Welcome to the secret page!</p>
    <a href="/">Home</a>
    <a href="/logout">Logout</a>
</body>
</html>
  • 보호된 페이지에서는 비밀 정보를 제공하거나 인증된 사용자만 접근할 수 있는 콘텐츠를 표시합니다.

인증 실패 시 처리 방법

**@auth.error_handler**를 사용하여 인증 실패 시의 오류 처리 방법을 정의할 수 있습니다. 인증 실패 시, 기본적으로 401 Unauthorized 응답을 반환할 수 있으며, 필요에 따라 추가적인 메시지를 제공할 수 있습니다.

@auth.error_handler
def unauthorized():
    return jsonify({'message': 'Unauthorized access'}), 401

API 인증

기본 인증은 RESTful API나 다른 HTTP 기반 API에서 클라이언트의 요청을 인증하는 데 사용됩니다. 클라이언트는 HTTP 헤더에 인증 정보를 포함시켜 요청을 보내고, 서버는 이를 검증하여 적절한 응답을 반환합니다.

기본 인증을 API에서 사용할 때는 일반적으로 Authorization 헤더를 사용하여 인증 정보를 전달합니다. 예를 들어, 다음과 같은 형식으로 인증 정보를 보내게 됩니다:

Authorization: Basic <base64-encoded-username:password>

Flask 기본 인증을 활용한 실습

이제 Flask 기본 인증을 활용한 API 예제를 살펴보겠습니다.

Flask API 인증 예시

from flask import Flask, jsonify
from flask_httpauth import HTTPBasicAuth

app = Flask(__name__)
auth = HTTPBasicAuth()

# 사용자 데이터 (실제 서비스에서는 데이터베이스 사용)
users = {
    "admin": "secret",
    "guest": "guest"
}

# 인증 함수
@auth.verify_password
def verify_password(username, password):
    if username in users and users[username] == password:
        return username

@app.route('/api/data')
@auth.login_required  # 인증된 사용자만 접근 가능
def get_data():
    return jsonify({"message": "This is a protected resource."})

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

Flask API 인증 흐름

  1. 사용자가 GET /api/data 요청을 보내면, 서버는 Authorization 헤더에 포함된 사용자 이름과 비밀번호를 verify_password 함수로 검증합니다.
  2. 인증이 성공하면 보호된 리소스에 대한 응답을 반환하고, 실패하면 401 Unauthorized 응답을 반환합니다.

보안 강화를 위한 권장 사항

  • HTTPS 사용: 기본 인증 방식은 암호화되지 않은 채로 사용자 정보가 전송되므로, 반드시 HTTPS를 사용해야 합니다.
  • OAuth나 JWT 사용: 프로덕션 환경에서는 더 안전한 인증 방식인 OAuth 또는 **JWT (JSON Web Tokens)**을 사용하는 것이 권장됩니다. 기본 인증은 간단하지만, 보안상 취약점이 있을 수 있습니다.

결론

Flask에서 기본 인증(Basic Authentication)은 간단한 웹 애플리케이션에서 사용자 인증을 구현하는 유용한 방법입니다. Flask-HTTPAuth 라이브러리를 사용하면 인증 기능을 간편하게 추가할 수 있으며, RESTful API나 웹 애플리케이션에서 사용자 인증을 효과적으로 처리할 수 있습니다. 하지만 실제 프로덕션 환경에서는 더 강력한 인증 방법을 사용하는 것이 좋습니다.

'Flask' 카테고리의 다른 글

Chapter 4-8(1) Flask 애플리케이션에서 HTTP 기본 인증 사용  (0) 2025.04.22
Chapter 4-7(1) 로그인, 세션 관리 및 보안 페이지 Authentication/ Session  (0) 2025.04.22
Chapter 4-7 Flask Authentication/ Session 인증 방식  (0) 2025.04.22
Chapter 4-6 실습_블로그 구현 (Flask-MySQL를 활용) posts_routes.py  (0) 2025.04.22
Chapter 4-4 실습_블로그 구현 (Flask-MySQL를 활용) MySQL 쿼리, db.yaml  (0) 2025.04.22
'Flask' 카테고리의 다른 글
  • Chapter 4-8(1) Flask 애플리케이션에서 HTTP 기본 인증 사용
  • Chapter 4-7(1) 로그인, 세션 관리 및 보안 페이지 Authentication/ Session
  • Chapter 4-7 Flask Authentication/ Session 인증 방식
  • Chapter 4-6 실습_블로그 구현 (Flask-MySQL를 활용) posts_routes.py
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (472) N
      • Python (31)
      • 프로젝트 (43)
      • 과제 (21)
      • Database (40)
      • 멘토링 (7) N
      • 특강 (18)
      • 기술블로그 (126) N
      • AI 분석 (4)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (34) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
Chapter 4-8 HTTP 기본 인증 Basic Authentication, Flask-HTTPAuth
상단으로

티스토리툴바