반응형

이번 포스트는 Django Tutoral을 기초로 해서 작성했습니다.

Writing your first Django app, part 1 | Django documentation | Django (djangoproject.com)

 

이전 포스트에서는 Django 프로젝트를 생성했었는데, 이어서 튜토리얼에 있는 설문조사 프로젝트를 진행해 보겠습니다.

 

0. 준비

기존에 생성한 프로젝트 폴더는 대략 다음과 같은 구조로 되어 있을 겁니다. (django-admin 으로 프로젝트를 생성하면 자동으로 생성이 됩니다.)

mysite/
    manage.py
    config/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

 

- 먼저 mysite 폴더는 프로젝트 루트입니다. Django 에서는 이 폴더의 이름은 중요하지 않습니다.

- manage.py:  여러가지 방법으로 Django 프로젝트와 interact 하기 위해 필요한 커맨드라인 유틸리티입니다.

- config 폴더는 프로젝트를 위한 실제 Python 패키지들이 위치합니다.

- config/__init_.py: 비어 있는 파일이지만 Python 패키지임을 선언하기 위해 필요합니다.

- config/settings.py: Django 프로젝트를 위한 설정 파일입니다.

- config/urls.py: Django 프로젝트의 URL 정보입니다.

- config/asgi.py: ASGI를 지원하는 웹서버를 위한 entry-point 입니다.

- config/wsgi.py: WSGI를 지원하는 웹서버를 위한 entry-point 입니다.

 

 

 

1. 설문조사 앱 추가

Django 에서의 앱은 특정 작업을 수행하는 웹 애플리케이션을 의미합니다. 프로젝트는 특정 웹 사이트에 대한 구성 및 앱의 모음입니다. 따라서 하나의 프로젝트에는 여러 개의 앱이 포함될 수 있습니다. 

 

다음 명령어를 이용해서 Project에 "polls" 앱을 추가합니다.

 

(.venv) > python manage.py startapp polls

 

polls 앱이 추가되면, 아래와 같은 폴더가 생성됩니다. 

 

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

 

2. HelloWorld

설문조사를 더 진행하기 전에, 화면에 HelloWorld 를 출력해 보도록 하겠습니다.

 

먼저 polls 폴더내에 있는 views.py 파일을 열어서 아래와 같이 코드를 작성합니다.

 

polls/views.py

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.

def index(request):
    return HttpResponse("HelloWorld")

 

그리고 polls 폴더에 urls.py 파일을 생성해서 아래와 같이 코드를 작성합니다.

 

polls/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index')
]

 

마지막으로 config 폴더에 있는 urls.py 파일을 열어서 아래와 같이 코드를 입력합니다.

from django.contrib import admin
# django.urls의 include 모듈을 추가
from django.urls import include
from django.urls import path

