프로젝트/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"))