Session(세션)과 Cookie(쿠키) 🥠

jiji·2023년 11월 12일
0

Spring Boot Project 🌱

목록 보기
14/16

👩🏻‍🦰 로그인 페이지에서 ID와 PW를 서버로 전송했을 때, 서버에서 로그인을 처리하는 로직의 위치를 파악하고, 로그인 한 이후로 이 상태가 유지되어야 한다!

먼저 HTTP에 대해 알아보자!

🧐 HTTP 통신

  1. 'HTTP는 연결을 유지 하지 않는다'라는 특징이 있다.
    그렇기 때문에 클라이언트와 한번 통신이 일어나고 나면 그 연결이 끊어진다.
  2. 'HTTP는 상태를 유지 하지 않는다'
    로그인을 구현할 경우 사용자가 서버로 요청을 보낼 때 마다, 자신이 누구인지 인증을 해주어야 한다는 점!

➡️ 로그인을 유지 할 수 있는 안전한 방법

1. 세션 (Session) - 서버 유지

서버의 메모리, 데이터 베이스와 같은 서버 자원을 사용해서 사용자의 정보를 유지한다.

👍🏻 장점

  • 토큰 방식보다 보안에 강하다는 장점
    - 토큰은 클라이언트가 토큰을 가지고있어서, 위조나 분실의 위험성을 가지고 있음.
    - 토큰은 쿠키보다 위조방지나 등등의 개념을 가지고 있음.
    - 세션은 서버당 하나, 그래서 토큰은 하나를 가지고 여러서버에 들어갈 수 있다.
    - 토큰은 다중 서버 가능
    👎🏻 단점
  • 서버의 확장성이 떨어진다
  • 서버의 자원(세션을 저장, 유지할 공간)이 필요하다.
  • 또한 세션이 서버에 저장이 되고, 트래픽 분산을 위해서 여러 대의 서버를 사용할 때
    만약 사용자가 로그인을 했을 때는 만들어진 세션을 참조해야 하기 때문에
    처음 로그인한 그 서버에서만 요청을 보내야 한다는 단점이 있다.

2. 토큰 (Token)

토큰 방식은 사용자가 로그인을 하면 서버에서 발행해주는 토큰을 가지고
브라우저의 저장소에 토큰을 유지시키는 방법이다.
ex. JWT을 통한 로그인

👍🏻 장점

  • 서버에 저장하지 않아서 서버에 확장성이 있다.
    위에서 말했듯 로그인을 했을 때 해당 서버에만 요청을 보내는 것이 아닌
    요청이 들어왔을 때 해당 토큰이 유효한지만 체크하면 되기 때문에
    어떤 서버로 요청을 보내도 상관이 없다는 뜻이다.

1) Session

  • 웹사이트에서 사용자가 머무르는 기간 또는 한 명의 사용자의 한번의 방문을 의미한다.
  • Cookie와 다르게 개인 아이디와 비밀번호 같은 웹사이트의 데이터는 Server에 저장되거나 웹브라우저의 캐시에 저장되어 브라우저가 닫히거나 서버에서 삭제 시 사라진다.
  • 사용자 정보를 유지할 수 없다는 HTTP고유의 한계를 극복할 수 있는 방법
  • 인터넷 웹사이트의 방문 기록을 남겨 사용자와 웹사이트 사이를 매개해 주는 정보이다.
  • Cookie는 인터넷 사용자가 특정 웹서버에 접속할 때, 생성되는 개인 아이디와 비밀번호, 방문한 사이트의 정보를 담은 임시 파일로써, Server가 아닌 Client에 텍스트파일로 저장되어있어 다음에 해당 웹서버를 찾을 경우 웹서버에서는 그가 누구인지 어떤 정보를 주로 찾았는지 등을 파악할 때 사용한다
    • 주로 사용자 추적, 로그인 상태 유지, 사용자 환경 설정 저장 등과 같은 목적으로 사용됩니다.
    • 보안 문제가 있을 수 있으며, 중요한 데이터를 저장할 때는 주의해야 합니다. 브라우저에서 수정 가능하므로 중요한 정보를 담는 데는 적합하지 않습니다.

🖥️ 구현하기

👩🏻‍🦰 중요 정보는 서버의 세션 저장소에 key/value로 저장한 뒤 브라우저에서는 key값만 가지고 있도록 하자!

1. 세션을 통한 로그인 처리

public String login(LoginRequestDTO dto
      , HttpServletRequest request
      , HttpServletResponse response
  )
  1. 컨트롤러에서 LoginRequestDTO를 통해 로그인에 필요한 정보를 클라이언트로부터 요청
public class LoginRequestDTO {
    private String id;
    private String pwd;
    private boolean autoLogin; //자동로그인 체크 여부
}
  1. DTO의 id를 통해 DB에 해당 사용자가 있는지 검색

  2. 있다면
    HttpServletRequestgetSession()을 통해 HttpSession 전달

    a. key : LOGIN_KEY, velue : 필요한 정보
    b. 세션 시간 설정

session.setAttribute(LoginUtil.LOGIN_KEY, foundUser);
session.setMaxInactiveInterval(60 * 60 * 24); // 세션 - 1일

➡ Key 값을 통해 로그인한 사용자의 정보를 가져올 수 있습니다. 이를 통해 로그인 후에도 사용자 정보를 유지하고, 필요한 경우 세션을 통해 사용자 데이터를 조회할 수 있게 됩니다.

2. 쿠키를 이용한 자동로그인 처리

Cookie autoLoginCookie 
	= new Cookie(LoginUtil.AUTO_LOGIN_COOKIE, session.getId());
      autoLoginCookie.setMaxAge(60 * 60 * 24); // 쿠키 사용 시간 (1일)
      autoLoginCookie.setPath("/"); //전체경로 설정
      
      // 쿠키 응답 전송
      response.addCookie(autoLoginCookie);
      
      // DB 유저 정보에 쿠키값 저장하기
      AutoLoginDTO autoDTO = AutoLoginDTO.builder()
          .sessionId(session.getId())
          .id(dto.getId())
          .cookieLimitTime(LocalDateTime.now().plusDays(30))
          .build();

      userMapper.saveAutoLogin(autoDTO);

➡ 세션 ID를 쿠키로 클라이언트에게 전송하고, 서버에서는 이 ID를 통해 세션을 식별하여 해당 유저의 정보를 로드한다.


[참조]
https://velog.io/@junghyeonsu/프론트에서-로그인을-처리하는-방법

0개의 댓글