개발/백엔드

server - 회원가입( 비밀번호 암호화(psycopg2) 와 jwt 토큰 설치, email 확인을 위한 email-validator )

웅'jk 2023. 1. 5. 11:17

서버에서 user 테이블을 생성하고 username , email , password 로 만들겠습니다.

create table user(
	id int primary key not null unsiged auto_increment,
    username varchar(80) not null unique,
    email varchar(200) not null unique,
    password varchar(256) 
    
)

 

클라이언트에서 POST 방식으로 회원가입을 진행하기 위해 데이터를 보내왔습니다.

{ "name": "홍길동",
  "email":"abc@naver.com",
  "password":"1234" }
이를 처리하는 코드를 작성합니다.
 

0. 필요한 라이브러리 임포트

import datetime
from flask import request
from flask_restful import Resource
from mysql.connector.errors import Error
from mysql_connection import get_connection
from email_validator import validate_email,EmailNotValidError
from utils import hash_password
from flask_jwt_extended import create_access_token

1. 데이터를 받아옵니다.

class UserRegisterResource(Resource) :
    def post(self) :
    # 1. 클라이언트가 보낸 데이터를 받아준다.
        data = request.get_json()

2. 입력받은 이메일이 올바른지 처리하기 위해 validation 라이브러리를 설치하고 확인합니다.

pip install email-validator
# 2. email 주소 형식이 올바른지 확인한다.
        try :
            validate_email( data['email'] )
        except EmailNotValidError as e :
            print(str(e))
            return { 'result' : 'fail' , 'error' : str(e) } , 400

3. 비밀번호의 길이를 확인합니다. ( 4자리 ~ 12자리 까지만 인정)

# 3. 비밀번호의 길이가 유효한지 체크한다. 
        if len( data['password'] ) > 12 or len(data['password']) < 4 :
            return {'error' : '비밀번호 길이 확인'} , 400

4. 비밀번호를 암호화 하여 서버에 저장하기 위해서 utils.py 에 암호화 코드를 작성하고 호출하여 암호화를 진행합니다.

pip install psycopg2-binary
pip install passlib
# utils.py

from passlib.hash import pbkdf2_sha256
from config import Config
# 원문 비밀번호를, 암호화 하는 함수
def hash_password(original_password) :
    salt = Config.SALT
    password = original_password + salt 
    password = pbkdf2_sha256.hash(password)
    return password
# 유저가 로그인할때, 입력한 비밀번호가 맞는지 체크하는 함수
def check_password(original_password , hashed_password) :
    salt = Config.SALT
    password = original_password + salt
    check = pbkdf2_sha256.verify(password,hashed_password)
    return check
# config.py 이전 포스팅에서 작성한 코드는 제외

SALT = 'dskj29jcdn12jn'

 # JWT 관련 변수 세팅
    JWT_SECRET_KEY ='여러분이설정'
    # 뱅킹등 토큰을 종료할 필요가 있을시에는 TRUE
    JWT_ACCESS_TOKEN_EXPIRES = False
    PROPAGATE_EXCEPTIONS = True
# 4. 비밀번호를 암호화 한다.
        hashed_password = hash_password( data['password'] )
        print(hashed_password)

 

5. DB에 회원 정보를 저장한다.

 try :
            connection = get_connection()
            query = '''insert into user(username,email,password)
                       values(%s,%s,%s);'''
            record = (data['name'] , data['email'] , hashed_password)
            cursor = connection.cursor()
            cursor.execute(query,record)
            connection.commit()
# 5 - 1. 클라이언트에 userid 값을 주어야한다. 그래야만 id값을 통해 내 정보를 찾을 수 있다.
            user_id = cursor.lastrowid
            cursor.close()
            connection.close()
        except Error as e :
            cursor.close()
            connection.close()
            return {'result' : 'fail' ,'error':str(e)} , 500

여기서 user_id 를 그대로 클라이언트에게 보내주게 되면 보안상의 문제가 발생하기 때문에 jwt 토큰을 이용하여

변환하여 보내주어야 한다.

pip install flask-jwt-extended
# 5 - 1 jwt 토큰
access_token = create_access_token(user_id)
        return {'result' : 'success','access_token':access_token} , 200