프로젝트/hyper-V 웹서비스
[hyper-V 웹서비스]2. flask로 로그인 기능 구현
김칠복
2022. 3. 11. 14:01
1. 로그인 구현하기
저번 글에서 DB안에 유저 정보를 넣었으니, 이제 꺼내 볼 차례이다.
전과 마찬가지로 할 일을 적어보자.
-유저에게 로그인정보 받아오기(id,pw)
-DB안의 정보와 비교해서 일치하면 로그인 시켜주기
MongoDB의 파이썬 내 CRUD는 어렵지 않은데, 문제는 로그인 시켜주기이다. 로그인을 시켜준다는건 뭘 뜻하는 걸까?
로그인이 되었다는 것은 기능을 갖고 작동할 앞으로의 페이지들이 현재 로그인 한 유저를 인식한다는 뜻이다. 즉, 사용자에 대한 연속성을 유지하는 개념이라고 볼 수 있다.
방식은 크게 두가지를 사용할 수 있다.
1.토큰
2.세션
토큰은 정보를 클라이언트가 직접 가지고있다가 서버가 요청할때 받는 정보를 뜻한다.
그렇다. 보안을 생각하면 멀리해야 할 물건이다. 열쇠를 전단지처럼 뿌리고 다닐 수는 없는 노릇이기 때문!
반대로 세션은 서버가 정보를 저장한다. 물론 토큰도 용도가 있지만, 세션만큼 보안성이 좋지 못하다.
플라스크내에서 제공하는 세션 모듈을 사용하도록 하겠다.
2.일단 만들어볼게요
login.html(일부):
<div class="text-center">
<h1 class="h4 text-gray-900 mb-4">로그인</h1>
</div>
<form class="user" method="POST">
<div class="form-group">
<input type="id" class="form-control form-control-user"
id="user_id" name = "user_id"
placeholder="아이디">
</div>
<div class="form-group">
<input type="password" class="form-control form-control-user"
id="user_pw" name = "user_pw" placeholder="비밀번호">
</div>
<div class="form-group">
</div>
<button type ='submit' class="btn btn-primary btn-user btn-block">
로그인
</button>
</form>
<hr>
<div class="text-center">
<a class="small" href="/forgot">비밀번호를 잊으셨나요?</a>
</div>
<div class="text-center">
<a class="small" href='{{url_for("register")}}'>회원가입하기</a>
</div>
app.py:
from flask import Flask, request, render_template, session, redirect, flash, jsonify, url_for
app.config["PERMANENT_SESSION_LIFETIME"] = timedelta(minutes=15) #세션 제한시간 부여
@app.route('/login', methods=['GET','POST'])
def login():
if request.method == 'POST':#메소드 확인
user_id = request.form['user_id']
user_pw = request.form['user_pw']
result = user.find_one({'user_id' : user_id})#user_id와 일치하는 데이터 검색
pw_hash = hashlib.sha256(user_pw.encode('utf-8')).hexdigest()#받은 패스워드 해쉬
if result == None: #일치하는 user_id가 없으면
flash("올바른 아이디가 아닙니다..")
return redirect(url_for("login"))
elif result["user_pw"] != pw_hash:#일치하는 패스워드가 아니면
flash("올바른 패스워드가 아닙니다.")
return redirect(url_for("login"))
else:#일치하면
session['login'] = user_id #세션 부여
return redirect(url_for("main", msg=user_id+"님 로그인 되었습니다"))
else:
return render_template("login.html")
비밀번호를 해쉬로 바꿔서 DB안의 정보와 비교한다.
알고리즘은 주석을 참고
또한 로그아웃은 이렇게 했다.
app.py:
@app.route('/logout', methods=['GET'])
def logout():
session.pop('login', None)#로그인 세션 삭제
return redirect(url_for("main"))