서버에서 쿠키를 읽어 이전 상태를 변경할 필요가 있을 경우 쿠키를 업데이트해서 변경된 쿠키를 HTTP 헤더에 포함시켜 응답한다.
쿠키 생성 삭제 코드
쿠키 생성
Cookie cookie = new Cookie("cookieName", cookieValue); // key와 value
cookie.setMaxAge(60 * 60 * 24 * 30); // 만료시간 설정, 30일로 설정
cookie.setPath("/"); // 접근 경로 설정, '/'는 모든 경로에서 접근 가능하도록 설정
response.addCookie(cookie); // ResponseHeader에 cookie를 포함
- 쿠키 삭제
```java
Cookie cookie = new Cookie("cookieName", null); // 삭제하고자 하는 쿠키에 대한 값을 null로 지정
cookie.setMaxAge(0); // 쿠키가 삭제될 수 있도록 만료 시간을 0으로 변경
response.addCookie(cookie); // ResponseHeader에 cookie를 포함
세션(Session)
서버에 저장되는 쿠키라고 보면 된다.
쿠키를 기반으로 하기 때문에 동작 방식이 비슷하다.
- 서버에서는 클라이언트를 구분하기 위해 클라이언트마다 고유한 세션 ID를 부여해서 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증상태를 유지한다.
사용자에 대한 정보를 서버에 두기 때문에 쿠키보다 보안이 좋다.
하지만 사용자가 많아질수록 서버 메모리를 많이 차지하게 된다.
동접자 수가 많은 웹 사이트인 경우 서버에 과부하를 주게 되므로 성능 저하의 요인이 된다.
동작 방식
클라이언트가 서버에 접속 시 세션 ID를 발급받는다.
클라이언트는 세션 ID에 대해 쿠키를 사용해서 저장하고 가지고 있는다.
클라이언트는 서버에 요청할 때, 이 쿠키의 세션 ID를 서버에 전달해서 사용한다.
서버는 세션 ID를 전달받아서 별다른 작업없이 세션 ID로 세션에 있는 클라이언트 정보를 가지고 온다.
클라이언트 정보를 가지고 서버 요청을 처리해서 클라이언트에게 응답한다.
세션 생성 삭제 코드
세션 생성
void newSession(HttpServletRequest req) {
// 서버에 생성된 세션이 있다면 세션을 반환하고, 없다면 새 세션을 생성해서 반환한다.
HttpSession session = req.getSession();
// HttpSession session = req.getSession(true); default 인자가 true
// sessionID를 session에 저장, 회원 인증과 같은 작업에 사용됩니다.
session.setAttribute("sessionId", "1234");
}
세션 삭제
void removeSession(HttpServletRequest req) {
// 파라미터를 false로 전달하면 이미 생성된 세션을 반환하고 없다면 null을 반환한다.
HttpSession session = req.getSession(false);
if (session != null) {
// 모든 세션 정보를 한 번에 삭제할 수 있다.
session.invalidate();
}
}
쿠키와 세션의 차이
쿠키와 세션은 비슷한 역할을 하며 동작 원리도 비슷한데 그 이유는 결국 세션도 쿠키를 사용하기 때문이다.
1) 저장위치
쿠키 - 클라이언트 컴퓨터
세션 - 서버
2) 보안
세션이 쿠키보다 훨씬 우수하다.
쿠키의 경우 클라이언트 로컬에 저장되기 때문에 변질되거나 request에서 스니핑당할 우려가 있어서 보안에 취약하다.
세션은 쿠키를 이용해서 세션ID만 저장하고 서버에서 처리하기 때문에 비교적 보안성이 좋다.
(스니핑이란 해킹 기법으로 네트워크 상에서 자신이 아닌 다른 상대방들의 패킷 교환을 엿듣는 것을 의미합니다. 전화로 비유하면 도청과 같습니다.)
3) 요청 속도
쿠키가 세션보다 훨씬 빠르다.
(세션은 서버의 처리가 필요하기 때문)
4) 라이프 사이클(만료시간)
쿠키가 세션보다 훨씬 오래 저장할 수 있다.
쿠키도 만료시간이 있지만 파일로 저장되기 때문에 브라우저를 종료해도 계속해서 정보가 남아있을 수 있다. 또한, 만료기간을 넉넉하게 잡아두면 쿠키를 임의로 삭제할 때까지 유지될 수도 있다.
반면 세션도 만료시간을 정할 수 있지만 브라우저가 종료되면 만료시간에 상관없이 삭제된다.
보안적인 측면에서 세션이 쿠키보다 훨씬 우수하지만 세션은 서버의 자원을 사용하기 때문에 무분별하게 만들다보면 서버의 메모리가 감당할 수 없을 뿐만 아니라 속도가 느려질 수 있기 때문이다.
쿠키, 세션 사용
쿠키는 보안에 있어서 취약하기 때문에 장바구니와 같이 보안과 관련없는 부분에서 사용된다.
서버 인증 방식
서버에 인증하는 방식으로는 계정정보를 요청 헤더에 넣는 방식, Session/Cookie방식, 토큰 기반 인증 방식(JWT)가 있다.
요청 헤더에 계정 정보를 넣는 방식
말 그대로 Request Header에 ID, PW를 담아 보내는 방식
사용자의 프라이빗한 정보를 공개적으로 담아 보내는 방식으로 HTTP 요청을 가로챌 경우 사용자의 계정정보를 알 수 있다.
보안에 매우 취약하기 때문에 개발 단계에서 인증을 빠르게 시도할 때 사용한다.
요청을 보낼 때마다 ID와 PW로 인증해야 하기 때문에 매우 비효율적인 방법이다.
Session/Cookie 방식
1) 사용자가 로그인을 한다.
2) 서버에서는 계정정보를 읽어 사용자를 확인한 후, 사용자의 고유한 ID값을 부여해서 세션 저장소에 저장한 후, 이와 연결되는 세션 ID를 발행한다.
3) 사용자는 서버에서 해당 세션 ID를 받아 쿠키에 저장하고 인증이 필요한 요청마다 쿠키를 헤더에 실어 보낸다.
4) 서버에서는 쿠키를 받아 세션 저장소에서 대조를 한 후 대응되는 정보를 가져온다.
5) 인증이 완료되고 서버는 사용자에 맞는 데이터를 보낸다.
세션 ID를 쿠키로 저장해서 인증이 필요할 때마다 사용한다.
세션 ID는 유의미한 값을 가지고 있지 않기 때문에 노출되더라도 문제가 되지 않으며 계정정보를 담아 인증하던 방식보다 훨씬 안전하다.
세션 저장소를 사용하기 때문에 서버에 추가적인 저장공간을 필요로 하기 때문에 서버 부하가 높아진다.
쿠키, 세션
쿠키와 세션을 사용하는 이유
클라이언트 정보 유지를 위해 사용한다. HTTP 프로토콜의 특징인 비연결성(Connectionless)과 무상태성(Stateless)를 보완하기 위해서 사용한다.
(비연결성이란 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어버리는 특징) (무상태성이란 통신이 끝나면 상태를 유지하지 않는 특징으로 클라이언트의 상태를 유지하지 않는다.)
쿠키 (Cookie)
쿠키 사양
종류
동작 방식
쿠키 생성 삭제 코드
쿠키 생성
세션(Session)
동작 방식
세션 생성 삭제 코드
쿠키와 세션의 차이
2) 보안 세션이 쿠키보다 훨씬 우수하다. 쿠키의 경우 클라이언트 로컬에 저장되기 때문에 변질되거나 request에서 스니핑당할 우려가 있어서 보안에 취약하다. 세션은 쿠키를 이용해서 세션ID만 저장하고 서버에서 처리하기 때문에 비교적 보안성이 좋다. (스니핑이란 해킹 기법으로 네트워크 상에서 자신이 아닌 다른 상대방들의 패킷 교환을 엿듣는 것을 의미합니다. 전화로 비유하면 도청과 같습니다.)
3) 요청 속도 쿠키가 세션보다 훨씬 빠르다. (세션은 서버의 처리가 필요하기 때문) 4) 라이프 사이클(만료시간) 쿠키가 세션보다 훨씬 오래 저장할 수 있다. 쿠키도 만료시간이 있지만 파일로 저장되기 때문에 브라우저를 종료해도 계속해서 정보가 남아있을 수 있다. 또한, 만료기간을 넉넉하게 잡아두면 쿠키를 임의로 삭제할 때까지 유지될 수도 있다. 반면 세션도 만료시간을 정할 수 있지만 브라우저가 종료되면 만료시간에 상관없이 삭제된다.
보안적인 측면에서 세션이 쿠키보다 훨씬 우수하지만 세션은 서버의 자원을 사용하기 때문에 무분별하게 만들다보면 서버의 메모리가 감당할 수 없을 뿐만 아니라 속도가 느려질 수 있기 때문이다.
쿠키, 세션 사용
쿠키는 보안에 있어서 취약하기 때문에 장바구니와 같이 보안과 관련없는 부분에서 사용된다.
서버 인증 방식
서버에 인증하는 방식으로는 계정정보를 요청 헤더에 넣는 방식, Session/Cookie방식, 토큰 기반 인증 방식(JWT)가 있다.
요청 헤더에 계정 정보를 넣는 방식 말 그대로 Request Header에 ID, PW를 담아 보내는 방식 사용자의 프라이빗한 정보를 공개적으로 담아 보내는 방식으로 HTTP 요청을 가로챌 경우 사용자의 계정정보를 알 수 있다. 보안에 매우 취약하기 때문에 개발 단계에서 인증을 빠르게 시도할 때 사용한다. 요청을 보낼 때마다 ID와 PW로 인증해야 하기 때문에 매우 비효율적인 방법이다.
Session/Cookie 방식 1) 사용자가 로그인을 한다. 2) 서버에서는 계정정보를 읽어 사용자를 확인한 후, 사용자의 고유한 ID값을 부여해서 세션 저장소에 저장한 후, 이와 연결되는 세션 ID를 발행한다. 3) 사용자는 서버에서 해당 세션 ID를 받아 쿠키에 저장하고 인증이 필요한 요청마다 쿠키를 헤더에 실어 보낸다. 4) 서버에서는 쿠키를 받아 세션 저장소에서 대조를 한 후 대응되는 정보를 가져온다. 5) 인증이 완료되고 서버는 사용자에 맞는 데이터를 보낸다.
세션 ID를 쿠키로 저장해서 인증이 필요할 때마다 사용한다. 세션 ID는 유의미한 값을 가지고 있지 않기 때문에 노출되더라도 문제가 되지 않으며 계정정보를 담아 인증하던 방식보다 훨씬 안전하다.
세션 저장소를 사용하기 때문에 서버에 추가적인 저장공간을 필요로 하기 때문에 서버 부하가 높아진다.