쿠키와 세션은 상태 정보를 저장하는 기술이다.
면접을 보면서 가장 많이 들었던 질문이기도 하고 정말 중요한 기술이기 때문에 정리해보려 한다.
HTML 프로토콜은 비연결(Connectless), 무상태(Stateless)라는 특징을 갖는다.
브라우저가 서버에 전달한 상태 정보는 지속적으로 유지되지 않고 상태 정보를 따로 저장하지 않는다.
예를 들어 로그인을 한 회원만 글을 쓸 수 있는 게시판이 존재한다 가정할 때, 상태 정보가 없다면 우리는
해당 회원이 로그인을 수행하여 페이지를 이동하더라도 로그인한 사실을 확인할 수 없다.
이렇게 인증에 대한 정보를 확인하기 위해서는 상태 정보가 필요하다.
상태 정보를 저장하는 방식은 무척 다양하다.
우리가 흔히 알고 있는 쿠키, 세션, 캐시는 물론 토큰 CDN 등 다양한 방식으로 상태 정보를 저장할 수 있다.
쿠키
쿠키는 상태 정보를 브라우저가 설치된 사용자 컴퓨터에 저장하는 기술이다.
쿠키는 텍스트 형태의 상태 정보만 저장할 수 있다. 그리고 쿠키는 저장할 수 있는 데이터의 개수에 제한이 있다.
쿠키는 브라우저가 설치된 컴퓨터에 저장되기 때문에 누구나 쿠키 정보를 들여다볼 수도 있고 조작도 가능하다.
또한 브라우저에서 특정 서버로부터 전송되는 쿠키를 차단해버리면 쿠키를 기반으로 하는 상태 정보 유지는 아예 사용할 수 없다.
하지만 이런 한계에도 불구하고 쿠키는 사용 방법이 간단하기 때문에 사용자 인증이나 장바구니 같은 기능에 많이 사용된다.
코드를 통해 알아보자

user가 null이 아니면서 비밀번호가 일치하면 로그인이 수행된 것이다.
로그인을 확인하였으니 addCookie() 메소드를 사용하여 HTTP 응답 프로토콜에 쿠키를 포함시킨다.
그러면 HTTP 응답이 브라우저에 전송될 때 message-header에 쿠키 정보가 포함이 되며,
브라우저(사용자)가 다시 해당 서버에 요청할 때 mssage-header에 쿠키 정보가 포함이 되어 동일한 서버에 전달이 된다.
그러면 해당 user에게 텍스트 타입의 쿠키를 통해 로그인이 된 것을 확인할 수 있고
포워딩을 진행하여 사용자 화면 이동을 응답하는 방식으로 상태 정보를 이용할 수 있다.
쿠키를 설정할 때는 도메인, 패스, 유효 시간 등을 설정할 수 있다.
Cookie 메소드
| 메소드 | 기능 |
| void setDomain(String domain) | 쿠키 도메인 설정 |
| void setPath(String uri) | 쿠키 패스 설정 |
| void setMaxAge(int expiry) | 쿠키 유효 시간 설정 |
세션
쿠키와 달리 서버에 저장되는 세션은 서버의 메모리가 허용하는 범위 내에서 얼마든지 저장할 수 있다.
쿠키는 텍스트 형태의 상태 정보만 저장이 가능했지만 세션은 모든 타입의 데이터를 저장할 수 있다. 심지어 세션은 객체 형태의 데이터도 저장할 수 있다.
개발환경마다 다르지만 서블릿의 경우 HttpServletRequest 객체로부터 얻을 수 있다.
세션 객체는 HttpServletRequest의 getSession() 메소드로 생성한다.
생성된 세션 객체는 각각 구분해야 하기 때문에 세션ID가 생성된다.
세션ID는 요청을 전송한 브라우저(사용자) 정보와 요청 시간 등을 조합하여 만들어지며,
이렇게 생성된 세션 ID는 쿠키로 생성되어 브라우저에 저장된다.(내부적으로 쿠키를 이용하는 방식)
코드를 통해 알아보자

쿠키를 저장하던 방식에서 크게 바뀐 것은 없다.
HttpServletRequest의 getSession() 메소드로 세션을 생성하여 해당 정보를 저장하였다.
그럼 이제 사용자가 로그인 페이지로 포워딩이 되면 세션 정보를 확인하여 로그인 유무를 체크할 수 있다.
|
1
2
3
4
5
6
|
//0. 상태 정보 체크
HttpSession session = request.getSession();
String userId = (String) session.getAttribute("userId");
if(userId == null) {
response.sendRedirect("/");
}
|
cs |
사용자의 세션이 존재하지 않는다면 다시 메인 페이지로 리다이렉트 하도록 설정 하였다.
HttpSession 메소드
| 메소드 | 기능 |
| void setAttribute(String name, Object value) | 세션에 name-value 쌍의 데이터를 저장한다. |
| Object getAttribute(String name) | 세션에 저장된 데이터를 리턴한다. |
| Enumeration getAttributeNames() | 세션에 저장된 데이터의 name 목록을 Enumeration 타입으로 리턴한다. |
| void removeAttribute(String name) | 세션에 저장된 데이터를 삭제한다. |
| String getId() | 생성된 세션 객체의 세션 ID를 리턴한다. |
| boolean isNew() | 처음 생성된 세션인지 확인하고 리턴한다. |
| long getCreationTime() | 세션이 생성된 시간을 리턴한다. |
| long getLastAccessTime() | 마지막으로 세션이 사용된 시간을 리턴한다. |
| void setMaxInactiveInterval(int second) | 브라우저가 서버에 아무런 요청을 하지 않을 때, 얼마까지 세션을 유지할 것인지를 설정한다. (디폴트 30분) |
| int getMaxInactiveInterval() | 설정된 세션의 유효 시간을 리턴한다. |
| void invalidate() | 브라우저와 매핑된 세션을 강제로 종료한다. |
'WEB' 카테고리의 다른 글
| [WEB] 부트스트랩-bootstrap (0) | 2024.02.19 |
|---|---|
| [WEB]MVC 패턴 (MVC Pattern) (0) | 2024.02.16 |
| [WEB]Redirect와 Forward의 차이 (0) | 2024.02.15 |
| 이클립스 톰캣 resource '/server' does not exist 에러 해결 방법 (0) | 2024.02.15 |
| [WEB]VO 패턴 (VO Pattern) (0) | 2024.02.14 |