본문 바로가기
프로그래밍 놀이터/Web

Chap 09. 클라이언트와의 대화 1 : 쿠키

by 돼지왕 왕돼지 2015. 1. 11.
반응형

Chap 09. 클라이언트와의 대화 1 : 쿠키


* 쿠키 사용하기.


쿠키(Cookie)는 웹 브라우저가 보관하고 있는 데이터로서, 웹 브라우저가 웹 서버에 요청을 보낼 때 쿠키를 함께 전송한다.

쿠키는 웹 서버와 웹 브라우저 양쪽에서 생성할 수 있으며, 웹 서버는 웹 브라우저가 전송한 쿠키를 사용하여 필요한 데이터를 읽어올 수 있다.



-

쿠키의 구성


이름

유효 시간

도메인

경로



-

쿠키 생성하기


<%

Cookie cookie = new Cookie( "cookieName", "cookieValue" );

response.addCookie( cookie );

%>


Cookie 메서드


String getName()


String getValue()

setValue( String value )


setDomain( String pattern )

String getDomain()


setPath( String uri )

String getPath()


setMaxAge( int expiry ) // 초 단위, 음수를 입력할 경우 웹 브라우저를 닫을 때 쿠키를 삭제한다.

int getMaxAge()



-

쿠키 값 읽어오기.


Cookie[] cookies = request.getCookies();



-

쿠키 값 변경 및 쿠키 삭제하기


쿠키 값 변경은 같은 이름의 쿠키를 새로 생성해서 응답 데이터로 보내주면 된다.


쿠키값의 삭제는 setMaxAge( 0 ) 을 호출해주면 된다. 쿠키를 삭제하는 기능이 별도로 있지는 않다.



-

쿠키의 도메인


기본적으로 쿠키는 그 쿠키를 생성한 서버에만 전송된다.

예를 들어 http://www.naver.com 에 연결해서 생성된 쿠키는 다른 사이트로 연결할 떄에는 전송되지 않는다.

오직 http://www.naver.com 에 연결할 때만 생성된다.


만약 www.naver.com 뿐만 아니라, mail.naver.com, blog.naver.com 에도 같은 쿠키를 전송하고 싶다면 setDomain() 을 이용해야 한다.


setDomain() 에는 두 가지 형태가 올 수 있다.


1. .naver.com : .으로 시작하여 관련 도메인에 모두 쿠키를 전송한다.

2. www.naver.com : 특정 도메인에만 쿠키를 전송한다.


setDomain 을 통해 domain 을 지정할 때 현재 서버 도메인 및 상위 도메인만 전달할 수 있다.

예를 들어 www.naver.com 에서 생성하는 쿠키는, domain 값으로 .naver.com 과 www.naver.com 만 올 수 있다.







-

쿠키의 경로


쿠키는 도메인 뿐만 아니라 setPath() 를 통해 경로를 지정할 수도 있다.



-

쿠키의 유효 시간


쿠키의 유효시간을 지정하지 않은 경우 웹 브라우저를 닫으면 쿠키는 자동으로 삭제된다.

아이디 기억하기 기능의 구현은 이 유효시간을 이용해서 하곤 한다.



-

쿠키와 헤더


response.addCookie() 로 추가되는 쿠키는 실제로 Set-Cookie 헤더를 통해 전달된다.


쿠키이름=쿠키값; Domain=도메인; Path=경로값; Expires=GMT형식의 만료 일시




* 쿠키 처리를 위한 유틸리티 클래스


public class CookieUtils{

private Map<String, Cookie> cookieMap = new HashMap<String, Cookie>();


public CookieUtils( HttpServletRequest request ){

Cookie[] cookies = request.getCookies();

if ( cookies != null ){

for( Cookie cookie : cookies ){

cookieMap.put( cookie.getName(), cookie );

}

}

}


public static Cookie createCookie( String name, String value ) throws IOException{

return new Cookie( name, URLEncoder.encode( value, "euc-kr" );

}


public static Cookie createCookie( String name, String value, String path, int maxAge ) throws IOException{

Cookie cookie = createCookie( name, value );

cookie.setPath( path );

cookie.setMaxAge( maxAge );

return cookie;

}


public static Cookie createCookie( String name, String value, String domain, String path, int maxAge ) throws IOException{

Cookie cookie = createCookie( name, value, path, maxAge );

cookie.setDomain( domain );

return cookie;

}


public Cookie getCookir( String name ){

return cookieMap.get( name );

}


public String getValue( Stirng name ) throws IOException{

Cookie cookie = cookieMap.get( name );

if ( cookie == null ) return null;

return URLDecoder.decode( cookie.getValue(), "euc-kr" );

}


public boolean exists( String name ){

return cookieMap.get( name ) != null;

}

}




* 쿠키를 사용한 로그인 유지


1. 로그인 하면 관련 쿠키 생성

2. 관련 쿠키가 존재하면 로그인한 상태라고 판단

3. 로그아웃을 하면 관련 쿠기를 삭제.


로그인 성공시 생성하는 쿠키는 ID 값을 암호화해서 보관하곤 한다.

암호화 하지 않을 경우 쿠키값을 위변조해서 원하는 계정으로 웹 사이트를 사용할 수 있어 보안 허점이 생긴다.




* 로그아웃 처리.


간단히 login 관련 쿠키는 setAge( 0 ) 을 통해 제거해주면 된다.








반응형

댓글