ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Express - MySQL Session
    JavaScript/Node.js 2018. 12. 4. 20:07

    Express - MySQL Session

    지난 시간에 세션에 대해서 알아보았다.

    세션 정보는 클라이언트와 서버간 통신이 끊길 경우 사라진다는 특징이 있다.

    이것을 방지하기 위해서 세션에 대한 정보를 데이터 베이스에 저장하고 키 정보를 클라이언트 PC에 저장하여 접속 시 데이터 조회를 통해 세션을 유지하는 방법이 있다.

    이번 시간에는 MySQL에 세션 데이터를 저장하는 방법을 알아보자.




     Express-MySQL-Session

    npm사이트에서 express-mysql-session을 검색하자.

    이 패키지는 세션 정보를 mysql 데이터베이스에 저장하기 위한 패키지다.


    설치 구문을 이용해 패키지를 설치하도록 하자.




     Express-Mysql-Session API

    사용 방법을 보고 사용해보자.

    "express-mysql-session"을 사용하기 위해서는 "express"와 "express-session"을 애플리케이션에 주입해야한다.

    그리고 express-mysql-session을 require()로 주입하는데 이 때 인자로 express-session 미들웨어 정보를 전달해야한다.

    그리고 Database에 대한 정보를 옵션에 작성하고 session()객체를 사용 선언할 때 옵션으로 express-mysql-session객체를 전달해준다.



    이런 사용 방법들을 참고해서 로그인 프로그램을 만들어보자.




     로그인 애플리케이션 생성

    프로젝트에 app_session_mysql.js를 생성하자.

    그리고 아래의 내용을 작성하자.

    express를 주입시켜 웹 애플리케이션으로 설정하고

    express-session을 주입시켜 세션 정보를 사용할 수 있도록 설정한다.

    그리고 express-mysql-session을 주입시켜 세션 정보를 mysql에 저장할 수 있도록 설정한다.

    body-parser를 주입시켜 post데이터를 처리할 수 있도록 설정한다.


    express객체를 생성하고 그 객체에 세션 객체를 사용 설정한다. 

    이 때 MySQL DB 정보를 옵션으로 작성하여 객체를 생성하고 세션 객체를 생성할 때 store 옵션으로 전달한다.


    여기서 중요한 부분이 한가지 있는데, app_session_mysql.js 애플리케이션을 실행시켜보면 다음과 같은 사실을 알 수 있다.

    코드에서 설정한 데이터 베이스안에 sessions라는 테이블이 자동으로 생성된다.


    이 테이블은 세션에 대한 정보를 담는 테이블이며, session_id 컬럼의 데이터를 클라이언트 PC의 쿠키에 저장한 session 정보와 대치하여 세션을 유지시켜주는 핵심이라는 것이다.




     로그인 폼 작성

    간단하게 핵심적인 기능을 구현할 것이므로 템플릿을 이용한 폼 작성대신 직접 태그를 작성해 화면에 send하는 처리로 폼을 작성할 것이다.

    아래의 코드를 작성한다.

    /auth/login 으로 요청이 들어오면 로그인 폼을 화면에 출력해준다.


    URL로 접속해보면 화면에 입력 폼들이 나타난다.




     로그인 처리 작성

    로그인 폼을 작성했으니 로그인 요청이 들어올 경우 로그인을 처리하는 비즈니스 로직을 작성하자.

    사용자에 대한 데이터 정보를 담는 배열 변수를 만든다. 

    (정상적인 프로세스라면 사용자 데이터 정보는 데이터 베이스에 담는 것이 일반적이다. 지금은 간단한 테스트 용도이니 이와 같이 처리한다.)

    저장된 사용자 로그인 정보와 입력받은 데이터를 비교한다.


    입력받은 데이터가 저장된 데이터와 일치하다면 세션에 displayName을 저장시키고 /welcome으로 이동시킨다.

    일치하지 않은 정보일 경우 로그인으로 이동시키는 링크를 보여준다.




     welcome 페이지 요청 처리 작성

    로그인 처리 로직에서 welcome 페이지로 이동하도록 처리하였으므로 welcome 라우트 처리를 하자.

    세션에 저장된 displayName 정보를 확인하여 로그인된 사용자인지 판단한다.

    로그인된 사용자인 경우 displayName 정보를 화면에 출력해주고 로그아웃 메뉴를 제공한다.

    로그인되지 않은 사용자인 경우 로그인 메뉴를 제공한다.




     로그아웃 처리 로직 작성

    welcome 페이지에서 로그아웃 메뉴를 제공하고 있으므로 로그아웃을 처리하는 비즈니스 로직을 작성하자.

    JavaScript의 delete문을 이용하여 session의 displayName 정보를 제거해줌으로써 로그아웃된 처리를 하게된다.


    프로세스는 다음과 같다.

    1. session의 displayName을 제거

    2. welcome 페이지로 이동

    3. welcome 페이지 접속 시 세션의 displayName 존재 여부 판단

    4. displayName이 존재하지 않는 경우 로그인 메뉴 출력




     실행

    작업을 완료했으니 실행해보자.

    저장된 정보가 아닌 정보로 로그인을 시도할 경우 There is no id 문구와 로그인 메뉴를 표현해준다.


    저장된 정보로 로그인을 시도할 경우 displayName을 세션에 저장하고 화면에 출력해준다.

    그리고 로그아웃 메뉴를 출력해준다.


    sessions 테이블을 조회해보면 data컬럼에서 쿠키 정보에 displayName 정보가 저장된다는 것을 알 수 있다.

    이로 인해 다른 요청들을 수행할 때에도 클라이언트에 저장된 데이터를 database에 저장된 데이터와 비교하여 세션을 유지할 수 있게 된다.


    로그아웃 메뉴를 누르면 로그아웃처리가 된다.

    'JavaScript > Node.js' 카테고리의 다른 글

    Process Management - PM2  (0) 2018.12.06
    암호화 - MD5, SHA256, PBKFD2  (0) 2018.12.06
    Express - Session 1  (0) 2018.12.04
    Cookie 서명  (0) 2018.12.01
    Cookie  (0) 2018.12.01
Designed by Tistory.