11. 세션 유지 작업
로그인 기능을 구현하기 위해서는 올바른 사용자에 대해 세션을 부여해 주어야 한다.
jsp를 사용해 세션을 만들고 유지하는 방법을 알아보자.
세션에 대해
톰캣을 사용하는 우베 프로젝트에서 브라우저는 항상 JSESSIONID라는 쿠키를 가지게 된다.
즉, 세션 자체는 항상 유지되어 있으며, 우리가 해야하는 일은 세션의 속성 값을 생성, 삭제 하며 유저의 세션 정보를 관리하는 것이다.
JSP에서의 세션 관리
그렇다면, 우리는 세션에 특정 값이 존재하는지의 여부를 확인하며 로그인이 되어있는지를 확인할 수 있다.
다음은 로그인 화면에 대한 JSP 파일이다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<body>
<div class="container">
<%
if(session.getAttribute("userIdx") != null){
%>
<p>이미 로그인이 되어있습니다.</p>
<%
}
else {
%>
로그인 페이지 입니다.
<form action="http://localhost:8080/user/login" method="post">
<p>아이디 : <input type="text" name="id"/><br></p>
<p>비밀번호 : <input type="password" name="password"/><br></p>
<input type="submit"/>
</form>
<%
}
%>
</div>
</body>
</html>
사용자의 세션을 유지시키기 위해 우리가 사용할 값은 userIdx 이다.
해당 값이 존재한다면 이미 로그인이 되어 있다고 간주하고, 그렇지 않다면 로그인을 위한 창을 표시해 준다.
다음으로, 로그인이 성공하고 나면 표시할 successLogin.jsp 파일을 작성해 주자.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<body>
<div class="container">
로그인 성공!<br>
userIdx = <%=session.getAttribute("userIdx")%>
</div>
</body>
</html>
컨트롤러
다음으로, 로그인을 위한 입력에 대한 컨트롤러 메서드를 작성하자.
@GetMapping("/login")
public String loginView(){
return viewPath + "login";
}
@PostMapping("/login")
public String login(HttpSession session) {
System.out.println("success login");
session.setAttribute("userIdx", 1);
return viewPath + "successLogin";
}
POST 요청으로 로그인 정보가 들어온다면, 적절한 userIdx 값을 세션에 넣어줄 것이다.
지금은 단순히 1의 값을 사용하였지만, 추후 service 계층을 작성한 이후에는 실제 DB에 저장되어 있는 값과 비교한 후, 해당 유저의 인덱스를 넣어 줄 것이다.
결과 확인
첫 접속에서는 로그인 창이 뜬다.
아무 값이나 입력하면 이렇게 로그인이 성공하고
다시 해당 페이지에 접속하면 로그인이 되어 있다고 뜬다.
고민
Spring을 사용할 때, 결국 세션은 JSESSIONID라는 값을 쿠키를 통해 서버에 전달하는 방식으로 사용된다.
때문에, 쿠키를 변조시켜 다른 사람의 JSESSIONID를 사용한다면 악의적인 사용자의 해킹이 가능해 질 것이라 생각했다.
(이것 또한 세션 하이재킹이라고 할 수 있나?)
그렇기 때문에, 네이버나 인프런과 같은, 어느정도 사용자가 존재하는 대규모 서비스에서는 별도의 세션 ID를 생성하고, 따로 관리를 하는 듯 하다.
그러나, 이 역시 별도의 세션 ID를 탈취할 수 있다면 해당 사용자인 것 처럼 악의적인 인가가 가능해 지기 때문에 완전히 안전한 방법은 아니라고 할 수 있다.
때문에, 인증/인가가 중요한 상황에서는 해당 사용자의 IP 주소, 브라우저 정보 등을 함께 사용해 사용자를 식별하는 것이 중요하다고 한다.