서버 애플리케이션의 경우 개인이 소유한 것이 아니기 때문에 모든 기기에 열려있습니다. 그러므로 함부로 접근하지 못하게 로그인이 필요하게 됩니다.
로그인은 클라이언트 프로그램과 사용자를 정확히 구별할 줄 알아야 하고 동시에 애플리케이션 최초 접속 시의 사용자 연결과 계속 사용 시의 사용자 연결의 차이를 구별할 줄 알아야합니다.
HTTTP는 비연결 대화를 구현하는 프로토콜입니다. 그러므로 요청과 응답은 1회성으로서 새로운 요청과 응답은 이전과 무관한 새로운 것이 됩니다.
로그인을 확인하기 위해 쿠키와 세션을 사용합니다.
쿠키
쿠키는 정보의 흐름이 반대로 흐릅니다. 서버가 보내고 클라이언트가 응답하는 정보입니다.
JSP에서는 서버 애플리케이션에서 쿠키를 생성후 클라이언트로 보내면 클라이언트에서는 해당 쿠키를 보관하고 있다가 다음 요청을 수행할 때 보관한 쿠키를 요청 데이터에 함께 실어 보냅니다.
| 쿠키 요소 | 설 명 |
| 이름 | 쿠키를 구별하는 식별자 |
| 값 | 쿠키값, 인코딩/디코딩에 주의 |
| 유효 시간 | 쿠키가 유지되어야 할 시간 |
| 도메인 | 쿠키를 전송할 도메인 |
| 경로 | 쿠키를 전송할 경로 |
애플리케이션은 Cookie 객체를 이용하여 생성하며 response 객체를 통해 응답 헤더에 실어 보냅니다.
<%@ page contentType = "text/html; charset=utf-8" %>
<%@ page import = "java.net.URLEncoder" %>
<%
// Cookie 클래스로 쿠키를 생성한다.
Cookie cookie = new Cookie("subject", URLEncoder.encode("자바 프로그래밍", "utf-8"));
// response 객체를 사용하여 생성한 쿠키를 브라우저에 송출한다.
response.addCookie(cookie);
%>
<html>
<head><title>쿠키 생성과 송출</title></head>
<body>
<%-- 생성한 쿠키의 이름과 값을 출력한다. --%>
<%= cookie.getName() %> 쿠키 <br/>
값 : "<%= cookie.getValue() %>"
</body>
</html>
쿠키를 생성 할 때 쿠키의 이름과 쿠키의 값을 인코딩하여 생성합니다.
마찬가지로 클라이언트는 받은 쿠키를 보관하고 있다가 다음 요청 시 요청 헤더에 쿠키를 담아 서버에게 요청합니다.
| 메서드 | 반환 타입 | 기능 |
| getName() | String | 쿠키 이름 구하기 |
| getValue() | String | 쿠키 값 구하기 |
| setValue(String) | void | 쿠키 값 지정 |
| setMaxAge(int) | void | 쿠키 유효시간을 초단위로 지정 |
쿠키는 1회성 요청인 HTTP를 연속성을 가지게 합니다.
쿠키를 삭제나 변경하기 위해서는 동일한 이름의 쿠키를 전송하게 되는데 삭제의 경우 유효시간을 0으로 지정하여 삭제하고 변경의 경우 내용을 변경하여 전송합니다. 주의할 점은 이름을 다르게 보낼경우 새로운 쿠키가 생성됩니다.
쿠키를 이용하여 로그인을 구현할 경우 애플리케이션은 최초 연결에서 사용자로부터 받은 정보를 사용하여 사용이 허락된 사용자가 맞으면 이를 인증하는 정보를 쿠키로 만들어 브라우저에게 보내고 브라우저는 이후 요청에서 항상 이 인증 정보 즉 전달 받은 쿠키를 애플리케이션에게 다시 보냄으로써 사용자 개입 없이 애플리케이션과 클라이언트만의 대화만으로 로그인을 인증할 수 있습니다.
그러나 매번 페이지 마다 이런 동작을하는 코드를 작성하는 것은 반복 코딩입니다. 그러므로 이런경우 web.xml에 필터를 사용하여 독립된 객체로 작성하여 이용합니다.
그러나 쿠키는 밖으로 노출되는 정보이기 때문에 중요한 인증 정보를 구현하지 않고 아이디 기억하기와 같은 간단한 정보를 구현할 때 많이 사용됩니다.
이를 구현 할 때는 로그인이 성공하면 사용된 ID값을 통해 쿠키를 만들어 클라이언트에게 전달하는데 이때 유효시간을 길게 지정하여 전달하여 다시 로그인을 위해 form 페이지에 접근할 때 쿠키의 ID값을 입력하여 기억하도록 만듭니다.
세션
쿠키 정보는 통신에 노출되어 보안에 취약하기 때문에 로그인 정보와 같은 중요 정보들은 세션을 이용해 작성합니다.
정보의 내용은 session 객체에 저장하고 정보를 구별하는 식별자 값만 세션id 값으로 쿠키에 담아 주고 받으면 통신에 노출되지 않고 클라이언트와 대화 연결이 가능합니다.
세션을 사용하기 위해서는 page 디렉티브에서 session 속성을 true로 지정해야하며 default값입니다.
<%@ page session = "true" %>
| 메서드 | 반환타입 | 기능 |
| getId() | String | 세션 id를 구함 |
| setAttribute(String, Object) | void | 세션에서 속성을 생성 |
| getAttribute(String) | Object | 세션에서 속성을 추출 |
| removeAttribute(String) | void | 세션에서 속성을 제거 |
| invalidate() | void | 세션을 종료 |
session은 명시적으로 inavalidate()를 통해 소멸을 시켜줘야 합니다.
새로운 요청 때마다 갱신되며 유효시간이 다되거나 invalidate()를 통해 소멸이 됩니다.
session은 영역 객체로도 사용이 되며 객체에서 사용하지 않은 속성은 removeAttribute를 통해 제거 해 주는것이 좋습니다.
'학습(구) > JSP' 카테고리의 다른 글
| 표현 언어(EL) (0) | 2020.09.16 |
|---|---|
| 오류 처리 (0) | 2020.09.10 |
| 화면 모듈화와 소스 모듈화 (0) | 2020.09.09 |
| 페이지 사이의 정보공유 (0) | 2020.09.09 |
| 기능 모듈화 (forward액션태그와 redirect) (0) | 2020.09.09 |