네트워크

쿠키 사용하기

ssung 2022. 5. 8. 00:59

HTTP는 기본적으로 '무상태'라는 특징이 있기 때문에 클라이언트가 서버로 전송한 데이터를 소유하지 않는다. 그렇기 때문에 클라이언트는 서버가 자신을 기억해주기를 바란다면 매번 자신의 인증정보를 서버에 전송해야 할 것이다. 이것은 개발자 입장에서도 매우 번거롭고 어려운 작업이 될 것이다.

 

이런 문제를 해결하기 위한 방법이 '쿠키'이다.

 

쿠키는 key, value로 이루어져 있으며 서버에서 쿠키를 만들어서 클라이언트에 보내면 클라이언트가 서버에 요청할 때 매번 쿠키를 함께 보내게 된다.

@GetMapping("/")
public String home() {

	Cookie cookie = new Cookie("userId", "1");		// 쿠키 생성(key, value)

	return "home";
}

 

 

 

쿠키의 사용방법

(1) 로그인

쿠키를 가장 많이 사용하는 방법은 로그인기능이다. 클라이언트가 자신의 정보를 서버로 보내면 서버가 그 정보를 쿠키에 담아서 다시 보낸다. 이렇게 함으로서 클라이언트가 다른 요청을 했을 때도 그 요청이 인증 된 사용자임을 판단할 수 있고 인가를 통해 필요한 정보만 보여주는 것도 가능할 것이다.

 

 

(2) 광고 정보 트래킹

요즘 많이 사용하는 광고 정보를 위한 내용이다. 사용자가 어느 사이트에서 어떤 물건을 보는지를 알 수 있고 그 정보들을 이용해서 사용자에게 필요한 정보를 주는 작업을 하는 경우이다.

 

 

(3) 웹 스토리지

쿠키는 매번 서버에 보내는 것이 보통이지만 웹 브라우저에 웹 스토리지라는 곳에 저장해서 클라이언트 로직에서만 사용할 수 있도록 만들 수 있다. 이렇게 하면 매번 서버로 전송하는 것이 아니라 필요한 경우에만 서버로 전송하여 사용할 수 있다.

 

 

 

 

쿠키의 단점

쿠키는 유용하지만 단점들이 분명히 존재한다.

 

(1) 네트워크 추가 트래픽 유발

쿠키를 생성하면 클라이언트는 매번 요청때마다 쿠키를 서버에 전송해야 하므로 요청하는 데이터의 양이 증가할 수 밖에 없다. 만약 쿠키를 많이 만들게 된다면 점점 더 큰 트래픽을 유발하게 될 것이다. 그렇기 때문에 쿠키는 최소한의 정보만 만드는 것이 좋다.

 

 

(2) 보안에 취약함

클라이언트가 매번 전송해야되기 때문에 중간에서 언제든 가로챌 수 있다는 이야기가 된다. 유저정보(아이디, 비밀번호 등)만 매번 주고받다가 중간에서 가로채더라도 그 아이디는 해커가 자유롭게 이용할 수 있는 아이디가 되는 것이다.

 

이러한 이유 때문에 절대 중요한 정보(주민번호, 신용카드 등)는 쿠키에 담아서는 안된다.

 

 

 

 

쿠키의 다양한 설정

(1) 생명주기

cookie.setMaxAge(3600);		// 3600초

쿠키가 만료되는 시간을 지정한다. 지정 시간은 초 단위이며 지정한 시간이 지나면 쿠키가 만료된다.

 

쿠키 만료의 종류는 2가지로 분류할 수 있다.

  • 세션 쿠키 : 만료 날짜를 생략하면 브라우저 종료시 까지만 유지
  • 영속 쿠키 : 만료 날짜를 입력하면 브라우저가 종료되더라도 해당 시간까지 유지

 

(2) 도메인

cookie.setDomain("example.org");	// 지정한 도메인과 하위 도메인에 전송 가능

쿠키를 저장해도 아무 도메인에서나 접근해서는 안될 것이다. 특정 도메인을 지정하면 지정한 도메인과 하위 도메인까지 쿠키를 전송하게 된다.

 

위의 코드처럼 지정하면 example.org와 dev.example.org에도 쿠키를 전송하게 된다.

 

특정 도메인을 지정하지 않으면 쿠키를 생성한 시점에서의 도메인에서만 쿠키를 전송하고 하위 도메인에도 쿠키를 전송하지 않는다.

 

(3) 경로

cookie.setPath("/");		// 모든 경로에서 쿠키 전송

도메인으로 한번 거르고 경로에서 한번 더 거를 수 있다. 지정한 경로와 하위경로 페이지에서 쿠키를 전송하기 때문에 보통은 위와 같이 설정하여 모든 경로에서 가능하도록 하지만 특정 경로를 지정할 수 있다.

 

path=/home 으로 지정했을 때

  • /home => 가능
  • /home/level1 => 가능
  • /home/level1/level2 => 가능
  • /hello => 불가능

 

(4) 보안

cookie.setSecure(true);		// https인 경우에만 전송
cookie.setHttpOnly(true);	// XSS공격 방지

쿠키는 기본적으로 http와 https에서 모두 전송하지만 Secure를 설정하면 https에서만 전송한다.

 

HttpOnly를 설정하면 XSS공격을 방지할 수 있지만 자바스크립트에서 접근할 수 없게 되고 HTTP전송에서만 사용할 수 있게 된다.

 

 

 

 

위에서 사용한 쿠키 설정 전체코드이다.

@GetMapping("/")
public String home(HttpServletResponse response) {

    Cookie cookie = new Cookie("userId", "1");
    cookie.setMaxAge(3600);
    cookie.setDomain("example.org");
    cookie.setPath("/");
    cookie.setSecure(true);
    cookie.setHttpOnly(true);
    
    response.addCookie(cookie);		// 응답코드에 쿠키 추가

	return "home";
}

만들고 설정한 쿠키는 응답코드에 추가해주어야 한다.

 

 

 

쿠키를 가져오는 방법은 HttpServletRequest를 이용해서 가져올 수 있다.

@GetMapping("/")
public String home(HttpServletRequest request) {

	Cookie[] cookies = request.getCookies();

	return "home";
}

기본적으로 배열로 받아오기 때문에 반복문으로 풀어서 조회해야한다.

 

 

 

쿠키를 삭제하는 방법은 쿠키의 값을 null로 만들거나 만료시간을 0으로 만들면된다.

@GetMapping("/")
public String home(HttpServletRequest request) {

	Cookie cookie = new Cookie("userId", "1");		// 쿠키 생성
	
	Cookie cookie = new Cookie("userId", null);		// 값을 null로 설정하여 제거
	cookie.setMaxAge(0);							// 만료시간을 0으로 설정하여 제거

	return "home";
}