[Spring] 쿠키와 세션 다뤄보기

이병수·2024년 2월 2일
0

스프링 정리

목록 보기
19/24
post-custom-banner

쿠키와 세션

HTTP에 상태 정보를 유지(Stateful)하기 위해 사용한다.
쿠키와 세션을 통해 서버에서는 클라이언트 별로 인증 및 인가를 할 수 있다.


쿠키

코드를 통해서 일단 먼저 쿠키를 다뤄보도록 한다.

일단 먼저 쿠키를 생성하는 메서드를 작성해보자.

쿠키 생성

public static void addCookie(String cookieValue, HttpServletResponse response) {
	try {
		cookieValue = URLEncoder.encode(cookieValue, "utf-8").replaceAll("\\+", "%20");
        
		Cookie cookie = new Cookie(AUTHORIZATION_HEADER, cookieValue);
		cookie.setPath("/");
		cookie.setMaxAge(30*60);

		response.addCookie(cookie); 
	} catch (UnsupportedEncodingException e) {
		throw new RuntimeException(e.getMessage());
	}
}

addCookie() 메서드의 전체적인 모습이다. 하나하나씩 알아보자

cookieValue = URLEncoder.encode(cookieValue, "utf-8").replaceAll("\\+", "%20");

addCookie 의 첫번째 파라미터 값은 cookieValue값이다.
쿠키에 넣어주고 싶은 값을 파라미터로 넣어주면 된다.

두번째 파라미터는 변환할 타입을 넣어준다. utf-8로 설정

URLEncoder 클래스에 encode() 메서드를 사용해서 cookieValue의 문자열에 공백 문자가 있다면 %20 으로 변환해주는 작업을 한다.
(왜냐하면 공백이 있으면 오류가 발생하기 때문이다)


Cookie cookie = new Cookie(AUTHORIZATION_HEADER, cookieValue);

쿠키 객체를 설정해준다. 첫번째 파라미터는 Name, 두번째 파라미터는 Value 형식으로 된다.
여기서 AUTHORIZATION_HEADER는 그냥 상수값이다. (내가 정한 상수값)

public static final String AUTHORIZATION_HEADER = "Authorization";

이렇게 설정해놓았다.


cookie.setPath("/");
cookie.setMaxAge(30*60);

쿠키의 경로와 만료기한을 설정해준다.
경로는 그냥 "/" 이걸로 설정해봤으며 만료기한은 초 단위이므로 30분으로 설정


response.addCookie(cookie); 

이렇게 만든 쿠키를 HttpServletResponse 객체에 Cookie를 추가해준다.

이렇게 하면 일단 쿠키를 생성해주는 메서드이다.


@GetMapping("/create-cookie")
public String createCookie(HttpServletResponse res) {
	addCookie("Roobie Auth", res);
	return "createCookie";
}

위에서 만든 메서드를 통해 /create-cookie 경로로 들어오게 된다면 해당 쿠키를 생성해서 HttpServletResponse에 쿠키를 담아서 보내준다.


쿠키 가져오기

@GetMapping("/get-cookie")
public String getCookie(@CookieValue(AUTHORIZATION_HEADER) String value) {
	System.out.println("value = " + value);
	return "getCookie : " + value;
}

/get-cookie 경로로 오게 되면 해당 쿠키의 값을 가져올 수 있다.

@CookieValue 어노테이션을 사용해서 네임값 (우리가 위에서 설정한 AUTHORIZATION_HEADER 값) 을 사용하면 value값이 String value에 담겨져서 오게 된다.


그렇다면 실행할 때 어떻게 생성하고 가져오는지 보자.

Name값이 우리가 설정한 상수 AUTHORIZATION_HEADER = "Authorization" 그대로 들어오게 되었으며

value값도 "Roobie Auth" 이렇게 설정했는데 URLEncoder를 통해 공백문자는 %20 으로 변환된 것을 확인할 수 있다.


콘솔값에 해당 value값이 그대로 출력되는 것을 확인할 수 있다.


세션

Servlet에서는 유일무이한 세션 ID 를 간편하게 만들 수 있는 HttpSession을 제공한다.

세션 생성

@GetMapping("/create-session")
public String createSession(HttpServletRequest req) {
    HttpSession session = req.getSession(true);
    session.setAttribute(AUTHORIZATION_HEADER, "Robbie Auth");

    return "createSession";
}

HttpSession session = req.getSession(true);

HttpServletRequest를 통해 들어오는 값에 getSession(true); 를 넣어준다.

파라미터 true를 설정한 이유는
세션이 존재할 경우, 그 세션을 그대로 반환하고, 만약 존재하지 않는다면 세션을 생성 후에 반환해주기 때문이다.

session.setAttribute(AUTHORIZATION_HEADER, "Robbie Auth");

이 코드는 위에서 쿠키에 대입한 것처럼 Name - Value 형식으로 값을 넣어준 것이다.


세션 읽기

@GetMapping("/get-session")
public String getSession(HttpServletRequest req) {
    HttpSession session = req.getSession(false);
    
    if(session == null) {
		return "Session is null";
	}

    String value = (String) session.getAttribute(AUTHORIZATION_HEADER);
    System.out.println("value = " + value);

    return "getSession : " + value;
}

HttpSession session = req.getSession(false);

req.getSession(false); 를 통해서 세션이 존재할 경우 세션을 반환하고, 없다면 null을 반환해주기 때문에 사용한다.

String value = (String) session.getAttribute(AUTHORIZATION_HEADER);

getAttribute() 메서드의 반환값이 Object이기 때문에 캐스팅을 통해서 String 값으로 반환하기 위해 사용했고
가져온 세션에 저장된 Value 를 Name을 사용하여 가져올 수 있다.

profile
백엔드 개발자가 되고 싶어요
post-custom-banner

0개의 댓글