Advertisement
  1. Code
  2. Python

파이썬 플라스크와 MySQL을 이용한 웹 앱 개발: 2부

by
Read Time:7 minsLanguages:
This post is part of a series called Creating a Web App From Scratch Using Python Flask and MySQL.
Creating a Web App From Scratch Using Python Flask and MySQL
Creating a Web App From Scratch Using Python Flask and MySQL: Part 3

Korean (한국어) translation by Dae-yeop Lee (you can also view the original English article)

이 연재 기사의 1부에서는 파이썬 플라스크와 MySQL을 시작하고 애플리케이션의 사용자 등록 부분을 구현하는 방법을 살펴봤습니다. 이번 튜토리얼에서는 애플리케이션의 로그인 및 로그아웃 기능을 구현해서 다음 단계로 넘어가겠습니다.

시작하기

먼저 깃허브(GitHub)에서 이전 튜토리얼의 소스코드를 복제(clone)합니다.

소스코드가 복제되면 PythonFlaskMySQLApp---Part-1 디렉터리로 이동한 후 서버를 구동합니다.

브라우저에서 http://localhost:5002로 이동하면 애플리케이션이 실행될 것입니다.

로그인 인터페이스 만들기

PythonFlaskMySQLApp---Part-1/templates로 이동한 후 signin.html이라는 새 파일을 생성합니다. signin.html을 열고 다음 HTML 코드를 추가합니다.

app.py를 열고 로그인 인터페이스에 대한 새 라우트를 추가합니다.

다음으로 index.htmlsignup.html을 열고 두 페이지의 로그인  href 링크를 /showSignin으로 추가합니다. 모든 변경 사항을 저장하고 서버를 재시작합니다.

브라우저에서 http://localhost:5002로 이동한 후 Sign In 링크를 클릭하면 로그인 페이지를 볼 수 있습니다.

Sign In pageSign In pageSign In page

로그인 구현하기

이제 사용자 로그인을 검증하는 함수를 만들어야 합니다. Sign In을 클릭하면 입력한 이메일 주소와 비밀번호를 유효성 검증 사용자 함수로 전달할 것입니다.

저장 프로시저 만들기

사용자의 유효성을 검사하려면 MySQL 저장 프로시저가 필요합니다. 다음과 같이 MySQL 저장 프로시저를 생성합니다.

sp_validateLogin을 이용해 MySQL 데이터베이스로부터 username을 기반으로 사용자 정보를 구합니다. 암호가 해시되면 사용자가 입력한 암호와 비교해서 유효성을 검사할 것입니다.

유효성 검증용 사용자 메서드

사용자가 폼을 제출할 때 호출할 사용자 검증 메서드를 만듭니다.

위 코드에서 볼 수 있듯이 전송된 이메일 주소와 비밀번호를 읽어 _username_password로 넣었습니다. 이제 _username 매개변수를 사용해 sp_validateLogin 프로시저를 호출하겠습니다. 따라서 validateLogin 메서드 내에서 MySQL 연결을 생성합니다.

연결이 생성되면 con 연결을 사용해 cursor를 만듭니다.

커서를 이용해 다음과 같이 MySQL 저장 프로시저를 호출합니다.

다음과 같이 커서에서 조회된 레코드를 가져옵니다.

데이터에 레코드가 들어있는 경우 검색된 비밀번호와 사용자가 입력한 비밀번호가 일치하는지 확인합니다.

위 코드에서 볼 수 있듯이 check_password_hash라는 메서드를 이용해 반환된 해시 비밀번호가 사용자가 입력한 비밀번호와 일치하는지 확인합니다. 이 과정이 문제 없이 진행되면 사용자를 userHome.html로 리디렉션합니다. 반면 오류가 있으면 error.html을 오류 메시지와 함께 표시합니다.

다음은 validateLogin 메서드의 전체 코드입니다.

템플릿 폴더 안에 userHome.html이라는 페이지를 만들고 다음과 같은 HTML 코드를 추가합니다.

