웹서버 만들기 7
- 웹 서버 만들기 (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 클래스에 저장하여 보다 쉽게 데이터를 읽을 수 있게 하였다.
로그인 페이지 접속
- 로그인을 하기 위한 url은
http://주소/sign_in_page
로 설정 하였다. MYWEB/ROOT/WEB-INF/web.xml
의 파일에서/sign_in_page
uri 가 어떤 클래스로 이어져야 설정하였다.
즉/sign_in_page
uri로 요청이 들어오면com.mingyu2.login.Login
클래스로 요청을 전달받을 수 있다.- 아이디와 패스워드 입력을 받기 위한 페이지를 만들어준다.
MYWEB/ROOT/WEB-INF/sign_in_page/sing_in_page.jsp
를 만들어 주었다. 그리고 이 페이지를http://주소/sign_in_page
로 접속 하였을 때 보여줄 것이다. web.xml
에서 설정한 것 처럼Login
클래스에서 클라이언트의 요청을 받는다.
만약 클라이언트 요청에서 받은 session id 값이 존재하는 것이면 로그인 페이지에서 바로 메인페이지로 넘어간다.
session id 값이 존재 안한다면sing_in_page.jsp
페이지를 클라이언트에게 보여준다./sign_in_page
uri 로 요청이 들어오면/WEB-INF/sign_in_page/sign_in_page.jsp
으로 포워드되게 하였다.- 즉 첫 로그인이거나 세션이 만료된 상태에서
http://주소/sign_in_page
url 로 접속하면 로그인 페이지를 보여준다. - 아이디와 비번을 입력하고
sign in
버튼을 눌러주면POST
방식으로 아이디와 비밀번호를http://주소/sign_in_page/authentication
로 전송한다.
로그인 인증
/sign_in_page/authentication
- 먼저 세션 키가 존재하는지 확인하자. 존재하면 바로 메인페이지로 이동한다.
- post를 통해 요청이 들어오면 먼저 아이디와 비밀번호를 확인한다.
LoginAuthentication
클래스의 인스턴스를 만들어준다. 인증 클래스의userAuthenticatoin
함수에 유저 이름과 패스워드를 전송해준다.- 인증이 성공하면
User
정보를 얻을 수 있다. 하지만 인증에 실패하면null
값을 받게된다. - 즉 null 값을 받아 로그인에 실패하면
/sign_in_page
다시 로그인 페이지로 리다이렉트 요청을 한다. User
정보를 받으면 로그인에 성공했다는 것이다. 따라서User
오브젝트를 세션에 저장하여 준다. 세션 정보는 session id를 통해 가져올 수 있다.- 확인해 보니 session id는 자동으로 쿠키에 저장 된다.
- 로그인에 성공하고 session id 도 생성되었다. 마지막으로 메인 페이지로 리다이렉션 해준다.
비밀번호 인증 과정(LoginAuthentication
클래스)
Users
테이블에 존재하는 유저인지 확인한다.- 존재하는 아이디면 salt 와 암호 알고리즘 유형을 가지고 온다.
- salt 와 입력받은 password 를 합치고 알고리즘 유형에 따라 HASH 암호화를 진행한다.
- 이렇게 새로 만들어진 해시 암호문과 db에 저장된 해시 암호문을 비교한다.
- 암호문들이 서로 동일하면 로그인에 성공하여 User 정보를 리턴해 준다.
Main 페이지
- 로그인에 성공하거나
session id
가 만료되기 전에 들어갈 수 있는 메인 화면이다. - 현재 로그인 된 유저 정보를 확인할 수 있다.
메인페이지 접속
http://주소/main_page
주소를 통해 메인 페이지에 접속을 한다.MYWEB/ROOT/WEB-INF/web.xml
안에/main_page
uri 요청이 왔을 때 연결해줘야 하는 클래스를 적어주었다.MainPage
클래스에서/main_page
uri 요청을 처리해 준다.main_page
로 요청이 들어오게 되면 먼저 session id가 존재하는지 확인한다.- 만약 session id가 존재하지 않는다면 로그인페이지로 리다이렉션 해준다. (
sign_in_page
) - 로그인에 성공한다면 관리자 권한을 가진 유저인지 확인을 한다. 관리자 권한을 가진 유저라면
/main_page_root.jsp
로 포워딩하고, 아니면/main_page.jsp
페이지로 포워딩한다.
jsp 메인 페이지
- 여기서
main_page_root.jsp
나main_page.page
구조는 동일하다. - 메인페이지(
MYWEB/ROOT/WEB-INF/sign_in_page/main_page.jsp
) - 메인페이지(
MYWEB/ROOT/WEB-INF/sign_in_page/main_page_root.jsp
)
로그아웃 기능
- 로그아웃을 하면 기존에 사용하던
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
- 서로 타입이 서로 달라 테이블을 만들때 힘들었다.
- MYSQL 데이터 타입 종류
- 오라클에 Boolean형 자료형 저장하기
- 오라클 EXISTS 활용 예제
- Oracle Dual 테이블이란?
- Oracle과 MSSQL 데이터 타입 비교
참고 사이트
- 사이트에서 쿠키(Cookie) 확인하기 (tistory.com)
- DB 비밀번호를 암호화하여 안전하게 저장하기 (velog.io)
- How to send data from Java Servlet to JSP (initialcommit.com)
- 회원 가입 및 로그인을 위한 테이블 설계 - RastaLion’s IT Blog
- JSP & Servlet :: 서블릿 오라클DB연동
- 회원 정보 테이블 설계 시 고려 사항 (ip.or.kr)
- 자바 비밀번호 암호화 (SHA256,SHA512) + Salt (tistory.com)
- Java Random보단 SecureRandom 를 사용하자.
- Java Security Standard Algorithm Names (oracle.com)
- java Base64 인코딩 : 네이버 블로그 (naver.com)
- Java Servlet session이란? :: choice blog (tistory.com)
- varchar와 nvarchar의 차이 (tistory.com)
- setAttribute(),getAttribute(),sendRedirect(),getRequestDispatcher()
- Web - cookie 와 session 분석 (servlet 예제) (tistory.com)
- java - Getting cookie in servlet - Stack Overflow
- Servlet Http Session (velog.io)
- 로그인,로그아웃 Session & 로그인 버튼 → 로그아웃 버튼 (tistory.com)
댓글남기기