초보 개발자

회원가입 구현 hashlib 본문

AI 웹개발 트랙 - 내배캠/3주차

회원가입 구현 hashlib

taehyeki 2021. 12. 28. 15:30

 

@app.route('/')
def home():
    # 현재 이용자의 컴퓨터에 저장된 cookie 에서 mytoken 을 가져옵니다.
    token_receive = request.cookies.get('mytoken')
    print(token_receive)
    try:
        # 암호화되어있는 token의 값을 우리가 사용할 수 있도록 디코딩(암호화 풀기)해줍니다!
        payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])
        user_info = db.user.find_one({"id": payload['id']})
        return render_template('index.html', nickname=user_info["nick"])
		# 만약 해당 token의 로그인 시간이 만료되었다면, 아래와 같은 코드를 실행합니다.
    except jwt.ExpiredSignatureError:
        return redirect(url_for("login", msg="로그인 시간이 만료되었습니다."))
		# 만약 해당 token이 올바르게 디코딩되지 않는다면, 아래와 같은 코드를 실행합니다.
    except jwt.exceptions.DecodeError:
        return redirect(url_for("login", msg="로그인 정보가 존재하지 않습니다."))

home으로 들어왔을 때 처음 token_receive에 'mytoken'이라는 걸 쿠키에서 찾아온다.

물론 처음 '/' url에 들어왔을 땐 존재 하지 않으니 None값이 리턴될 것이다.

 

그 다음 try - except 구문을 활용한다. 만약 활용하지 않으면 아래의 구문에서 오류가 발생한다.

payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])

jwt.exceptions.DecodeError

jwt.exceptions.DecodeError: Invalid token type. Token must be a <class 'bytes'>

 

토큰을 디코드 해야되는데 유효하지 않은 토큰이라고한다. 추가적으로 알 수 있는 부분은 토큰은 bytes클래스여야 하나보다. 따라서 아래의 구문으로 빠지기 때문에

except jwt.exceptions.DecodeError:
    return redirect(url_for("login", msg="로그인 정보가 존재하지 않습니다."))

2021.12.28 - [Python/이것 저것] - Flask redirect , uri_for를 알아보자!

 

Flask redirect , uri_for를 알아보자!

먼저 redirect함수는 서버에서 프론트엔드로 ~~ url로 이동시키는 것이다. @app.route('/where') def where(): return redirect('http://naver.com') localhost:5000/where로 접근하였을 때 redirect로 네이버 주..

taehyeki.tistory.com

url_for에 관해서 살짝 다뤄보았으니 여기서 참고하자!! 간단히 설명해보면 app.py에서 login함수가 참조하고 있는 어떤 url로 이동해라~ 근데 msg라는 parameter를 가지고 !!라는 의미이다. 

@app.route('/login')
def login():
    msg = request.args.get("msg")
    return render_template('login.html', msg=msg)

따라서 기본적으로 localhost:5000에 접속하면

localhost:5000/login?msg="로그인 정보가 존재하지 않습니다." 라는 url로 이동을 시킬 것이고.

msg라는 변수에 "로그인 정보가 존재하지 않습니다."라는 문자열이 들어가고 이걸 login.html을 렌더링할때 같이 가지고 간다.  login.html의 script에는 아래와 같이 msg가 있다면 alret로 msg를 출력하라 라는 것이 있어서

 

아래와 같이 처음에 출력이 되는 것이다.

그 다음 회원가입 창에 들어가보면 아래와 같은 화면이 나온다.

단순히 html을 렌더하라고만 하여 그냥 넘어가자

회원가입 버튼을 누르면 아래와 같은 함수가 실행이 된다.

 

post방식으로 data를 url에 보내는 API이다. 먼저 app.py로 가서 api/register 찾아보자

data에 담긴 정보들을 각각 id_receive, pw_receive, nickname_receive로 담아온다.

 

그리고 pw를 안전하게 보관하기 위해 hashlib를 통해 비밀번호를 해쉬화 해주려고 한다.

hashlib.sha256()은 bytes 형식의 글자를 hash class로 만들어주는 역할을 한다.

따라서 pw를 먼저 bytes 형식으로 바꿔주어야 한다. 그래서 유니코드 문자열을 UTF-8 형식의 bytes를 반환하는 str.encode('utf-8')을 사용했다. 그리고 

해쉬화 하는 방법에는 digest와 hexgigest가 있다.
digest()는 해싱된 바이트 문자열을 리턴하고 hexgigest()는 바이트 문자열을 16진수로 변환한 문자열을 리턴한다.

 

즉, pw를 해쉬화 해주기 위해서 먼저 pw를 byte로 인코딩을 해주었고 이를 통해 해쉬화가 되었으니 hexdigest로 해쉬화를 해준 것이다.  연결된 db의 user라는 콜렉션에 id,pw,nick정보가 잘 전달될 것이다.