본문 바로가기

Spring/Spring

[Spring] 쿠키와 세션을 이용한 로그인 처리

반응형

로그인 처리 방식

1. 웹 브라우저에서 LoginId, password로 로그인한 POST 요청을 서버로 전송

2. 서버는 회원 저장소에서 해당 로그인 정보와 일치하는 멤버가 있는지 찾는다.

3. 일치하는 멤버가 있으면 세션 저장소에 SessionId와 value(Member)를 생성한다. (이때 sessionId는 UUID로 추정 불가능하게 해야 한다.)

4. sessinId를 HTTP 응답에 쿠키로 같이 보내서 쿠키 저장소에 저장한다.

5. 로그인 이후 클라이언트는 항상 MySessionId를 쿠키 저장소에서 빼서 서버로 전달하고 서버는 쿠키 정보로 세션 저장소를 조회해서 세션 정보를 사용한다.

세션 관리의 3가지 기능

1. 세션 생성

  • sessinId 생성 (UUID)
  • 세션 저장소에 sessionId와 보관할 값 저장
  • sessinId로 응답 쿠키를 생성해서 클라이언트에 전달
   private Map<String, Object> sessionStore = new ConcurrentHashMap<>(); //String은 세션id, Object 객체 보관
    public static final String SESSION_COOKIE_NAME = "mySessionId";

    /**
     * 세션 생성
     * sessionId 생성 (임의의 추정 불가능한 랜덤값)
     * 세션 저장소에  sessionId와 보관할 값 저장
     * sessionId로 응답 쿠키를 생성해서 클라이언트에 전달
     */

    public void creaetSession(Object value, HttpServletResponse response) {

        //Create sessionId
        String sessionId = UUID.randomUUID().toString();
        sessionStore.put(sessionId, value);

        // 쿠키 생성
        Cookie cookie = new Cookie(SESSION_COOKIE_NAME, sessionId);
        response.addCookie(cookie);
    }

 

2. 세션 조회

  • 클라이언트가 요청한 sessionId 쿠키의 값으로, 세션 저장소에 보관한 값 조회
    public Object getSession(HttpServletRequest request) {
        
     Cookie sessionCookie = findCookie(request,SESSION_COOKIE_NAME);
     if (sessionCookie == null) {
         return null;
     }
     // success logic
     return sessionStore.get(sessionCookie.getValue());
    } 
    
    public Cookie findCookie(HttpServletRequest request, String cookieName) {
        Cookie[] cookies = request.getCookies();
        if (cookies == null) {
            return null;
        }
        // Arrays.stream changes arrangement to stream
        return Arrays.stream(cookies)
                .filter(cookie -> cookie.getName().equals(cookieName))
                .findAny()
                .orElse(null);
    }

findCookie 로직은 우선 Http 요청에서 쿠키를 빼서 cookies 배열에 넣는다.

만약 쿠키가 없으면 null이 반환되고 쿠키가 있으면 

cookies 배열을 stream으로 바꿔서 cookie의 이름이 cookieName과 같으면 그 쿠키를 반환하고 아니면 null을 반환하는 로직이다.

 

3. 세션 만료

  • 클라이언트가 요청한 sessionId쿠키의 값으로, 세션 저장소에 보관한 sessionId와 값 제거
  public void expire(HttpServletRequest request) {
        /// sessionStore에 저장되어있는 거를 Map에서 한 줄(map, value) 지우는 거임
        Cookie sessionCookie = findCookie(request, SESSION_COOKIE_NAME);
        if (sessionStore != null) {
            sessionStore.remove(sessionCookie.getValue());
        }
    }

 

 

출처 : 인프런 - 스프링 MVC 2편 (김영한)

반응형