JAVA 웹개발 과정 국비 57일차 정리
57일차
※ 배우는 과정이므로 정확하지 않을 수 있습니다.
잘못된 점은 알려주시면 수정하도록 하겠습니다!
1. 게시판 만들기 이어서..
1) 로그인 기능 구현
- ID와 PW가 DB 정보와 일치하면 true, 아니면 false
- dao에
isLoginAllowed
메소드 구현
단순히 일치 여부를 확인하는 기능은 어렵지 않았다.
2) 로그인 증명 발급
- 로그인에 성공했을 경우, 세션에 로그인 성공한 id값을 넘겨준다.
index.jsp
로 돌아간다.
세션은 이미 만들어져있기 때문에 new를 해서 생성을 하지 않아도 된다.
서버쪽 세션 금고에 setAttribute
를 이용하여 동일하게 key와 value값을 넘기면 세션에 저장된다.
response.sendRedirect
를 이용하여 index.jsp
로 돌아간다.
3) 로그인 된 index 페이지 생성
- 로그인에 성공했다면
index.jsp
에 로그인 전용 화면을 출력한다. - 로그인하지 않았다면 기존
index.jsp
페이지를 출력한다.
4) 로그아웃 기능 구현
- 로그아웃 버튼을 누르면 세션에 있는 로그인 정보를 없앤다.
어려웠던 점 ①
index.jsp
에서 choose, when, otherwise를 사용했는데 when태그 사이에 <script>를 사용하면 잘 동작하는데 when태그가 끝나고 <script>를 사용하면 500 에러가 뜬다. 일단 when 태그 사이에 <script>를 넣어서 에러는 해결했는데, 이유는 모르겠다. 이것도 강사님께 여쭤보고 정리해놓아야겠다.
<c:when test="${loginID != null}">
<table border=1 align=center>
<tr>
<th colspan=4>${loginID }님안녕하세요.
</tr>
<tr>
<td><button>To Board</button>
<td><button>MyPage</button>
<td><button id="logout">logout</button>
<td><button>Leave</button>
</tr>
</table>
<script>
$("#logout").on("click",function(){
if(confirm("정말 로그아웃하시겠습니까?")){
location.href="/logout.mem";
}
})
</script>
</c:when>
<!-- 이부분에 <script> 코드를 적용시키면 500 에러가 난다. -->
5) 회원탈퇴 기능 구현
- DB에서 회원정보 삭제
delete
메소드 구현- 세션에서 로그인한 회원의 모든 정보 삭제 (
invalidate
사용) - 메인 페이지로 복귀 (
forward
보다는sendRedirect
가 더 어울린다)
2. 로그인 방법
ID와 PW가 일치하다는 결과를 받아서 로그인에 성공했습니다! 라는 문구만 띄워주는 것은 사실상 아무런 기능을 하지 못한다.
로그인의 주 목적은 내가 이 사이트에 접속해서 나라는 것을 인증했다라는 사실을 모든 페이지에서 다 확인할 수 있게 하는 것이다.
그렇게함으로써 로그인한 사용자가 어떤 페이지를 이동하더라도 문제가 없어야 한다.
어떻게 모든 페이지에서 확인이 가능하게 만들어야할까?
1) 클래식한 방법
Cookie
를 이용하는 방법이다.
로그인 증명을 쿠키 형태로 발급해주는 것인데, 클라이언트는 이 쿠키를 파일로 만들어서 가지고 있는다.
이 방법이 잘 쓰이지 않는 것은 2가지의 문제점이 있기 때문이다.
- 쿠키파일에 중요한 정보가 너무 많이 들어간다. 그리고 쿠키 파일은 전송이 가능하다.
- 보안성이 너무 떨어진다. 다른 사람이 쿠키 파일을 다른 계정 request에 넣으면 문제없이 로그인이 가능하다. 즉, 탈취가 가능하다.
이러한 문제점으로 인해, 쿠키 하이재킹 해킹 방법도 생길 정도로 보안성이 취약하다는 큰 단점이 있어서 최근에는 쿠키를 장바구니, 아이디 기억하기 등의 노출되어도 상관 없는 정보를 보관하는 정도로만 사용하게 되었다.
2) 상대적으로 1번보다 최신 방법
최신식 방법이라고 말하기는 좀 그렇지만, 1번보다 보안성이 업그레이드 된 방법으로 사용된다.
서버의 저장소(Session)에 금고를 두고 클라이언트의 로그인 정보를 저장 후 Key값을 생성하여 클라이언트에게 Key값을 보낸다.
Key값은 사용자의 브라우저의 변수(RAM)에 보관한다. 파일을 훔치는 것보다 RAM에 있는 정보를 탈취하는 것이 난이도가 훨씬 높기 때문에 보안성이 향상된다.
세션이 꼭 로그인만을 위해 존재하는 것은 아니다. 세션으로 장바구니 기능을 구현하는 것도 가능하다. 클라이언트는 사이트에 들어가자마자 key값을 브라우저당 1개 받게 되는데, 크롬브라우저로 네이버를 로그인했을 때 엣지로 네이버를 들어가면 로그인이 풀려있는 것이 바로 그 예이다.
3. Session과 request의 차이점
가장 큰 차이점은 생존주기(라이프사이클)이다.
1) request 사용
request.setAttribute("loginID", id);
request.getRequestDispatcher("/index.jsp").forward(request,response);
index.jsp
로 넘어가면 loginID는 더이상 사용 불가능하다.
즉, 페이지는 이동되어 로그인 된 것처럼 보이지만 다른 페이지로 넘어갈 때 로그인 증명이 더이상 되지 않는다.
Request 객체는 클라이언트로부터 생성되어 서버에 전달된 후, forward되는 영역까지만 request 인스턴스가 생존한다.
2) session 사용
HttpSession session = request.getSession();
session.setAttribute("loginID", id);
response.sendRedirect("/index.jsp");
어느 페이지로 이동해도 loginID값은 남아있다.
세션은 서버가 가동된 이후로부터 메모리에 계속 유지되는 금고와 같은 것(=public static)이다.
Session 객체는 톰캣이 가동되는 순간부터 생성되어, 톰캣이 종료되는 순간까지 생존한다.
4. 세션에서 값 삭제하기
1) invalidate(무효화)
접속한 사용자의 key값으로 저장되어 있는 모든 내용을 전부 삭제한다.
회원 탈퇴 기능 등을 구현할 때 사용한다.
request.getSession().invalidate();
2) removeAttribute
특정 정보만 지우고 싶을 때 사용한다.
request.getSession().removeAttribute("loginID");
5. JS에서 페이지 이동하기
location.href="url주소";
$("#logout").on("click",function(){
if(confirm("정말 로그아웃 하시겠습니까?")){
location.href="/logout.mem";
}
})
댓글남기기