본문 바로가기

개발 공부

회원가입, 로그인 기능구현

먼저 회원가입부터 보면

@app.route('/api/sign', methods=["POST"])
def sign_up():
    id_receive = request.form['id_give']
    pw_receive = request.form['pw_give']
    name_receive = request.form['name_give']
    nick_receive = request.form['nick_give']
    # 비밀번호 암호화
    pw_hash = hashlib.sha256(pw_receive.encode('utf-8')).hexdigest()
    if db.min7_project.find_one({'id': id_receive}) is None:
        doc = {
            'id': id_receive,
            'pw': pw_hash,
            'name': name_receive,
            'nick': nick_receive
        }
        db.min7_project.insert_one(doc)
        return jsonify({'msg': '가입 완료!'})
    else:
        return jsonify({'msg': '중복된 아이디 입니다'})

비밀번호를 sha256문자열화 시킨다. sha256은 단방향 암호화로 변형된값으로 원래값을 받아올 수 없다.

@app.route('/api/login', methods=["POST"])
def login():
    id_receive = request.form['id_give']
    pw_receive = request.form['pw_give']
    pw_hash = hashlib.sha256(pw_receive.encode('utf-8')).hexdigest()
    result = db.min7_project.find_one({'id': id_receive, 'pw': pw_hash})
    print(result)
    if result is not None:
        payload = {
            'id': id_receive,
            'exp': datetime.datetime.utcnow() + datetime.timedelta(days=5)
        }
        token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
        return jsonify({'result': 'success', 'token': token})
    else:
        return jsonify({'result': 'fail', 'msg': '아이디/비밀번호가 일치하지 않습니다.'})

로그인 코드인데, id와 pw를 받아와서 pw를 암호화하고 비교후, 일치한다면 토큰값을 쥐어준다.

토큰은 안에 id, exp(로그인 유지기간),secret key가 jwt토큰으로 인코드되어 보내진다.

jwt는 양방향 암호화이다.

@app.route('/main')
def show_main():
    token_receive = request.cookies.get('mytoken')
    try:
        payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])
        user_info = db.min7_project.find_one({"id": payload['id']})
        return render_template('index.html', nickname=user_info["nick"], id=payload['id'])
    except jwt.ExpiredSignatureError:
        return redirect(url_for("login", msg="로그인 시간이 만료되었습니다."))
    except jwt.exceptions.DecodeError:
        return redirect(url_for("login", msg="로그인 정보가 존재하지 않습니다."))

로그인이 완료되면 /main으로 이동하는데, 토큰을 받아와서 디코드를 하고, 유저 아이디를 확인한이후, 메인페이지와 닉네임, 아이디를 리턴한다. 토큰이 사라질경우는 try except문으로 구현해놓았다.

 

github 주소:https://github.com/kingscode99/MiniProjectTeam7.git

'개발 공부' 카테고리의 다른 글

내가 보려고 만든 JAVA객체지향 총정리  (0) 2022.12.15
None값의 정의  (0) 2022.12.14
파이썬 try except  (0) 2022.12.12
항해 99 7조 팀 노션  (0) 2022.12.10
git 협업 명령어 정리(pull, merge)  (0) 2022.12.10