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가지의 문제점이 있기 때문이다.

  1. 쿠키파일에 중요한 정보가 너무 많이 들어간다. 그리고 쿠키 파일은 전송이 가능하다.
  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";
	}
})

6. 소스 코드

Board

댓글남기기