본문 바로가기
백엔드/API

[API] 유저정보 저장: 비밀번호 암호화, 이메일 형식 확인, 예외처리

by eyoo 2022. 6. 20.

앱을 개발할때 개발자가 사용자들의 비밀번호를 알수없도록 암호화만 가능하게 만들어야 한다. (단방향)

 

이때 암호화만 하되 복호화는 하지않는것이 hash다.

 

먼저 사용할  psycopg2-binary와 passlib라이브러리를 설치하자.

 

pip install psycopg2-binary passlib

 

 

비밀번호 암호화를 위한 파이썬 파일을 만들어 코드를 작성한다.

 

from passlib.hash import pbkdf2_sha256

# 원문 비밀번호를 암호화 하는 함수 (암호화만 하되 복호화는 하지않는것이 해쉬다.)
def hash_password(original_password) :
    salt = 'yh*hello12'
    password = original_password + salt
    password = pbkdf2_sha256.hash(password)
    return password

# 비밀번호가 맞는지 확인하는 함수, True / False로 리턴한다.

def check_password(original_password, hashed_password):
    salt = 'yh*hello12'
    check = pbkdf2_sha256.verify(original_password+salt,hashed_password)
    return check

# salt로 문자를 임의로 정해서 유니크한 암호기를 만든다.

 

 

회원가입하는 API를 만들어보자.

 

이메일 형식을 체크하는 라이브러리인 email-validator를 설치하자

 

pip install email-validator

 

관련 웹사이트: 

 

https://pypi.org/project/email-validator/

 

email-validator

A robust email syntax and deliverability validation library.

pypi.org

 

유저 정보를 처리하기 위한 파이썬 파일을 만들고 코드를 입력하자

 

from http import HTTPStatus
from flask import request
from flask_restful import Resource
from mysql.connector.errors import Error
from mysql_connection import get_connection
import mysql.connector
from email_validator import validate_email, EmailNotValidError
from utils import hash_password, check_password


class UserRegisterResource(Resource):
    def post(self):
        data = request.get_json()

        # 이메일 주소형식을 확인한다.

        try:            
            validate_email(data['email'])

        except EmailNotValidError as e:
            print(str(e))
            return {'error' : str(e)} , 400

        # 비밀번호 암호화
        # 비밀번호의 길이가 유효한지 체크한다. 4자리이상 12자리이상
        if len(data['password']) < 4 or len(data['password'])>12:
            return{'error': '비밀번호 길이는 4자리 이상 12자리 이하이어야 합니다.'}, 400

        hashed_password = hash_password(data['password'])

        # 데이터베이스에 회원정보를 저장한다.

        try :

            # 데이터 insert 
            # 1. DB에 연결
            connection = get_connection()

            # 2. 쿼리문 만들기
            query = '''insert into user
                    (username, email, password)
                    values
                    (%s, %s, %s);'''

            record = (data['username'], data['email'], hashed_password ) # 튜플형식
            # 3. 커서를 가져온다.
            cursor = connection.cursor()

            # 4. 쿼리문을 커서를 이용해서 실행한다.
            cursor.execute(query, record )

            # 5. 커넥션을 커밋해줘야 한다 => 디비에 영구적으로 반영하라는 뜻
            connection.commit()

            # DB에 저장된 ID값 가져오기
            user_id = cursor.lastrowid

            # 6. 자원 해제
            cursor.close()
            connection.close()

        except mysql.connector.Error as e :
            print(e)
            cursor.close()
            connection.close()
            return {"error":str(e)}, 503   # 

        return {"result":"success" , "user_id" : user_id}, 200

# 유저아이디로 유저를 특정할수있도록 설정한다.

 

테이블에 유저정보가 저장된것을 확인할수있다.

 

 

 

 

 

 

댓글