[Spring] 세션이란? 세션과 쿠키의 차이

세상을 바꾸는 개발자·2023년 3월 16일
0

세션

쿠폰(쿠키)을 손님에게 맡기고 손님이 관리하는 경우, 손님이 쿠폰을 조작 할 가능성이 있다. -> 보안에 취약
해결법 - 사장님이 쿠폰 저장소(세션 저장소)를 만들어 그 쿠폰의 내용을 저장해 놓는다.

하지만, 사장님은 손님이 올 때 마다 A손님이 왔는지, B손님이 왔는지 매 번 구분을 할 수 없가 없다. -> 고객 식별 불가
해결법 - 고객 식별을 쿠키로 한다.


세션 + 쿠키 전부 사용

  • 쿠키만으로는 보안에 취약해서 세션이 필요하다.
  • 단, 세션은은 세션ID라는 쿠키가 없으면 안된다.
  • 세션ID는 간단하면 조작될 가능성이 있으므로 16진수로 길게 만든다.

    ex)
    최초 접속일 경우(쿠키가 없을 경우) 세션ID(쿠키)를 지급, 세션ID에 대한 저장소를 만듦
    두번째 접속일 경우(쿠키가 있는 경우) 세션ID 확인 후, 해당 저장소를 확인 후 체크함



세션과 쿠키의 차이

  • 쿠키는 클라이언트와 서버에서 값을 생성/수정/삭제할 수 있다.
  • 세션은 서버에서만 값을 생성/수정/삭제할 수 있다.
  • 쿠키는 클라이언트에서 값을 조작할 수 있기 때문에, 보안에 취약하다.
  • 서버는 클라이언트에서 값을 조작할 수 없기 때문에, 보안성이 좋다.


각 브라우저 별로 유지해야하는 중요한 정보는 세션에 저장하는게 좋다.

  • 예를들어 현재 접속한 브라우저가 몇 번 회원인지에 대한 정보가 중요한 정보이다.
  • 각 브라우저 별로 유지해야하는 별로 중요하지 않은 정보는 쿠키에 저장해도 된다.
  • SESSIONID 는 중요한 정보이지만 구조상 어쩔 수 없이 쿠키에 저장되어야 한다.
  • SESSIONID 는 클라이언트(브라우저)가 조작을 하더라도 본인만 손해이기 때문에, 보통은 조작을 하지 않는다.

세션 실습

 public void setSession(String name, long value) {
        HttpSession session = req.getSession();
        session.setAttribute(name, value);
    }

    public long getSessionAsLong(String name, long defaultValue) {
        try {
            long value = (long) req.getSession().getAttribute(name);
            return value;
        } catch (Exception e) {
            return defaultValue;
        }
    }

    private String getSessionAsStr(String name, String defaultValue) {
        try {
            String value = (String) req.getSession().getAttribute(name);
            if (value == null) return defaultValue;
            return value;
        } catch (Exception e) {
            return defaultValue;
        }
    }

    public boolean removeSession(String name) {
        HttpSession session = req.getSession();

        if (session.getAttribute(name) == null) return false;

        session.removeAttribute(name);
        return true;
    }

    // 디버깅용 함수
    public String getSessionDebugContents() {
        HttpSession session = req.getSession();
        StringBuilder sb = new StringBuilder("Session content:\n");

        Enumeration<String> attributeNames = session.getAttributeNames();
        while (attributeNames.hasMoreElements()) {
            String attributeName = attributeNames.nextElement();
            Object attributeValue = session.getAttribute(attributeName);
            sb.append(String.format("%s: %s\n", attributeName, attributeValue));
        }

        return sb.toString();
    }
    
profile
초심 잃지 않기

0개의 댓글