자바(JAVA)기반 안드로이드 웹&앱 개발 58일차(쿠키, 세션, 자바빈(Java Bean), 표현언어(EL))
[쿠키]
1. HTTP(Hyper Text Fransfer Protocol) 통신 방식
1) HTML 문서의 송수신을 위해 사용되는 프로토콜
2) 비연결(connectionless) 지향형 통신 프로토콜
HTTP 통신방식 그림
2. 무상태(stateless) 서버
1) 이전에 전송한 정보를 전혀 기어갛지 못함
2) 현재 상태를 그대로 유지하지 못함
3) 장점 : 서버의 자원 낭비를 최소화 할 수 있음 -> 웹 서비스의 성장 요인
4) 단점 : 장바구니 저장 정보 유지 필요성, 쇼핑몰 방문 이력에 대한 저장 필요성
3. 쿠키의 필요성 (1,2번은 3번을 위한 시퀀스 같습니다.)
1) 장바구니에 담은 물건은 다른 페이지에 접속을 하더라도 유지하여야 함
2) 웹 서버에 저장하고 관리할 수 있지만, 서버의 부하를 높여 웹 서비스의 속도를 느리게 하는 원인이 될 수 있음
(1) 장바구니에 담은 모든 접속자에 대하여 서버에 저장해야 함(비회원 포함)
(2) 클라이언트에 저장하면 서버의 부담을 덜 수 있음
3) 쿠키 (Cookie)
(1) 사용자의 정보를 지속적으로 유지하기 위한 방법으로 사용
(2) 클라이언트에 정보를 저장하기 때문에 서버의 부하를 줄일 수 있음
(3) 서버에서 쿠키를 생성하고 클라이언트에 전송하여 저장
(4) 클라이언트는 쿠키를 서버로 전송하고 서버는 이를 이용하여 처리
(5) 크기는 4KB 이하로 제한되며, 300개까지 저장 가능 (1.2MB)
(6) 오래된 정보는 자동으로 삭제
(7) 이미지 정보는 경로만 저장
쿠키의 사용 방법
4. 쿠키의 구성
1) 구성 요소
(1) 이름 : 각각의 쿠키를 구별하는데 사용되는 이름
(2) 값 : 쿠키의 이름과 관련된 값
(3) 유효시간 : 쿠키의 유지시간
(4) 도메인 : 쿠키를 전송할 도메인
(5) 경로 : 쿠키를 전송할 요청 경로
2) 쿠키 이름의 제약
(1) 아스키 코드의 알파벳과 숫자
(2) 콤마(,) , 세미콜론(;), 공백('') 등의 문자는 안됨
(3) '$'로 시작할 수 없음
5. 쿠키 생성/읽기
1) Cookie 클래스를 이용해서 쿠키 생성
<% Cookie cookie = new Cookie("cookieName", "cookieValue");
response.addCookie(cookie); %>
2) 클라이언트가 보낸 쿠키 읽기
Cookie[] cookies = request.getCookies();
3) 읽기 관련 주요 메소드
메소드 | 리턴 타입 | 설명 |
getName() | String | 쿠키의 이름을 구한다 |
getValue() | String | 쿠키의 값을 구한다 |
쿠키 생성
쿠키 정보 읽기
6. 쿠키 값의 인코딩/디코딩 처리
1) 쿠키는 값으로 한글과 같은 문자를 가질 수 없음
(1) 쿠키의 값을 인코딩해서 지정할 필요 있음
2) 쿠키 값의 처리
(1) 값 설정 시 : URLEncoder.encode("값", "utf-8")
예 : new Cookie("name", URLEncoder.encode("값", "utf-8");
(2) 값 조회 시 : URLDecoder.decode("값", "utf-8")
예 : String value = URLDecoder.decode(cookie.getValue(), "utf-8");
7. 쿠키 값 변경
1) 기존에 존재하는지 확인 후 쿠키 값 새로 설정
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0) {
for(int i = 0; i < cookies.length; i++) {
if(cookies[i].getName().equals("name")) {
Cookie cookie = new Cookie(name, value);
response.addCookie(cookie);
}
}
}
2) 쿠키의 삭제
Cookie cookie = new Cookie(name, value);
cookie.setMaxAge(0); // 0= 만료시간
response.addCookie(cookie);
쿠키삭제 1
쿠키삭제 2, id 쿠키가 사라짐.
8. 쿠키의 도메인과 경로
1) 도메인의 지정 시, 해당 도메인에 쿠키 전달
(1) Cookie.setDomain() 으로 쿠키 설정
(2) 도메인 형식
.madvirus.net : 점으로 시작하는 경우 관련 도메인에 모두 쿠키를 전송 (상위도메인임)
www.madvirus.net : 특정 도메인에 대해서만 쿠키를 전송
2) 웹 브라우저는 도메인이 벗어난 쿠키는 저장하지 않음
3) 쿠키 도메인에 따라 쿠키가 전달
4) 경로 설정 시 해당 경로를 기준으로 쿠키 전달
(1) 경로 미 설정 시, 요청 URL의 경로에 대해서만 쿠키 전달
(2) 경로 설정 시, 설정한 경로 및 그 하위 경로에 대해서 쿠키 전달
(3) Cookie.setPath() 로 경로 설정
5) 유효시간
(1) 유효 시간 미 지정시, 웹 브라우저 닫을 때 쿠키도 함께 삭제
(2) Cookie.setMaxAge() 로 쿠키 유효시간 설정
ㄱ) 유효시간이 지나지 않을 경우 웹 브라우저를 닫더라도 쿠키가 삭제되지 않고, 이후 웹 브라우저를
열었을 때 해당 쿠키 전송됨
ㄴ) 유효시간 : 초 단위로 설정
9. 쿠키와 헤더
쿠키와 헤더
[세션]
1. 쿠키의 단점
1) 보안에 취약 : PC의 저장된 위치를 검색하면 정보를 알 수 있음 (PC방)
2) 저장할 수 있는 데이터의 크기 한계 : 1.2MB
3) 대안 중 하나 : 세션
2. 세션의 장점
1) 서버에서만 접근이 가능하므로 보안에 강함
2) 저장할 수 있는 데이터의 크기에 한계가 없음
3. 세션
1) 서버상에 존재하는 객체로서 브라우저 단위 당 한 개씩 존재
2) 브라우저를 닫기 전까지 (세션이 종료 되기 전까지) 페이지를 이동하더라도 사용자 정보는 유지 ( 예: 로그인)
로그인을 통해 해당 페이지의 사용 권한을 부여
로그인이 성공하면 세션에 정보를 추가하고 이를 활용하여 진행
브라우저당 세션 정보를 유지 (브라우저를 새로 띄우면 또 다시 로그인이 필요)
4. Session에서 자주 사용하는 메소드
메소드 | 설명 |
Object getAttribute(String name) | 이름에 해당되는 객체 값을 가져온다. 없을 경우 null 반환 |
Enumeration getAttributeNames() | 모든 객체의 이름을 Enumeration 형태로 반환 |
long getCreationTime() | 세션이 만들어진 시간을 반환 |
String getId() | 해당 세션을 가리키는 고유 id 값을 String 형태로 변환 |
long getLastAccessedTime() | 해당 세션으로 마지막 request 를 보낸 시간 |
int getMaxInactiveInterval() | 세션을 유지하는 시간(접속을 하지 않고 이 시간이 지나면 세션이 삭제됨) - 초 단위 |
boolean isNew() | true : 세션이 처음 생성되었을 때 false : 이전에 생성된 세션 |
void removeAttribute(String name) | 지정된 이름에 해당하는 객체를 세션에서 제거 |
void setAttribute (String name, Object value) |
세션에 지정된 이름으로 객체를 추가 |
void setMaxInactiveInterval(int interval) | 세션 유지시간을 설정 (초 단위) |
void invalidate() | 해당 세션을 없애고 세션에 속해있는 값을 없앤다. |
5. 세션에 값 설정하기
세션 설정
설정한 세션 값 얻어오기
모든 설정된 세션 값 얻어오기
6. 세션 유효시간 설정(default 값)
1) tomcat
(1) config 폴더의 web.xml 에 정의됨
2) Eclipse
(1) Servers 밑의 web.xml 에 정의됨
(2) tomcat 에 정의된 것을 복사해서 사용
브라우저를 종료하지 않고 jsp를 다시 실행하였기에, 새로운 세션을 만들지 않았다.
s_name2가 삭제된 것을 확인할 수 있다. id, pwd, age 세션이 남은 것은 브라우저를 종료하지 않았기 때문이다.
모든 세션이 삭제된 것을 확인할 수 잇다. session.invalidate();
7. 세션을 이용한 로그인처리
1. 파일구성
1) 10_loginForm.jsp // 로그인 폼 화면
2) 10_testLogin.jsp // 로그인 처리 jsp
3) 10_main.jsp // 메인 페이지( 로그인 후 서비스)
4) 10_logout.jsp // 로그아웃을 수행하는 페이지
로그인 폼 화면
아이디(pinksung), pwd(1234)가 아닐경우 10_loginForm.jsp(로그인 폼 화면)으로 돌려보낸다.(Redirect)
아이디(pinksung), pwd(1234)가 맞을 경우, 10_main.jsp 화면으로 보낸다.(Redirect)
loginUser의 세션정보를 가져온다.
세션을 지우고, alert 로 로그아웃 안내메시지를 띄운다. 그리고 로그인 폼 화면으로 돌려보낸다.
[자바빈(Java Bean)과 액션 태그]
1. 자바 빈(Java Bean)
1) 단순히 데이터를 저장할 목적으로 사용한 클래스
2) private 접근 제한자를 가지는 필드가 있고, 그에 대한 getter와 setter가 있음.(예, 회원정보 저장 자바빈)
2. 자바 빈 관련 액션 태그
액션 태그의 종류 | 설명 |
<jsp:useBean> | 자바 빈을 생성합니다. |
<jsp:getProperty> | 자바 빈에서 정보를 얻어옵니다. |
<jsp:setProperty> | 자바 빈에 정보를 저장합니다. |
3. 자바빈 객체를 생성하는 <jsp:useBean> 액션 태그
1) 기본형식
<jsp:useBean class="클래스 전체 이름" id="빈 이름" [scope="범위"] />
(1) class 속성 : 패키지명을 포함한 클래스 이름
(2) id : 참조변수로 사용되는 값(속성의 이름)
(3) scope : 객체의 존재 기간(page, request, session, application) / default : page
MemberBean 생성
useBean
4. <jsp:setProperty> 액션태그
1) 자바 빈 객체 필드에 새로운 값을 설정
2) 사용방법
<jsp:setProperty name="자바빈이름" property="프로퍼티이름" value="값"/>
3) 대응되는 표현식
<% 자바빈이름.set프로퍼티이름("값"); %>
4) 사용 예
<jsp:setProperty name="member" property="name" value="홍길동" />
<% member.setName("홍길동"); %> 에 대응
5. <jsp:getProperty> 액션태그
1) 자바 빈에서 정보를 얻는 액션 태그
2) 사용 방법
<jsp:getProperty name="자바빈id" property="필드명" />
3) 대응되는 표현식
<%= member.getName() %>
4) JSP 에서는 자바를 사용한 표현식 보다는 태그 형태의 액션 태그를 사용하는 것이 가독성이 높다.
setProperty, getProperty
6. 자바 빈으로 회원정보 처리하기
회원정보 입력폼
회원정보 가져오는 화면
[표현언어(Expression Language)로 표현 단순화하기
1. 표현 언어(Expression Language) : <%= expr %>
1) 값(데이터)을 웹 페이지에 표시(표현)하는데 사용되는 태그
2. EL(Expression Language) : ${expr}
1) JSP 출력에대한 부분을 쉽게 하기 위해 개발한 태그
[EL 식 연산자]
종류 | 연산자 |
산술 | +, -, *, / (or div), % (or mod) |
관계형 | == (or eq), != (or ne), < (or It), > (or gt), <= (or le), >= (or ge) |
조건 | a ? b : c |
논리 | &&(or and), || (or or), ! (or not) |
null 검사 | empty |