또한 template 폴더에 error.html이라는 오류 페이지를 작성하고 다음과 같은 HTML 코드를 추가합니다.

error.html 안에는 다음과 같은 요소를 둡니다.

변수의 값은 render_template 함수에서 전달될 수 있으며 동적으로 설정할 수 있습니다.

로그인에 성공할 경우 사용자를 사용자 홈 페이지로 리디렉션하고 있으므로 다음과 같이 /userHome이라는 라우트를 만들어야 합니다.

모든 변경 사항을 저장하고 서버를 재시작합니다. 홈 페이지에서 Sign In 링크를 클릭하고 유효한 이메일 주소와 비밀번호를 사용해 로그인해봅니다. 사용자 유효성 검사가 성공적으로 끝나면 다음과 같이 페이지가 나타날 것입니다.

User home on successful user sign inUser home on successful user sign inUser home on successful user sign in

사용자 유효성 검사가 실패하면 사용자는 다음과 같이 오류 페이지로 리디렉션됩니다.

Error message on unsuccessful user sign inError message on unsuccessful user sign inError message on unsuccessful user sign in

여기서는 오류를 보여주기 위해 별도의 오류 페이지를 사용했습니다. 동일한 페이지를 사용해 오류 메시지를 표시하더라도 문제는 없습니다.

사용자 홈 페이지에 대한 허가되지 않은 접근 제한하기

사용자 유효성 검사가 성공할 경우 사용자는 사용자 홈 페이지로 리디렉션됩니다. 그러나 허가되지 않은 사용자조차도 http://localhost:5002/userHome URL을 열람하면 홈 페이지를 볼 수 있습니다.

허가되지 않은 사용자 접근을 제한하기 위해 성공적인 사용자 로그인에 대해 설정할 세션 변수를 확인하겠습니다. 따라서 플라스크에서 session을 임포트합니다.

또한 세션에 비밀 키도 설정해야 합니다. 그래서 app.py에서는 앱이 초기화된 후 다음과 같이 비밀 키를 설정합니다.

이제 validateLogin 메서드에서는 로그인에 성공할 경우 /userHome으로 사용자를 리디렉션하기 전에 다음과 같이 session 변수를 설정합니다.

다음으로 userHome 메서드에서는 userHome.html을 렌더링하기 전에 세션 변수를 검사합니다. 세션 변수가 없으면 오류 페이지로 리디렉션합니다.

모든 변경 사항을 저장하고 서버를 재시작합니다. 로그인하지 않은 상태에서 http://localhost:5002/userHome으로 들어가보면 아직 로그인하지 않았기 때문에 오류 페이지로 리디렉션될 것입니다.

Unauthorized access errorUnauthorized access errorUnauthorized access error

로그아웃 구현하기

로그아웃 기능을 구현하는 것은 가장 간단합니다. user 세션 변수를 null로 만들고 사용자를 메인 페이지로 리디렉션하기만 하면 됩니다.

app.py에서 다음과 같이 logout에 대한 새 라우트와 메서드를 만듭니다.

보다시피 로그아웃 버튼에 대한 href를 이미 /logout으로 설정했습니다. 그럼 모든 변경 사항을 저장하고 서버를 재시작합니다. 홈 페이지에서 Sign In을 클릭하고 유효한 이메일 주소와 비밀번호를 사용해 로그인합니다. 로그인한 후 사용자 홈의 Logout 버튼을 클릭하면 애플리케이션에서 성공적으로 로그아웃될 것입니다.

정리

튜토리얼의 이번 연재 기사에서는 사용자 로그인 및 로그아웃 기능을 구현하는 방법을 살펴봤습니다. 또한 애플리케이션 페이지에 대한 허가되지 않은 접근을 제한하는 방법도 살펴봤습니다. 이 튜토리얼의 다음 기사에서는 로그인한 사용자가 애플리케이션에서 블로그 게시물을 추가하고 편집할 수 있는 기능을 구현하겠습니다.

이 튜토리얼의 소스코드는 깃허브에서 확인할 수 있습니다.

아래 댓글로 여러분의 생각을 알려주세요!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.