본문 바로가기

개념

session, jwt, cookie

cookie

사용자가 사이트를 방문할 때 서버에서 브라우저에 데이터를 넣을 수 있다.

 

사용자가 사이트를 방문했다고 가정하면, 사용자의 브라우저에서 서버에 요청(Request)을 보내고(브라우저 -> 서버), 

서버는 브라우저에게 응답(Response)을 보낸다.(서버 -> 브라우저)

 

서버에서 응답할 때 요청한 데이터 또는 페이지가 존재하는데, 이 응답 안에 쿠키가 존재할 수 있다.

 

쿠키의 특징으로는 아래와 같다.

  • 저장되어진 쿠키는 사용자 브라우저에서 존재한다.
  • 사용자가 요청(Request)할 때 쿠키 또한 같이 전달된다. (자동)
  • 쿠키는 도메인이 같은 경우만 전달된다(네이버에서 만든 쿠키는 네이버 서버에 요청할 때만)
  • 유효기간이 존재한다.
  • 인증 정보, 언어 정보 등 다양한 데이터를 저장할 수 있다.
  • 데이터 크키의 제약이 존재한다.
  • 서버로 전달될 경우 header에 포함된다.

 

Session과 Token의 경우 로그인 기능을 개발할 때 대표적으로 사용되는데, 개념을 이해하기 위해 Http의 특징을 알아야한다.

 

Http 프로토콜은 stateless(상태가 유지되지 않는다)이다.

stateless의 뜻은 한 브라우저에서 같은 서버로 계속 요청 할 때 서버는 같은 브라우저에서 요청을 하고 있다는 것을 모른다. 즉 이전 요청과 독립적이다.

 

로그인 후 방문할 수 있는 사이트가 있다면, 서버에게 로그인 한 상태라는 것을 보내줘야 하고, 이 때 세션과 토큰을 사용한다.

Session

로그인의 기능으로 개념을 잡아보면.

 

1. 사용자가 로그인 요청

사용자가 로그인할 때 로그인 요청과 함께 사용자 정보(계정과 비밀번호)를 요청하고,

서버에서 세션 DB에 사용자 정보를 저장한다. (DB에서 이 사용자가 있는지 검색하여 저장)

  • 이 세션 DB에는 별도의 아이디가 존재하는데, 이 아이디를 통해 사용자의 정보를 특정할 수 있다.

2. 서버에서 로그인 응답

서버에서는 응답과 함께 세션 아이디만 전달한다.

이 전달받은 세션 아이디를 쿠키에 저장한다.

  • 브라우저에선 세션을 통해 사용자 정보를 확인할 수 없고, 오로지 서버에서만 가능하다.
  • 이 상태에서 브라우저는 세션 아이디, 서버는 모든 정보를 갖고 있다.

3. 로그인 필요한 사이트 이동

사용자 브라우저는 쿠키와 함께 세션 아이디를 서버에 전달한다.

서버는 전달받은 세션 아이디를 통해 세션 DB에서 사용자 정보를 검색한다.

  • 데이터가 존재한다면 로그인한 사용자라는 뜻이다.

세션 정리

  • 서버에서 정보를 세션 DB에 저장한다.
  • 저장한 세션 ID를 브라우저에게 전달한다.
  • 브라우저는 세션 ID만 갖고 있고, 데이터는 볼 수 없다.
  • 톰캣에서는 jsessionid이라는 이름으로 저장된다.
  • Java에서는 세션 DB는 메모리 영역에 저장한다.

세션 장점

  • 강제 로그아웃 기능을 만들 수 있다. (서버에서 로그인 한 사용자 정보를 관리하고, 그 정보를 삭제하면 로그아웃)

세션 단점

  • 비용이 든다.
  • 동시 로그인한 사용자가 많다면 그 사용자 정보를 관리하기 위해 추가적인 리소스가 더 필요하다.
  • 비용이 저렴하고 속도가 빠른 redis를 많이 사용한다.

JWT(Json Web Token)

토큰의 형태는 긴 문자열이다.

DB가 필요없고 요청을 받을 때 마다 이 토큰 정보가 유효한 정보인지만 검증하면 된다.

 

로그인의 기능으로 개념을 잡아보면.

 

1. 사용자가 로그인 요청

계정과 비밀번호를 서버에 요청한다.

 

2. 서버에서 로그인 응답

서버에서는 아이디(예를 들면)으로 사인 알고리즘을 통해 jwt(사인된 정보, 문자열 형태)를 만들고,

jwt를 사용자에게 응답한다.

  • 생성의 경우 secret key가 서버에 존재하고 이 키를 통해 jwt를 발급(서명)한다.

3. 로그인 필요한 사이트 이동

jwt를 쿠키와 함께 서버로 요청하면 서버에서는 이 jwt가 유효한지 검증한다.

  • 검증의 경우 발급할 때 사용한 secret Key를 통해 유효한지 검증한다.

특징

  • 크기 제약이 없어서 엄청 길어도 상관없다.
  • 암호화가 되어 있지 않다. 비밀번호를 jwt에 넣으면 안된다.
  • secret key는 외부에 유출되면 안된다.

장점

  • 동시 접속 사용자가 많아져도 추가적인 리소스가 필요하지는 않다.

단점

  • 강제 로그아웃 기능은 만들 수 없다.