3 분 소요

  • 웹 서버 만들기 (1) ~ (6) 과정을 통해 웹서버와 DB서버 구현을 완료하였다.
  • 웹 서버에서 db에 저장된 데이터를 가져오는 방법도 알아보았다.

로그인 구현


로그인 인증 구조




유저정보를 저장 하기 위한 DB 특징

  • 유저의 정보를 저장하기 위해서 오라클DB 에서 USERS 테이블을 만들어 주었다.

    컬럼명 데이터 타입 조건
    sid NUMBER(20) PRIMARY KEY
    username NVARCHAR2(32)  
    email NVARCHAR2(100)  
    salt VARCHAR2(30)  
    password VARCHAR2(150)  
    gen_time NUMBER(20)  
    modifi_time NUMBER(20)  
    algorithm VARCHAR2(32)  
    authority CHAR(1) ‘0’ 또는 ‘1’ 만 올수 있다.
  • 일단 로그인을 위한 루트계정을 만들어 주었다.
  • 패스워드를 바로 USERS 테이블에 저장하는 것이아닌 해시계산한 값이 저장된다.
    즉 패스워드 부분에는 HASH(SALT + 유저비번) 값이 저장된다.
  • gen_time 생성시각을 나타낸다.
  • modifi_time 수정시각을 나타낸다.
  • algorithm 은 어떤 해시함수를 사용하였는지 표시해 준다.(ex- SHA512 등… )
  • authority 는 유저가 관리자 권한을 가지는지 나타낸다.



DB 를 관리하기 위한 클래스

  • UsersDAO 를 통해 데이터베이스와 연결하고 저장되어있는 유저정보를 불러올 수 있다.
  • DB 서버에 있는 정보를 보다 쉽게 읽어올 수 있다.
  • USERS 테이블에서 읽어온 유저정보는 User 클래스에 저장하여 보다 쉽게 데이터를 읽을 수 있게 하였다.



로그인 페이지 접속

  1. 로그인을 하기 위한 url은 http://주소/sign_in_page 로 설정 하였다.
  2. MYWEB/ROOT/WEB-INF/web.xml 의 파일에서 /sign_in_page uri 가 어떤 클래스로 이어져야 설정하였다.
    /sign_in_page uri로 요청이 들어오면 com.mingyu2.login.Login 클래스로 요청을 전달받을 수 있다.
  3. 아이디와 패스워드 입력을 받기 위한 페이지를 만들어준다. MYWEB/ROOT/WEB-INF/sign_in_page/sing_in_page.jsp 를 만들어 주었다. 그리고 이 페이지를 http://주소/sign_in_page 로 접속 하였을 때 보여줄 것이다.
  4. web.xml 에서 설정한 것 처럼 Login 클래스에서 클라이언트의 요청을 받는다.
    만약 클라이언트 요청에서 받은 session id 값이 존재하는 것이면 로그인 페이지에서 바로 메인페이지로 넘어간다.
    session id 값이 존재 안한다면 sing_in_page.jsp 페이지를 클라이언트에게 보여준다.
  5. /sign_in_page uri 로 요청이 들어오면 /WEB-INF/sign_in_page/sign_in_page.jsp 으로 포워드되게 하였다.
    Pasted image 20230414021004
  6. 즉 첫 로그인이거나 세션이 만료된 상태에서 http://주소/sign_in_page url 로 접속하면 로그인 페이지를 보여준다.
  7. 아이디와 비번을 입력하고 sign in 버튼을 눌러주면 POST 방식으로 아이디와 비밀번호를 http://주소/sign_in_page/authentication 로 전송한다.



로그인 인증

  • /sign_in_page/authentication
  1. 먼저 세션 키가 존재하는지 확인하자. 존재하면 바로 메인페이지로 이동한다.
  2. post를 통해 요청이 들어오면 먼저 아이디와 비밀번호를 확인한다.
  3. LoginAuthentication클래스의 인스턴스를 만들어준다. 인증 클래스의 userAuthenticatoin 함수에 유저 이름과 패스워드를 전송해준다.
  4. 인증이 성공하면 User 정보를 얻을 수 있다. 하지만 인증에 실패하면 null 값을 받게된다.
  5. 즉 null 값을 받아 로그인에 실패하면 /sign_in_page 다시 로그인 페이지로 리다이렉트 요청을 한다.
  6. User 정보를 받으면 로그인에 성공했다는 것이다. 따라서 User 오브젝트를 세션에 저장하여 준다. 세션 정보는 session id를 통해 가져올 수 있다.
  7. 확인해 보니 session id는 자동으로 쿠키에 저장 된다.
  8. 로그인에 성공하고 session id 도 생성되었다. 마지막으로 메인 페이지로 리다이렉션 해준다.



비밀번호 인증 과정(LoginAuthentication 클래스)

  1. Users 테이블에 존재하는 유저인지 확인한다.
  2. 존재하는 아이디면 salt 와 암호 알고리즘 유형을 가지고 온다.
  3. salt 와 입력받은 password 를 합치고 알고리즘 유형에 따라 HASH 암호화를 진행한다.
  4. 이렇게 새로 만들어진 해시 암호문db에 저장된 해시 암호문을 비교한다.
  5. 암호문들이 서로 동일하면 로그인에 성공하여 User 정보를 리턴해 준다.




Main 페이지


  • 로그인에 성공하거나 session id 가 만료되기 전에 들어갈 수 있는 메인 화면이다.
  • 현재 로그인 된 유저 정보를 확인할 수 있다.

메인페이지 접속

  1. http://주소/main_page 주소를 통해 메인 페이지에 접속을 한다.
  2. MYWEB/ROOT/WEB-INF/web.xml 안에 /main_page uri 요청이 왔을 때 연결해줘야 하는 클래스를 적어주었다.
  3. MainPage 클래스에서 /main_page uri 요청을 처리해 준다.
  4. main_page 로 요청이 들어오게 되면 먼저 session id가 존재하는지 확인한다.
  5. 만약 session id가 존재하지 않는다면 로그인페이지로 리다이렉션 해준다. (sign_in_page)
  6. 로그인에 성공한다면 관리자 권한을 가진 유저인지 확인을 한다. 관리자 권한을 가진 유저라면 /main_page_root.jsp 로 포워딩하고, 아니면 /main_page.jsp 페이지로 포워딩한다.
    happyhacking



jsp 메인 페이지

  • 여기서 main_page_root.jspmain_page.page 구조는 동일하다.
  • 메인페이지(MYWEB/ROOT/WEB-INF/sign_in_page/main_page.jsp)
  • 메인페이지(MYWEB/ROOT/WEB-INF/sign_in_page/main_page_root.jsp)


happyhacking




로그아웃 기능


  • 로그아웃을 하면 기존에 사용하던 session id 값을 지워준다.
  • 로그인 상태서만 로그아웃 버튼을 누를 수 있다.
  • 로그아웃 버튼을 누루면 /user-logout uri 로 로그아웃 요청을 한다.
  • web.xml 을 살펴보면 /user-logout uri로 요청이 들어왔을 때 com.mingyu2.login.Logout 클래스로 연결해야하는 것을 볼 수 있다
  • 로그아웃 동작 방식 및 코드



URL 와 URI 차이


URL

  • http://localhost/login_page/authentication : 프로토콜 유형을 포함한 완전한 사이트 경로를 말한다.

URI

  • /login_page/authentication : 주소 다음의 경로를 의미한다.



Oracle DB 와 MYSQL


참고 사이트


댓글남기기