로그인 정보 저장 방식: Session과 Token의 차이

노현아·2024년 4월 17일

사용자의 로그인 정보를 유지하고 저장하는 방식은 크게 세션 방식과 토큰 방식으로 나뉜다. 각각의 방식은 보안성, 확장성, 사용 편의성 등에서 차이가 있다.

세션(Session) 방식

서버 측에서 사용자의 로그인 정보를 유지하고 저장하는 방식이다.

  • 저장 위치: 서버의 메모리나 데이터베이스 등 서버 자원이다.
  • 쿠키: 주로 세션 ID를 저장하여 세션 관리를 도와준다. 또한 개인 설정 유지, 사용자 트래킹(로그인 유지, 방문 기록) 등을 위해 사용된다.
  • 보안성: 토큰 방식보다 보안에 강하다. 세션 정보가 서버에 저장되기 때문에 클라이언트 측에서 조작이 어렵다.
  • 확장성: 서버 확장성이 떨어진다. 서버 자원이 많이 필요하며, 트래픽이 분산된 환경에서는 세션 정보를 공유하기 어렵다.
  • 단점: 여러 대의 서버를 사용할 때, 사용자가 처음 로그인한 서버에만 요청을 보내야 하는 제약이 있다. 이를 해결하기 위해 Redis와 같은 외부 세션 저장소를 사용할 수 있다.

세션 방식에서는 사용자가 인증되면 서버가 세션 ID를 생성하고 이를 클라이언트에게 전달한다. 클라이언트는 세션 ID를 쿠키에 저장하고, 이후 요청 시 해당 쿠키를 서버에 전송하여 인증을 유지한다.

로그인 과정

  1. 사용자 로그인 요청: 사용자가 로그인 폼에 아이디와 비밀번호를 입력하고 서버에 로그인 요청을 보낸다.
  2. 서버 인증: 서버는 데이터베이스에서 사용자의 아이디와 비밀번호를 확인하여 인증을 수행한다.
  3. 세션 생성: 인증에 성공하면 서버는 고유한 세션 ID를 생성하고, 이를 서버의 메모리나 데이터베이스에 저장한다.
  4. 세션 ID 전달: 서버는 생성된 세션 ID를 클라이언트에게 쿠키로 전달한다.
  5. 클라이언트 쿠키 저장: 클라이언트는 서버로부터 받은 세션 ID를 브라우저의 쿠키에 저장한다.
  6. 요청 시 쿠키 전송: 이후 클라이언트가 서버에 요청을 보낼 때마다, 브라우저는 자동으로 세션 ID가 포함된 쿠키를 서버에 전송한다.
  7. 서버 세션 확인: 서버는 요청에 포함된 세션 ID를 확인하여 해당 사용자의 세션 정보를 조회하고, 인증된 사용자의 요청으로 처리한다.

로그아웃 과정

  1. 로그아웃 요청: 사용자가 로그아웃 요청을 서버에 보낸다.
  2. 서버 세션 삭제: 서버는 해당 사용자의 세션 정보를 삭제하거나 무효화한다.
  3. 클라이언트 쿠키 삭제: 클라이언트는 브라우저에서 세션 ID가 저장된 쿠키를 삭제한다.

토큰(Token) 방식

클라이언트 측에서 로그인 정보를 유지하는 방식이다. 주로 JWT(Json Web Token)를 사용한다.

  1. 저장 위치: 클라이언트 측 브라우저 저장소(로컬 스토리지, 세션 스토리지, 쿠키 등)이다.
  2. 확장성: 서버에 저장하지 않으므로 서버 확장성이 뛰어나다. 어떤 서버로 요청을 보내도 상관없다.
  3. JWT: 인증에 필요한 정보를 암호화한 토큰이다. HTTP 헤더에 포함되어 서버가 클라이언트를 식별한다.
    • 구조: 헤더(Header), 페이로드(Payload), 시그니처(Signature)로 구성된다.
    • 보안: JSON 데이터를 Base64 URL-safe Encode로 인코딩하며, 위변조 방지를 위해 전자 서명을 포함한다. JWT는 기본적으로 암호화되지 않으므로 민감한 정보를 포함해서는 안 된다.
  4. 장점: 서버 부하가 적고, 확장성이 뛰어나다. 서버 간 세션 공유가 필요 없기 때문에 분산 서버 환경에서 유리하다.
  5. 단점: 클라이언트 측에서 토큰이 탈취될 경우 보안 문제가 발생할 수 있다. 따라서 HTTPS를 통해 전송하고, 토큰의 유효 기간을 짧게 설정하는 등의 보안 조치가 필요하다.

토큰 방식에서는 사용자가 인증되면 서버가 JWT를 생성하고 이를 클라이언트에게 전달한다. 클라이언트는 토큰을 저장하고, 이후 요청 시 해당 토큰을 서버에 전송하여 인증을 유지한다.

로그인 과정

  1. 사용자 로그인 요청: 사용자가 로그인 폼에 아이디와 비밀번호를 입력하고 서버에 로그인 요청을 보낸다.
  2. 서버 인증: 서버는 데이터베이스에서 사용자의 아이디와 비밀번호를 확인하여 인증을 수행한다.
  3. JWT 생성: 인증에 성공하면 서버는 사용자 정보를 포함한 JWT를 생성한다.
  4. 토큰 전달: 서버는 생성된 JWT를 클라이언트에게 응답으로 전달한다.
  5. 클라이언트 저장: 클라이언트는 서버로부터 받은 JWT를 로컬 스토리지, 세션 스토리지 또는 쿠키에 저장한다.
  6. 요청 시 토큰 전송: 이후 클라이언트가 서버에 요청을 보낼 때마다, HTTP 헤더에 JWT를 포함하여 전송한다.
  7. 서버 토큰 확인: 서버는 요청에 포함된 JWT를 검증하여, 유효한 토큰인 경우 해당 사용자의 요청으로 처리한다.

로그아웃 과정

  1. 로그아웃 요청: 사용자가 로그아웃 요청을 서버에 보낸다.
  2. 클라이언트 토큰 삭제: 클라이언트는 로컬 스토리지, 세션 스토리지 또는 쿠키에서 JWT를 삭제한다.
  3. 서버 처리: 서버는 별도의 세션 정보를 유지하지 않으므로, 추가적인 서버 측 처리가 필요하지 않다. (단, 서버가 블랙리스트를 유지하여 특정 토큰을 무효화하는 방식으로 로그아웃을 처리할 수도 있다.)
profile
성실함과 끊임없는 학습을 통해 성장하는 개발자 지망생입니다. 새로운 도전과 배움을 즐기며 더 나은 코드를 꿈꿉니다.

0개의 댓글