개요
HTTP 프로토콜은 서버-클라이언트 통신 시 stateless 방식으로 통신합니다. 즉, 브라우저에서 새 웹 페이지를 열면 기존의 웹 페이지나 서블릿에 관한 어떤 연결 정보도 새 웹 페이지에서는 알 수 없습니다. 따라서 웹 페이지나 서블릿끼리 상태나 정보를 공유하려면 웹 페이지 연결 기능, 즉 세션 트래킹을 이용해야 합니다.
웹 페이지를 연동하는 방법은 다음과 같습니다.
- <hidden> 태그 : HTML의 <hidden> 태그를 이용해 웹 페이지들 사이의 정보를 공유합니다.
- URL Rewriting : GET 방식으로 URL 뒤에 정보를 붙여서 다른 페이지로 전송합니다.
- 쿠키 : 클라이언트 PC의 Cookie 파일에 정보를 저장한 후 웹 페이지들이 공유합니다.
- 세션 : 서버 메모리에 정보를 저장한 후 웹 페이지들이 공유합니다.
이 중 쿠키와 세션에 대해서 한번 알아보겠습니다.
쿠키(Cookie)
쿠키(Cookie)란 웹 페이지들 사이의 공유 정보를 클라이언트 PC에 저장해 놓고 필요할 때 여러 웹 페이지들이 공유해서 사용할 수 있도록 매개 역할을 하는 방법입니다. 쿠키는 클라이언트 PC에 정보를 저장해서 사용하므로 보안에 취약합니다. 따라서 쿠키를 이용한 방법은 주로 보안과 무관한 경우에 한해 사용합니다. (예) "오늘은 더 이상 보지 않기 체크"
쿠키의 특징
- 정보가 클라이언트 PC에 저장됩니다.
- 저장 정보 용량에 제한이 있습니다. (파일 용량은 4kb)
- 보안이 취약합니다.
- 클라이언트 브라우저에서 사용 유무를 설정할 수 있습니다.
- 도메인당 쿠키가 만들어집니다. (웹 사이트 하나당 하나의 쿠키가 만들어짐)
쿠키의 종류
속성 | Persistence 쿠키 | Session 쿠키 |
생성 위치 | 파일로 생성 | 브라우저 메모리에 생성 |
종료 시기 | 쿠키를 삭제하거나 쿠키 설정 값이 종료된 경우 | 브라우저를 종료한 경우 |
최초 접속 시 전송 여부 | 최초 접속 시 서버로 전송 | 최초 접속 시 서버로 전송되지 않음 |
용도 | 로그인 유무 또는 팝업창을 제한할 때 | 사이트 접속 시 Session 인증 정보를 유지할 떄 |
Session 쿠키는 아래에서 다룰 Session 기능과 같이 사용됩니다.
쿠키 생성 과정
- 브라우저로 사이트에 접속합니다.
- 서버는 정보를 저장한 쿠키를 생성합니다.
- 생성된 쿠키를 브라우저로 전송합니다.
- 브라우저는 서버로부터 받은 쿠키 정보를 쿠키 파일에 저장합니다.
- 브라우저가 다시 접속해 서버가 브라우저에게 쿠키 전송을 요청하면 브라우저는 쿠키 정보를 서버에 넘겨줍니다.
- 서버는 쿠키 정보를 이용해 작업을 합니다.
쿠키 API
쿠키는 Cookie 클래스 객체를 생성하여 정보를 저장한 후 서버에서 클라이언트로 전송해 파일로 저장됩니다.
- javax.servlet.http.Cookie를 이용합니다.
- HttpServletResponse의 addCookie() 메서드를 이용해 클라이언트 브라우저에 쿠키를 전송한 후 저장합니다.
- HttpServletRequest의 getCookie() 메서드를 이용해 쿠키를 서버로 가져옵니다.
메서드 | 설명 |
getComment() | 쿠키에 대한 설명을 가져옵니다. |
getDomain() | 쿠키의 유효한 도메인 정보를 가져옵니다. |
getMaxAge() | 쿠키 유효 기간을 가져옵니다. |
getName() | 쿠키 이름을 가져옵니다. |
getPath() | 쿠키의 디렉터리 정보를 가져옵니다. |
getValue() | 쿠키의 설정 값을 가져옵니다. |
setComment(String) | 쿠키에 대한 설명을 설정합니다. |
setDomain(String) | 쿠키의 유효한 도메인을 설정합니다. |
setMaxAge(int) | 쿠키 유효기간을 설정합니다. |
setValue(String) | 쿠키 값을 설정합니다. |
setPath(String) | 쿠키의 디렉터리 정보를 설정합니다. |
쿠키 생성 시 setMaxAge() 메서드 인자 값을 종류에 따라 Persistence 쿠키나 Session 쿠키로 저장됩니다. 인자 값이 음수이거나 쿠키 생성 시 setMaxAge() 메서드를 사용하지 않으면 Session 쿠키로 저장됩니다.
세션(Session)
웹 페이지들의 정보가 클라이언트 PC에 저장되는 쿠키와 달리 세션은 서버의 메모리에 생성되어 정보를 저장하고 위급 상황 발생 시 서버에서 세션을 삭제할 수 있기 때문에 웹 페이지에서 사용되는 정보 중 로그인 정보처럼 보안이 요구되는 정보는 대부분 세션을 이용합니다.
세션의 특징
- 정보가 서버의 메모리에 저장됩니다.
- 브라우저의 세션 연동은 세션 쿠키를 이용합니다.
- 정보가 서버의 메모리에 저장되기 때문에 쿠키보다 보안에 유리합니다.
- 서버에 부하를 줄 수 있습니다.
- 브라우저(사용자)당 한 개의 세션이 생성됩니다.
- 세션은 유효 시간을 가집니다. (기본 유효 시간 = 30분)
- 로그인 상태 유지 기능이나 쇼핑몰의 장바구니 담기 기능 등에 주로 사용됩니다.
세션 생성 과정
- 브라우저로 사이트에 접속합니다.
- 서버는 접속한 브라우저에 대한 세션 객체를 생성합니다.
- 서버는 생성된 세션 객체에 대한 세션 id를 클라이언트 브라우저에 전송합니다.
- 브라우저는 서버로부터 받은 세션 id를 브라우저가 사용하는 메모리의 세션 쿠키에 저장합니다.
- 브라우저가 재접속하면 브라우저는 세션 쿠키에 저장된 세션 id를 서버에 전달합니다.
- 서버는 전송된 세션 id를 이용해 해당 세션에 접근하여 작업을 수행합니다.
세션 API
서블릿에서 세션을 이용하려면 HttpSession 클래스 객체를 생성해서 사용해야 합니다.
- getSession() : 기존의 세션 객체가 존재하면 반환하고, 없으면 새로 생성합니다.
- getSession(true) : 기존의 세션 객체가 존재하면 반환하고, 없으면 새로 생성합니다.
- getSession(false) : 기존의 세션 객체가 존재하면 반환하고, 없으면 null을 반환합니다.
메서드 | 설명 |
getAttribute(String name) | 속성 이름이 name인 속성 값을 Object 타입으로 반환합니다. 해당되는 속성 이름이 없을 경우 null을 반환합니다. |
getAttributeNames() | 세션 속성 이름들을 Enumeration 객체 타입으로 반환합니다. |
getCreationTime() | 1970년 1월 1일 0시 0초를 기준으로 현재 세션이 생성된 시간까지 경과한 시간을 계산하여 1/1000초 값으로 반환합니다. |
getId() | 세션에 할당된 고유 식별자를 String 타입으로 반환합니다. |
getMaxInactiveInterval() | 현재 생성된 세션을 유지하기 위해 설정된 세션 유지 시간을 Int 타입으로 반환합니다. |
invalidate() | 현재 생선된 세션을 소멸합니다. |
inNew() | 최초로 생성된 세션인지 기존에 생성되어 있었던 세션인지 판별합니다. |
removeAttribute(String name) | 세션 속성 이름이 name인 속성을 제거합니다. |
setAttribute(String name, Object value) | 세션 속성 이름이 name인 속성에 속성 값으로 value를 할당합니다. |
setMaxInactiveInterval(int interval) | 세션을 유지하기 위한 세션 유지 시간을 초 단위로 설정합니다. |
'네트워크' 카테고리의 다른 글
OSI 7계층, TCP/IP 4계층 (0) | 2023.05.24 |
---|---|
[HTTP] HTTP, HTTPS, SSL Handshake (0) | 2022.11.28 |
[HTTP] TCP와 UDP의 특징 (TCP 3-way, 4-way handshake) (0) | 2022.11.27 |
[HTTP] 웹 통신 흐름 (0) | 2022.05.14 |
[HTTP] 세션과 토큰 (0) | 2022.03.14 |