[네트워크] Http Session과 Cookie사용 방법

728x90

안녕하세요

오늘은 스프링 프레임워크에서 세션 및 쿠키를 다루는 방법에 대하여 알아보겠습니다.

 

세션과 쿠키는 클라이언트와 서버의 연결을 유지하는 방법입니다

 

우리가 사용하는 웹 브라우저에 서비스는 HTTP 프로토콜을 기반으로 통신을 합니다.

그리고 그 HTTP 프로토콜은 클라이언트와 서버의 관계를 유지 하지 않는 특징이 있습니다.

 

그 대표적인 특징 2가지가

  1. 무상태성 (Stateless)
  2. 비연결성(Connctionless)

위 사진을 보면 한번 요청이오고 그 요청에 응답이 오면 바로 연결을 끊는다.

만약에 그러면 로그인을 하는 상황이라면 어떨까요?

로그인을 해서 여러 기능을 이용해야 하면은, API요청을 할 때마다 로그인을 해야할까요?

만약 실제로 그렇다면은...... 엄청나게 귀찮을 겁니다.

매번 요청하고 연결이 끊기면 어떠한 기능을 사용할 때 마다 로그인을 계속해야하는 상황이 발생할 것 입니다.

 

이러한 Connectionless Protocol의 불편함을 해결하기 위해서 나온게 세션과 쿠키를 입니다.

세션과 쿠키는 클라이언트와 서버의 연결 상태를 유지해주는 방법 입니다.

 

세션은 서버에서 연결정보를 관리하는 반면

쿠키는 클라이언트에서 연결 정보를 관리하는데 차이가 있다.

 

즉 서버 또는 클라이언트에 관계를 유지시키기 위해서 사용하는 것입니다.

 

이제 Java, Spring 환경에서 세션과 쿠키를 어떻게 사용을 하는지 알아보겠습니다.

 

그럼 세션을 어떻게 사용하고 어떻게 관리해야 하나요?

로그인을 할 때 세션을 생성하고 유지시키는 방법에 대해서 알아보겠습니다.

@Controller
public class SessionEx {

    @GetMapping("/login")
    public String Login(Member member, HttpServletRequest httpServletRequest) {

        HttpSession session = httpServletRequest.getSession();
        session.setAttribute("member",member);
        return "/member/loginok";
    }
}

 

간단하게 세션을 생성하고, 가져와서 세션에 값을 설정해주는 과정입니다.

  1. HttpServletRequest 및 HttpSession:
    • **HttpServletRequest**은 클라이언트의 HTTP 요청 정보를 담고 있는 객체로, 여기에서 세션을 가져올 수 있습니다.
    • **HttpSession**은 세션을 나타내는 인터페이스로, 세션을 생성하고 관리할 수 있습니다.
  2. 세션 생성과 값 설정:
    • getSession() 메서드를 통해 현재 요청의 세션을 가져옵니다.
    • setAttribute(String name, Object value) 메서드를 통해 세션에 속성을 추가합니다.
    • 이 때, "member"라는 이름으로 현재 로그인한 회원 정보를 세션에 저장했습니다.
  • 그리고 return을 통하여 폼으로 전달합니다.

세션을 활용한 로그인 상태 유지

  • 이후 User의 요청이 있을 때마다 세션에서 로그인 여부를 확인하고, 로그인 상태를 유지할 수 있습니다.

그리고 사실 HttpServletRequest 및 HttpSession은 큰 차이가 없습니다.

 

둘 중 편한 객체를 사용해서 세션을 생성하고 관리 하면 됩니다.

    @GetMapping()
    public String Login1(Member member, HttpSession httpSession) {
        httpSession.setAttribute("member",member);
        return "/member/loginok";
    }

 

이렇게하면 세션을 따로 받아오지 않고, 세션이 받아와진 객체를 사용해서 한 줄 덜 타이핑하는 수고를 덜어줄 수 있습니다.

두 방식에는 큰 차이가 없으니 편한걸 사용하시면 된다고 생각합니다.

 

이번에는 세션을 생성해봤으니, 세션을 삭제하는 방법에 대해서도 알아보겠습니다

    @GetMapping()
    public String logout(Member member, HttpServletRequest httpServletRequest) {
        HttpSession httpSession = httpServletRequest.getSession();
        httpSession.invalidate();
        return "/member/logout";
    }
    @GetMapping()
    public String logout1(Member member, HttpSession httpSession) {
        httpSession.invalidate();
        return "/member/logout";
    }

 

세션을 삭제하는 방법도 위 방법 처럼 두가지가 있으니 편한 것을 사용하면 됩니다.

또 다른 삭제 방법은 세션을 생성한 setAttribute를 지우는 removeAttiribute 메소드를 사용하는 것도 방법이니 참고하길 바랍니다.

 

이렇게 하면 세션을 다시 생성하는 로직을 하기 전 까지는 세션이 삭제 되어 있습니다.

다양한 세션에서 메소드가 있으니, 궁금하시면 직접 보시면 이해에 도움이 많이 될 것입니다.

세션은 서버에서 관리하기 때문에 request 요청하는 객체를 사용하고