urlpatterns = [
    # polls 를 경로에 추가
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

 

프로젝트를 다시 실행합니다.

 

이번에는 localhost:8000 으로 접속하면 아래와 같은 에러가 나오게 됩니다.

 

나중에 처리하기로 하고, localhost:8000/polls 로 접속합니다.

아래처럼 HelloWorld 가 화면에 나오면 정상입니다.

 

페이지가 호출되는 흐름을 설명하자면,

 

먼저 웹 요청이 오면, project 에 있는 config/urls.py 에서 urlpatterns 에 있는 리스트를 매치해 봅니다.

매칭 결과 "polls/"가 매치되므로, url은 polls.urls 에 있는 urlpatterns 를 찾아보게 됩니다.

 

다음으로 polls/urls.py 에 있는 urlpatterns에서 매치되는 path를 살펴보고,

매치되는 함수를 실행합니다. (여기서는 views.index)

 

polls/views.py 에 있는 index 함수에서 요청을 처리하고, HttpResponse 로 "HelloWorld" 를 리턴하게 됩니다.

 

 

반응형

'프로그래밍 > Python - Django' 카테고리의 다른 글

Django Query Tips - User, Group, Permission  (0) 2024.03.02
Django 프로젝트 배포하기  (0) 2024.02.29
Django - Proxy Models  (0) 2023.02.23
Django - 프로젝트 시작하기  (0) 2022.10.28
Django - 기본 설정  (0) 2022.10.14
반응형

이 포스트는 Django 에 대한 포스트로, 박응용님의 점프 투 장고를 많이 참조했습니다.

기초부터 차근차근 공부하시고 싶으신 분은 점프 투 장고를 읽어 보시기를 권장합니다.

 

https://wikidocs.net/book/4223

 

점프 투 장고

**점프 투 장고 오프라인 책 출간 !! (2020.12)** * [책 구입 안내](https://wikidocs.net/105844) 점프 투 장고는 파이 ...

wikidocs.net

 

 

Django 프로젝트 시작하기

Django 프로젝트를 시작하기 위해서는 다음의 순서대로 진행하면 됩니다.

1. 프로젝트 폴더 생성

2. 가상환경 생성 및 실행

3. 가상환경 내에서 Django 모듈 설치

4. Django admin 명령어로 프로젝트 생성

5. Django 서버 실행

 

1. 프로젝트 폴더 생성

프로젝트 폴더는 탐색기를 이용해도 되지만, 여기서는 커맨드 프롬프트를 이용해서 생성해 보겠습니다. 프로젝트는 C:\Projects\Django 아래 위치하며, 프로젝트 이름은 mysite 라고 가정하겠습니다.

> cd C:\Projects\Django
> mkdir mysite
> cd mysite

 

커맨드는 윈도우 기준으로 작성되었습니다. 첫째 줄은 C:\Projects\Django 디렉터리로 이동하라는 명령어 인데, 이전에 C:\Projects\Django 폴더가 생성되어 있어야 합니다. 그리고 두번째 줄은 프로젝트 폴더인 mysite 를 생성하는 명령어이고, 세번째 줄은 폴더 생성 후에 mysite 디렉터리로 이동하라는 의미 입니다. 이후 작업은 모두 C:\Projects\Django\mysite 에서 이루어지기 때문에 미리 이동해 두었습니다.

 

2. 가상환경 생성 및 실행

이전 포스트에서 가상환경에 대해서 설명을 했었는데, 가상환경은 프로젝트별로 Python 실행환경을 만들어서 가상환경 별로 모듈을 관리하기 위해서 사용합니다. C:\Projects\Django\mysite 에서 아래 명령을 실행합니다.

> python -m venv .venv
> cd .venv\Scripts
> activate
(.venv) > cd ..\..

 

역시 윈도우 기준으로 커맨드를 작성했습니다. 첫번째 줄에서는 .venv 라는 가상환경을 생성했고요, 두번째 줄에서는 가상환경을 실행하기 위해서 경로를 변경해 주었고, 세번째 줄에서는 가상환경을 실행하였습니다. 네번째 줄은 원래 프로젝트 루트로 돌아가기 위한 명령어 입니다.

 

맥이나 리눅스에서는 아래와 같이 입력하시면 됩니다. 

> python -m venv .venv
> source ./.venv/bin/activate

 

3. 가상환경 내에서 Django 모듈 설치

pip 명령어를 이용해서 Django 모듈을 설치합니다.

(.venv) > pip install django==4.1.2

 

pip 버전을 업그레이드 하라는 경고 메시지가 나온다면 아래 명령어로 업그레이드를 진행합니다.

(.venv) > python -m pip install --upgrade pip

 

4. Django admin 명령어로 프로젝트 생성

django-admin 명령어로 Django 프로젝트에 필요한 기본 설정들을 생성합니다.

(.venv) > django-admin startproject config .

 

django-admin 명령어의 첫번째 파라미터인 startproject 는 말 그대로 프로젝트를 시작하기 위한 기본 파일들을 생성하기 위해 사용합니다. 두번째 파라미터인 config 는 django 프로젝트의 설정파일들을 config 폴더에 생성하겠다는 의미이고, 마지막 파라미터인 "." 은 현재 경로에 생성을 하겠다는 의미 입니다. 

명령어를 실행하고 나면, 프로젝트 루트 경로에는 manage.py 파일과 config 폴더가 생성됩니다. config 폴더에는 기본 설정 및 운영 환경에서의 실행을 위한 기본 파일들이 생성됩니다.

 

5. Django 서버 실행

프로젝트가 생성되었다면, 아래 명령어를 입력해서 Django 서버를 실행합니다.

(.venv) > python manage.py runserver

 

명령어를 실행하고 나면, 마지막에 Starting development server at http://127.0.0.1:8000/ 같은 메시지가 출력되는데, 이것이 서버 접속 정보입니다. 브라우저를 열고 http://127.0.0.1:8000 을 입력하면 Django 에서 제공해주는 기본 화면이 아래와 같이 나오게 됩니다.

Django 는 포트 충돌이 없다면 기본적으로 8000 포트로 서비스를 시작합니다. 만약 8080 포트로 서비스를 하고자 한다면 다음과 같이 입력하면됩니다.

(.venv) > python manage.py runserver 8080

 

혹은 서버에서 여러 개의 네트워크 인터페이스를 사용하고 있어서 특정 아이피에 서비스를 바인드 하고 싶다면 아이피도 적어줍니다.

(.venv) > python manage.py runserver 0.0.0.0:8080

 

0.0.0.0 은 모든 네트워크 인터페이스에서의 요청을 바인드 할 때 사용합니다. 필요에 따라 바인드할 아이피를 세팅해 주면됩니다.

 

 

원래 이번 포스트에서 HelloWorld 를 구현하려고 했는데.. 다음 포스트에 작성해 보겠습니다.

반응형

'프로그래밍 > Python - Django' 카테고리의 다른 글

Django Query Tips - User, Group, Permission  (0) 2024.03.02
Django 프로젝트 배포하기  (0) 2024.02.29
Django - Proxy Models  (0) 2023.02.23
Django Tutorial Part 1 - HelloWorld  (0) 2022.11.01
Django - 기본 설정  (0) 2022.10.14
반응형

이 포스트는 Django 에 대한 포스트로, 박응용님의 점프 투 장고를 많이 참조했습니다.

기초부터 차근차근 공부하시고 싶으신 분은 점프 투 장고를 읽어 보시기를 권장합니다.

 

https://wikidocs.net/book/4223

 

점프 투 장고

**점프 투 장고 오프라인 책 출간 !! (2020.12)** * [책 구입 안내](https://wikidocs.net/105844) 점프 투 장고는 파이 ...

wikidocs.net

 

 

Django의 정의

Django는 웹 프로그램을 쉽고 빠르게 만들어 주는 웹 프레임워크입니다.

 

웹 프레임워크란

웹 프레임워크는 웹 프로그램을 만들기 위한 스타터 키트 같은 것으로, 웹 프로그램에 필요한 많은 기능들(쿠키나 세션 처리, 로그인/로그아웃 처리, 권한 관리, 데이터 베이스 연결 등)을 포함시켜서 바로 사용할 수 있게 만들어진 프레임워크 입니다.

 

Django 설치하기 1 - Python 설치

Django 를 이용해서 웹 개발을 위해서는 Python 이 필요합니다. Python 홈페이지에서 사용하는 컴퓨터의 OS에 맞게 설치를 합니다. 버전은 3.8 이후를 사용하는 것을 권장하는데, 2022년 10월 기준으로 3.10.4 버전을 설치하면 됩니다. 이미 Python 3.8 이후 버전이 설치되어 있다면 이 과정은 건너 뛰어도 됩니다.

 

https://www.python.org 

 

Welcome to Python.org

The official home of the Python Programming Language

www.python.org

 

설치가 끝나면, 명령 프롬프트 (커맨드 창) 등에서 아래 명령어를 이용해서 설치된 버전을 확인할 수 있습니다. (V는 대문자 입니다.)

> python -V

 

Django 설치하기 2 - Python 가상환경 설정

Python의 가상환경은 Python 프로젝트를 진행할 때, 각각의 프로젝트에 독립된 환경을 만들어 주기 위해서 사용합니다. 예를 들어서 Python 프로젝트를 여러개 관리 중인데, 각 프로젝트가 필요로 하는 모듈 및 모듈의 버전이 다르다면, 가상환경을 이용해서 각 프로젝트에 필요한 모듈을 각각 설치해서 사용할 수 있습니다. 

 

가상환경은 아래 명령어로 생성할 수 있습니다.

> python -m venv <name>

 

원하는 위치에 가상환경을 세팅할 수 있지만, 각 프로젝트 폴더에 .venv 라는 이름으로 생성하도록 하겠습니다. 가상환경에 설치되는 모듈은 pip 명령어를 이용해서 다시 설치가 가능하기 때문에 소스 관리 툴(git 등)에서 해당 폴더를 ignore list에 추가하도록 합니다.

 

다음은 가상환경을 시작하는 방법입니다. 시작은 가상환경을 설치한 프로젝트 루트에서 아래 처럼 명령어를 입력해 주면 됩니다.

> cd .venv\Scripts
> activate
(.venv) > cd ..\..

 

위의 명령어는 윈도우 기준으로 작성되었습니다. 첫번째 라인은 script 경로로 변경해 주는 것이고, 두번째 라인은 activate.bat 파일을 실행하여 가상환경을 시작하는 것이고, 마지막 라인은 다시 프로젝트 루트 폴더로 돌아오게 하는 것입니다. 세번째 라인은 명령 프롬프트 앞에 (.venv) 가 보이는데, 이것은 .venv 라는 가상환경이 실행 중임을 표시해 주는 것입니다.

참고로 맥이나 리눅스에서는 아래 명령어를 이용하면 됩니다. 

> source ./.venv/bin/activate

 

가상환경을 종료하기 위해서는 아래 명령어를 입력합니다.

(.venv) > deactivate

 

Django 설치하기 3 - Django 모듈 설치하기

지금까지는 Python 과 Python 가상환경 설치에 대해서 살펴 봤는데요, 이제는 Django를 구동하기 위한 Django 모듈을 설치합니다.

설치는 pip 명령어를 이용하게 됩니다.

 

가상환경이 실행된 상태인지 확인합니다. 명령 프롬프트 앞에 (.venv) 이 표시되고 있는지 확인하시고, 없다면 바로 앞에서 설명드린 명령어로 가상환경을 시작합니다.

 

그리고 아래 명령을 이용해서 Django 모듈을 설치합니다. 이 글을 작성하는 시점에서는 4.1.2 버전이 최신입니다.

(.venv) > pip install django==4.1.2

 

새로 생성된 가상환경에서 pip 를 처음 실행하거나 새로운 pip 버전이 출시 되었을 때 실행하면, pip 버전을 업그레이드하라는 경고 메시지가 나옵니다. 아래 명령어를 입력하면 pip 버전을 업그레이드 할 수 있습니다.

(.venv) > python -m pip install --upgrade pip

 

자 이제 Django 를 시작할 준비작업은 모두 마친 것 같습니다.

다음 포스트에서는 HelloWorld 프로젝트를 시작해 보겠습니다.

반응형
반응형

이번 시간에는 node.js 를 이용해서 min.io 스토리지에 접근해서 파일을 읽고, 쓰는 예제 코드를 작성해 보겠습니다.

 

이번 포스트는 작성시 아래 url 을 참고하였습니다.

https://northflank.com/guides/connecting-to-a-minio-database-using-node-js

 

Connecting to a MinIO database using Node.js — Northflank

MinIO is a highly-available, S3 compatible object storage solution. Through this guide you will learn how to connect a MinIO instance to your Node.js project.

northflank.com

 

먼저 node.js 를 설치해야 합니다. 설치가 필요하신 분들은 아래 사이트를 참고하셔서 설치하시기 바랍니다.

https://nodejs.org/

 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

다음으로는 node.js 프로젝트를 생성합니다.

 

폴더하나 생성하고, 폴더로 가서 아래와 같이 입력합니다.

> npm init

 

몇 가지 물어보는 것에 성실히 답을 하면 프로젝트가 생성됩니다. 그리고나서 아래 명령어들을 차례로 입력해서, 필요한 모듈을 설치합니다.

> npm install
> npm install minio

 

minio 모듈은 minio 서버에 접속해서 필요한 기능을 수행할 수 있게 해주는 모듈입니다.

 

 

min.io 서버에 접속하기 위해서는 서버의 host, port 와 함께, access key, secret key 정보가 필요합니다.

 

min.io 에서 javascript Client API 및 예제를 제공하고 있으므로, 아래 링크 참조하세요.

https://docs.min.io/docs/javascript-client-api-reference.html

 

MinIO | JavaScript Client API Reference

JavaScript Client API Reference Initialize MinIO Client object. MinIO var Minio = require('minio') var minioClient = new Minio.Client({ endPoint: 'play.min.io', port: 9000, useSSL: true, accessKey: 'Q3AM3UQ867SPQQA43P2F', secretKey: 'zuf+tfteSlswRu7BJ86wek

docs.min.io

 

min.io 서버에 접속하기 위한 코드는 다음과 같습니다. 여기서 필요한 세팅 정보를 변경해 줘야 합니다.

var Minio = require('minio')

var minioClient = new Minio.Client({
    endPoint: 'play.min.io',
    port: 9000,
    useSSL: true,
    accessKey: 'Q3AM3UQ867SPQQA43P2F',
    secretKey: 'zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG'
});

 

먼저 endPoint 는 min.io 서버의 IP 주소를 입력하면 됩니다. 

port는 min.io 서비스의 port를 적어주면 됩니다. 서비스 default 값은 9000 입니다.

useSSL은 실제 서비스에서는 true 로 해줘야겠지만,  SSL 설정이 되어 있지 않은 테스트 환경에서는 false 로 지정합니다.

나머지 access key 와 secret key 는 min.io 콘솔에서 생성합니다.

 

콘솔에 로그인한 후에, 오른쪽 메뉴에서 Identity 를 선택하고, Service Accounts 를 선택합니다.

 

화면 오른쪽 상단에 있는 Create service account 버튼을 클릭합니다. 아래와 같이 Access Key와 Secret Key가 생성됩니다. 

 

Create 버튼을 눌러서 생성하면, 아래처럼 Access Key와 Secret Key가 공개되는데, Secret Key는 여기서만 보여주고, 다시 확인이 불가능하니, Download for import 버튼을 눌러서 백업해 두는 것이 좋습니다.

 

Access Key와 Secret Key 가 생성되고 나면, 연결 설정 정보들을 변경해줍니다.

 

그리고 아래와 같이 코드를 작성해서, "test-bucket" 을 생성하고, bucket 리스트를 받아와서 console에 출력해 봅니다.

const bucketName = "test-bucket";

(async () => {
  console.log(`Creating Bucket: ${bucketName}`);
  await minioClient.makeBucket(bucketName, "hello-there").catch((e) => {
    console.log(
      `Error while creating bucket '${bucketName}': ${e.message}`
     );
  });

  console.log(`Listing all buckets...`);
  const bucketsList = await minioClient.listBuckets();
  console.log(
    `Buckets List: ${bucketsList.map((bucket) => bucket.name).join(",\t")}`
  );
})();

 

다음 코드는 문자열을 텍스트 (파일) 오브젝트를 생성해서 스토리지에 저장하는 예제입니다.

(async () => {
  // create object with string data
  const objectName = "file.txt";
  const result = await minioClient
    .putObject(bucketName, objectName, "Hello There!")
    .catch((e) => {
      console.log("Error while creating object: ", e);
      throw e;
    });

  console.log("Object uploaded successfully: ", result);
})();

 

다음 코드는 파일을 읽어서 스토리지에 저장하는 예제입니다.

const fs = require('fs');

(async () => {
  // create object from file data
  const objectFileName = "file-object.txt";
  const fileData = fs.readFileSync("./file.txt");
  const submitFileDataResult = await minioClient
    .putObject(bucketName, objectFileName, fileData)
    .catch((e) => {
      console.log("Error while creating object from file data: ", e);
      throw e;
    });

  console.log("File data submitted successfully: ", submitFileDataResult);
})();

 

마지막으로 스토리지에 저장되어 있는 오브젝트를 읽어와서 로컬 폴더에 저장하는 예제입니다.

const fs = require('fs');

(async () => {
  // read object in chunks and store it as a file
  const fileStream = fs.createWriteStream("./read-in-chunks.txt");
  const fileObjectKey = "file-object.txt";

  const object = await minioClient.getObject(bucketName, fileObjectKey);
  object.on("data", (chunk) => fileStream.write(chunk));

  object.on("end", () => console.log(`Reading ${fileObjectKey} finished`));
})();

지금까지 node.js 코드를 이용해서, min.io 스토리지에 bucket 을 생성하고, bucket 리스트를 받아오고, (파일) 오브젝트를 생성하고, 읽어오는 예제들을 살펴보았습니다. 

여기에 나온 예제들은 예외처리가 제대로 되어 있지 않아서, 실제 사용시에는 조금 더 주의를 기울여서 살펴봐야 합니다.

반응형
반응형

먼저 min.io 는 무엇인가? 그리고 어디에 쓰면 좋은가? 에 대해서 살펴보도록 하겠습니다.

 

https://min.io/

 

MinIO | High Performance, Kubernetes Native Object Storage

MinIO's High Performance Object Storage is Open Source, Amazon S3 compatible, Kubernetes Native and is designed for cloud native workloads like AI.

min.io

 

홈페이지에 따르면, min.io는 (aws) S3와 호환되는 고성능의 오브젝트 스토리지 라고 소개하고 있습니다. 즉, 스토리지 서비스를 구축하는데 사용할 수 있는 오픈 소스 솔루션 입니다. S3와 사용법이 거의 유사하게 되어 있어서, S3를 써 보셨던 분들은 매우 쉽게 사용이 가능하며, 스토리지를 처음 써보시는 분들은 약간의 적응이 필요합니다.

 

서비스를 시작하는 방법은 여러가지가 있지만, 저는 docker를 사용해서 서비스를 시작해 보겠습니다. (docker 설치 필요)

 

min.io 서비스를 시작하기 위해서는 docker를 사용하면 되는데, min.io 에서는 podman 커맨드를 제시하고 있어서 혼선을 주고 있습니다. podman 을 별도로 설치하기 귀찮아서 docker-compose.yml 파일을 아래와 같이 작성해 보았습니다.

 

version: '3'
services:
  s3:
    image: minio/minio
    ports:
      - 9000:9000
      - 9001:9001
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: changeme
    volumes:
      - ./storage/minio:/data
    command: server /data --console-address ":9001"

 

서비스 명은 편의상 s3로 하였습니다. 그리고, docker에서 사용할 image 를 지정해 주었고 (minio/minio), 서비스에서 사용될 포트를 매핑해 주었습니다. (9000, 9001)

환경변수로 user, password 를 지정해 주었으며, volume을 지정하여 재시작을 해도 기존에 저장했던 스토리지 정보가 남을 수 있게 해 주었습니다.

시작 커맨드는 버전에 따라 약간씩 상이하다고 하니, 추후에는 변경이 될 수도 있습니다.

 

커맨드 윈도우에서 아래 명령어를 이용해서 서비스를 시작합니다.

> docker-compose -f docker-compose.yml up -d

 

도커 컨테이너가 제대로 실행되어 돌아가면, 브라우저를 열어서 http://localhost:9000 으로 접속을 시도합니다.

요청은 http://localhost:9001로 redirect 되며, 아래와 같은 admin 페이지 로그인 창이 뜹니다.

위의 docker-compose.yml 파일에 설정했던, username, password 를 이용해서 로그인을 합니다.

 

로그인을 하면, 아래와 같은 화면이 나옵니다.

 

위의 화면에서 우측 상단의 Create Bucket 버튼을 클릭해서 Bucket을 생성해 봅니다.

Bucket Name 에 'test'를 입력하고, Create Bucket 버튼을 클릭하여 bucket을 생성합니다. 제대로 생성되면 아래와 같은 화면이 나오게 됩니다.

 

생성된 bucket 에 파일을 드래그해서 업로드 해 봅니다. 아래와 같은 화면이 나오면서 파일이 올라간 것이 화면에 표시됩니다. 업로드 버튼을 클릭해서 폴더도 생성할 수 있고, 파일을 업로드 할 수도 있습니다.

 

업로드 된 파일을 클릭해보면, 화면 우측에 파일을 다운로드, 공유, 삭제하거나 정보를 확인 할 수 있는 창이 나타납니다.

 

Share 아이템을 클릭하면 아래와 같이 특정 기간 동안 유효한 URL을 생성하여 파일을 공유할 수 있습니다.

 

이번 시간에는 docker를 이용해서 min.io 서비스를 설치하고, bucket을 생성하고, 간단하게 파일 업로드 및 공유 기능에 대해서 살펴 보았습니다. 다음 시간에는 node.js를 이용해서 프로그래밍으로 bucket 을 관리하고, 파일 업로드 및 다운로드를 하는 예시를 살펴 보겠습니다.

반응형
반응형

지난 포스트에서는 https 를 적용하기 위해서, 실제 인증기관을 통해서 서명된 인증서를 사용하는 방법에 대해서 적어 보았습니다.

 

하지만, 테스트 용도의 서버나 개발 서버 등 외부로 노출되지 않는 서버까지 유료 인증서를 사용할 필요는 없습니다. 이런 경우 self signed certificate 을 이용해서 적용할 수 있습니다.

 

1. 이전과 마찬가지로 private key 파일과 인증 요청서 파일을 생성하는 것입니다. 이번에는 nodes 옵션을 추가해서 암호 설정이 되지 않은 key 파일을 생성하겠습니다.

openssl req -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr

 

2. 인증서를 생성합니다.

openssl x509 -signkey domain.key -in CSR.csr -req -days 10000 -out domain.crt

days 옵션에 숫자로 날짜를 입력할 수 있습니다. 해당 기간 동안 인증이 유효한 것인데, 테스트 용은 길게 적어 줘도 상관 없습니다.

 

3. key 파일과 인증서 (crt) 파일을 적당한 경로로 옮겨 둡니다.

 

4. nginx 설정에 다음 내역을 추가합니다.

server {
    listen 443 ssl;
    server_name your_domain.com;
    
    ssl_certificate '/etc/ssl/certs/domain.crt';
    ssl_certificate_key '/etc/ssl/certs/domain.key';
    
    ...
}

 

5. nginx 서버를 재시작 합니다.

 

 

위의 내용은 아래 사이트에서 참조하여 작성하였습니다.

https://www.baeldung.com/openssl-self-signed-cert#:~:text=A%20self%2Dsigned%20certificate%20is,the%20certificate%20isn't%20trusted

 

Creating a Self-Signed Certificate With OpenSSL | Baeldung

A quick and practical guide to creating self-signed certificates with OpenSSL.

www.baeldung.com

 

반응형

'프로그래밍' 카테고리의 다른 글

[docker] min.io 사용하기 - 활용편  (0) 2022.07.20
[docker] min.io 사용하기 - 기초편  (0) 2022.07.20
NGINX SSL 설정 (https) - part 1  (0) 2022.06.11
반응형

nginx 서버에 ssl을 설정하는 방법입니다.

 

ssl이란.. Secure Sockets Layer 의 약자로.. 쉽게 이야기해서 Security가 강화된 프로토콜입니다.

 

요즘 대부분의 웹사이트들은 https를 기본으로 적용하고 있습니다. https 를 사용하는 이유는.. 여러가지가 있겠지만.. 그 중에서도 가장 중요한 것은 보안 문제입니다. http 를 사용하게 되면.. 해당 사이트가 제대로 된 서버로 접속이 된건지.. 피싱 사이트인지 구분이 힘들지만, 제대로 된 https 인증서를 세팅한 사이트라면, 실제 회사의 사이트로 접속했다는 것을 인증서 발급 업체가 검증을 해주기 때문입니다. 그 외에 유저 전송 데이터를 암호화 하는 것도 반드시 필요하기 때문에 https가 권장되고 있습니다.

 

대부분의 웹서버들에서 ssl 설정을 할 수 있지만.. 오늘은 nginx 서버에 설정해 보겠습니다.

 

ssl 설정을 하기 위해서는 최종적으로 private key 파일과 인증서 파일이 필요합니다. 

 

먼저 private key 파일과 인증서 파일을 준비하는 과정입니다.

private key 파일이나 인증서 파일은 여러가지 형태(확장자)로 존재하기 때문에, 가장 기본이 되는 파일로 설명해 보겠습니다.

 

1. 암호화 된 private key 파일과 인증서 요청 파일을 생성합니다.

아래 명령어를 이용해서 생성합니다.

openssl req -newkey rsa:2048 -keyout PRIVATEKEY.key -out CSR.csr

private key 파일 (PRIVATEKEY.key) 과 인증서 요청 파일 (CSR.csr) 을 생성합니다. 여기서는 rsa 2048bits 로 생성했지만, 더 강화된 보안을 위해서 rsa:4096 등의 옵션을 사용할 수 있습니다.

생성시 private key 파일에 password 를 설정해야하며, 인증 요청을 위한 정보들 (국가, 지역 등등..) 을 입력해야 합니다.

private key 파일과 password 를 잘 보관해 둬야 합니다.

 

2. 인증서 요청 파일을 인증기관에 보내서 인증서를 발급 받습니다.

원래 인증기관은 인증을 해주는 기관이지만, 여기서는 ssl 인증서를 발급해 주는 회사라고 하겠습니다. GeoTrust 같은 곳이 유명하고, 그 외에도 cloudflare, sectigo(comodo) 등의 인증 기관에서 인증서를 발급 받을 수 있습니다. 인증 기관에 따라 서비스가 크게 차이가 나진 않지만 인증서 발급 가격은 다를 수 있습니다.

인증서는 전체 도메인에 대해서 받을 수도 있고, 특정 호스트 도메인에 대해서도 받을 수 있으며, 인증 기간에 따라서도 비용이 다르니 필요에 따라 발급 받으면 됩니다.

위에서 생성한 인증 요청 파일 (csr 파일)을 보내고, 비용을 내면, 인증서 파일 (pem, crt 등) 을 보내줍니다.

보통 인증기관에서는 요청 도메인에 대한 인증서와 체인 인증서등을 보내줍니다.

요청 도메인에 대한 인증서는 위에서 생성한 csr 에 대한 인증서입니다.

체인 인증서는 csr에 대한 인증서를 인증해준 인증기관들에 대한 정보라고 생각하면 됩니다. 즉, A라는 인증기관이 B를 인증해주고, B에서 csr에 대한 인증서를 발급해 준 것이라면, A-B 인증기관에 대한 인증서가 됩니다.

참고로 인증서는 하나의 파일에 여러 개의 인증 정보가 포함될 수 있습니다.

 

만약 체인 인증서에 요청한 인증서가 포함되지 않았다면, 아래 명령어로 인증서를 하나로 합칩니다.

(domain.crt 가 요청해서 받은 인증서, bundle.crt 가 인증 기관의 체인 인증서)

cat domain.crt bundle.crt > domain.chained.crt

 

3. 암호화된 private key 파일을 복호화합니다.

아래 명령을 이용하여 복호화합니다.

openssl rsa -in PRIVATEKEY.key -out domain.key

처음에 설정한 password 를 입력하면 domain.key 라는 복호화된 키 파일이 생성됩니다.

 

4. 파일을 적당한 위치에 위치시킵니다.

리눅스 서버를 기준으로 하면.. /etc/ssl/certs 같은 폴더에 인증서 파일을 보관합니다.

인증서 (domain.chained.crt) 와 private key (domain.key) 파일을 /etc/ssl/certs 폴더에 위치시킵니다.

 

파일을 읽기 전용으로 변환합니다. (optional)

chmod 400 domain.key
chomd 400 domain.chained.crt

 

nginx 설정 파일을 열어 다음과 같이 설정합니다.

# http 요청을 https URL로 redirect 시킨다.
server {
    listen 80;
    server_name your_domain.com;
    return 301 https://your_domain.com$request_uri;
}

server {
    listen 443 ssl;
    server_name your_domain.com;
    
    ssl_certificate      /etc/ssl/certs/domain.chained.crt;
    ssl_certificate_key  /etc/ssl/certs/domain.key;
    
    # 필요에 따라 ssl protocol 이나 cipher 등을 설정할 수 있음
    # ssl_protocols TLSv1.2 TSLv1.3;    
    # ssl_ciphers ...;
    # ssl_prefer_server_ciphers on;
    
    # 나머지 nginx 옵션
    ...
}

설정 후 nginx를 재시작 합니다.

 

재시작 후에는 아래 명령어로 nginx 설정을 확인해 봅니다.

nginx -t

 

위와 같이 설정하면 your_domain.com 으로 오는 요청에 대해서, http 요청은 https 로 리다이렉트 되고, https 요청은 브라우저의 루트 인증서와 사이트 인증서를 확인하고 나서, 브라우저에서 안전한 연결인지 알려주게 됩니다.

 

브라우저에서 자물쇠 표시가 제대로 나오고, 에러 메시지가 없으면 잘 처리 된 것입니다. 

(아래는 네이버 사이트 https 연결 체크)

 

요약

1. key 파일과 인증서 요청 파일을 생성한다.

2. 인증서 요청 파일을 가지고 인증기관에서 인증서를 받아온다.

3. key 파일 (decrypt 필요), 인증서 파일 (체인 인증서) 을 준비해서 적당한 위치에 둔다.

4. nginx 설정에 key와 인증서 등을 세팅하고 리스타트 한다.

 

 

많이 사용되는 파일 확장자를 간략히 정리하면 다음과 같습니다.

  • .key : private key. (.p8 혹은 .pkcs8을 쓰기도 함) encrypted 된 파일도 있고, decrypted 된 파일도 있습니다. encrypted 파일의 경우 decrypt 하기 위해서는 암호가 필요합니다.
  • .csr : 인증 요청서 파일. (.req 혹은 .p10을 쓰기도 함) 이것을 인증 기관으로 보내서 인증서를 받습니다. (보통은 파일 형태로 보내지 않고, 그 내용만 복사해서 폼에 붙여 넣습니다.)
  • .crt : 인증서 파일. (.cer 을 쓰기도 함) 체인 인증서일 수도 있음.
  • .der : 바이너리 형태의 인증서. (.cer 을 쓰기도 함)
  • .pem : 컨테이너 파일. 컨테이너 라는 것은 안에 무언가 내용을 담을 수 있다는 의미이며, base64로 인코딩된 내용이 들어갑니다. 내용은 key가 될 수도 있고, 인증서가 될 수도 있습니다. (즉, 어떤 내용이 담겨있는지는 생성한 쪽에서 알려줘야 합니다.)
  • .p7b 혹은 .p7c : PKCS#7/CMS 메세지. private key 를 제외한 인증서 혹은 체인 인증서를 담기 위해 사용됩니다.
  • .pfx 혹은 .p12 : PKCS#12 파일. 키 스토어 컨테이너로 보통은 암호화 된 private key 와 인증서를 같이 담기 위해 사용됩니다.

 

각 포맷간 변환 참조 (소스: https://myonlineusb.wordpress.com/2011/06/19/what-are-the-differences-between-pem-der-p7bpkcs7-pfxpkcs12-certificates/)

# PEM to DER
openssl x509 -outform der -in certificate.pem -out certificate.der

# PEM to P7B
openssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfile CAcert.cer

# PEM to PFX
openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CAcert.crt

# DER to PEM
openssl x509 -inform der -in certificate.cer -out certificate.pem

# P7B to PEM
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer

# P7B to PFX
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile CAcert.cer

# PFX to PEM
openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes

 

반응형
반응형

이번에는 request 할 때, 서버로 데이터를 전송하는 것에 대해서 알아보겠습니다.

 

먼저 데이터를 전송하는 방법에 대해서 정리해 보겠습니다.

클라이언트에서 서버로 http를 이용해서 데이터를 전송하는 방법은 크게 3가지가 있습니다.

1. Query string

2. URI parameter

3. request body

 

Query string 은 request 뒤에 [key]=[value] 형식으로 값을 붙여서 전달하는 방식입니다.

ex) 

curl "http://localhost:5000?key=value"

 

두 개 이상 값을 전송할 때는 key, value 셋 사이에 &를 사용합니다.

curl "http://localhost:5000?key1=value1&key2=value2"

 

URI parameter는 URL에 값을 넣어서 호출하는 방식으로, 서버쪽에서 URL을 parsing 해서 사용합니다.

ex)

category 에 food 라는 값을 전송

curl http://localhost:5000/category/food

category1 에는 food, category2 에는 fruit 전송

curl http://localhost:5000/category1/food/category2/fruit

 

request body 의 경우는 POST method를 이용해서 데이터를 추가로 전송합니다.

ex)

form 전송

curl -X POST http://localhost:5000 -d 'key1=value1&key2=value2'

 

json 데이터 전송 (header 정보가 필요합니다.)

curl -X POST http://localhost:5000 -H "Content-Type: application/json" -d '{"key1":"value1", "key2":"value2"}'

 

각각에 대해서 flask 서버에서 처리하는 방법은 다음과 같습니다.

 

먼저 Query string 을 처리하는 방법입니다. 

request.args.get(<key>) 를 이용해서 값을 받아 올 수 있습니다.

@app.route("/query")
def query_test():
    return ("<br>".join( map(lambda key: '{}={}'.format(key, request.args.get(key)), request.args) ))

 

테스트를 위해서는 아래와 같이 path 를 query로 지정합니다. 

curl "http://localhost:5000/query?key=value"

 

URI parameter 를 처리하는 방법입니다.

route annotation path에 parameter들을 <> 를 이용해서 세팅합니다. 

method에 해당 parameter를 인자로 받아서 처리합니다.

@app.route("/category1/<category1>/category2/<category2>")
def uri_test(category1, category2):
    return "<p>Category1: {} <br>Category2: {}</p>".format(category1, category2)

 

아래 처럼 호출을 하면,

curl http://localhost:5000/category1/food/category2/fruit

 category1 은 food, category2 는 fruit 이 들어오는 것을 확인할 수 있습니다.

 

request body로 오는 정보는 request.form, request.json 혹은 request.data 으로 처리할 수 있습니다.

form은 데이터가 query string 과 같이 <key>=<value> 형식으로 오는 경우 처리가 가능합니다.

json은 header에 Content-Type 을 application/json 으로 지정해주고, body가 json 포맷으로 되어 있는 경우 처리가 가능합니다.

마지막으로 data는 클라이언트에서 보내주는 binary 데이터를 그대로 받아올 수 있습니다.

 

먼저 method 를 POST 로 지정해 줍니다. 

form의 경우는 method를 지정해 주고, 위의 query에서 사용한 request.args 를 request.form 으로 변경해 주기만 하면 됩니다.

참고로 query 혹은 form 에 대해서 방식에 관계없이 처리하는 경우에는 request.value 를 이용할 수 있습니다. query 와 form 모두 같은 키로 데이터를 보낸 경우 query가 우선합니다.

@app.route("/form", methods=['POST'])
def form():
    return ("<br>".join( map(lambda key: '{}={}'.format(key, request.form.get(key)), request.form) ))

 

json의 경우 request.json 을 이용하면 됩니다.

import json

...

@app.route("/json", methods=['POST'])
def json_test():
    return json.dumps(request.json)

 

테스트 할 때는 header를 지정해야 합니다.

curl -X POST http://localhost:5000 -H "Content-Type: application/json" -d '{"key1":"value1", "key2":"value2"}'

 

 

반응형

+ Recent posts