반면에 쿠키는 클라이언트에서 관리를 하기 때문에 response 응답받는 객체를 사용합니다

다음은 쿠키를 보겠습니다.

HTTP Cookie 동작 원리

HTTP Cookie 는 웹 브라우저와 웹 서버 간에 상태 정보를 유지하기 위한 기술이다.

쿠키는 서버가 브라우저는 이를 로컬에 저장하고 필요할 때 마다 서버에 전송하여 사용자 상태 정보를 공유한다.

  • 클라이언트 브라우저가 자신의 PC에 저장한다. 그 쿠키를 가진 서버로 데이터를 교환한다
  • 즉 데이터를 저장하는 곳이 클라이언트 웹 브라우저 이다.

쿠키는 HTTP 헤더에 Set-Cookie 와 같은 헤더를 통해 서버에서 클라이언트에 전송된다.

쿠키는 키-값 쌍으로 이루어져 있으며, 이름, 값, 유효 기간, 도메인, 경로 등 정보를 포함한다.

 

HTTP Cookie 특징

1) 쿠키는 클라이언트 측에 저장된다. 따라서 서버거 클라이언트의 상태 정보를 확인하려면 쿠키를 클라이언트에서 전송받아야 한다.


2) 쿠키는 유효기간을 가지고 있다. 유효 기간이 지나면 쿠키는 삭제된다.

  • 인증을 위해서 쿠키를 사용하면 보통 세션 기간동안 유지한다

3) 쿠키는 보안 문제가 있을 수 있다. 쿠키에 민감한 정보를 저장하면 안된다.

  • HTTPS 와 같은 보안 프로토콜을 사용하여 암호화 해야한다.

4) 쿠키는 브라우저에서 관리되기 때문에, 브라우저에서 쿠키를 삭제하거나, 다른 브라우저에서 접속하는 경우 쿠키를 공유할 수 없다.

 

Cookie 사용 하여 인증하는 방법

 

1) 사용자가 로그인 페이지 접속시 로그인 정보 입력
2) 서버는 사용자 정보를 검증하고, 인증이 성공하면 사용자의 고유 ID 와 함께 인증 토큰(쿠키)을 생성
3) 서버는 생성된 인증 토큰을 HTTP 응답 헤더에 포함하여 클라이언트에게 전송한다.
4) 클라이언트는 전송받은 인증 토큰을 로컬에 저장한다.
5) 클라이언트는 이후 서버에 요청을 보낼 떄 마다 인증 쿠키를 HTTP 요청 헤더에 포함하여 전송한다.
6) 서버는 전송받은 인증 쿠키를 검증하여, 인증이 성공하면 요청에 대한 응답을 생성한다.

 

그럼 쿠키는 어떻게 사용하고 어떻게 관리해야 하나요?

    @GetMapping()
    public String mailMain(Mall mall, HttpServletResponse httpServletResponse) {
        Cookie cookie = new Cookie("gender", mall.getGender());

        if(mall.isCookieDel()) {
            cookie.setMaxAge(0);
            mall.setGender(null);
        } else {
            cookie.setMaxAge(60*60*24*30);
        }
        httpServletResponse.addCookie(cookie);
        return "/mall/main";
    }
  • 파라미터로 HttpServletResponse 를 받아옵니다
  • 그리고 쿠키 객체를 생성하고 합니다
  • if문에서 cookie가 있다면 쿠키를 다시 설정하지 않고
    • 쿠키가 없다면 쿠키에 옵션을 설정해줍니다.
  • 그리고 설정해둔 쿠키를 HttpServletResponse 객체에 추가를 합니다.

또는 다른 방법으로

    @GetMapping()
    public String mallIndex(Mall,mall, @CookieValue(value="gender", required = false) Cookie cookie) {
        if(cookie!=null) {
            mall.setGender(cookie.getValue());

            return "/mall/main";
        }
    }

위 방법을 사용해서도 할 수 있습니다.

현업에서 세션을 관리할 때 둘 중 뭐를 더 자주 사용하는지 궁금할 수 있다고 생각합니다.

그거는 실무에 상황에따라 유동적으로 변동이 될 수 있고, 각각의 장단점이 있습니다.

그래서 둘중 뭐를 더 많이 사용한다고 장담을 할 수 없습니다. 그래도 꼭 알아야 한다고 하면 제 개인적인 생각으로는 쿠키보다는 세션을 좀 더 사용할 것 같다는 생각이 듭니다. 저도 회사 프로젝트에서 세션을 사용하고 있기는 합니다.

즉 개발자들은 프로젝트의 상황에 맞춰서 유동적으로 세션 및 쿠키를 사용을 할 수 있어야 합니다.

오늘은 스프링 환경에서 쿠키 및 세션을 사용하는 방법에 대하여 알아보았습니다.

세션 및 쿠키자체에 대한 것이 궁금하다면은 네트워크쪽에 대한 지식이 필요합니다.

( + 추가적인 공부를 통해, 쿠키 세션자체에 대한) 내용을 추가 포스팅 하겠습니다.

이상입니다.

728x90