2 minute read

로그인 구현에 필요한 쿠키, 토큰, 세션, JWT에 대해서 알아보자.

정보를 기억하기 위해 브라우저에 데이터를 넣는다.

브라우저는 서버에 요청(Request)를 보내고, 서버는 브라우저에 응답(Response)를 보낸다.

이 때, 서버는 브라우저에게 보내는 응답에 쿠키를 담아서 보낸다.

쿠키는 도메인에 따라서 제한되는데, 예를 들어 유튜브가 준 쿠키는 유튜브에만 보내진다.

또한 서버에서 정한 유효기간이 있으며, 인증에 관한 정보 뿐만이 아니라 여러가지 정보를 저장한다.

어떤 페이지를 영어로 보기 위해 영어로 언어 설정을 하면, 서버가 브라우저에게

언어 설정 쿠키를 주고, 다음에 브라우저가 접속했을 때 서버에 요청과 함께 언어 설정이 담긴 쿠키를

서버에게 보내 설정된 언어 페이지를 제공한다.

세션 & 토큰

이전에 배웠던 HTTP는 무상태성(Stateless) 이라는 특성을 가진 프로토콜이다..

이 무상태성이 무엇이냐면, 서버로 가는 모든 요청이 이전 요청(Request)과 독립적으로 이루어 진다는 것이다.

요청이 끝나면 정보가 사라지기 때문에, 새로운 요청을 보낼 때마다 내가 누구인지 서버에 알려줘야 한다.

내가 누구인지 알리는 방법중 하나가 세션(Session)이다.

내가(NH) id, password를 서버에 보내고, 정보가 일치하면 서버는 세션 DB에 NH라는 유저를 생성한다.

이 세션 DB의 ID를 서버가 쿠키를 통ㅎ해 브라우저에게 전달하고, 저장된다.

그래서 같은 웹사이트의 다른 페이지로 이동하면 브라우저는 세션 ID가 담긴 쿠키를 서버에 보내고,

서버는 그 쿠키를 받아서 세션 DB를 확인한 뒤 누구인지 파악한다.

이 요청이 끝난 뒤 다른 페이지로 이동시 앞서 했던 프로세스를 반복한다.

이 때, 중요한 모든 유저 정보는 서버에 있고, 유저가 갖고 있는건 세션 ID뿐이다.

(쿠키는 그저 세션 ID를 전달하는 매개체이다)

요청이 들어올 때마다 서버는 쿠키를 받아서 세션 ID를 보고 세션 ID와 일치하는 유저를 찾아야 하고,

그 후에 다음 작업을 수행할 수 있다.

이 때, 요청이 들어올 떄마다 DB를 찾아봐야 하므로 유저가 많아질수록 DB리소스가 더 필요하게 된다.

그래서, DB에 정보를 저장하지 않는 JWT가 등장한다.

JWT는 세션 DB를 가질 필요가 없고, 유저 인증을 하느라 서버가 과부하에 걸릴 일도 없다.

(코로나로 난리인 요즘, 어딜 가도 찍게되는 QR인증이 JWT 방식)

(유저 id와 password를 서버에 넘겼을 때, 세션은 DB에 정보를 생성, JWT는 생성하지 않는다.)

서버에 요청하려면 해싱 정보 혹은 토큰을 서버에 넘기고, 서버는 그것이 유효한지 체크한다.

만약 유효하다면, 유저로 인증한다. 이것이 JWT.

  • Session
    • 세션 ID만 보낸다
    • 세션의 모든 정보는 세션 DB에 있다.
    • 페이지 요청시 서버는 세션ID를 DB에서 찾는다
    • 장점 → 로그인된 모든 유저의 모든 정보를 서버에 저장해놓기 때문에 관리가 용이하다. (저장해 놓은 Session ID를 파기해 강제로 로그아웃을 시킨다던지, 어떤 유저가 로그인 되어있는지 등을 파악할 수 있다)
    • 단점 → 유저가 늘어날수록 DB역시 커져야 하기 떄문에 비용이 많이든다.
  • JWT
    • 서버는 유저를 인증하는데 필요한 정보를 토큰에 저장하고, 해당 토큰을 우리에게 준다.
    • 페이지를 요청하면 서버는 해당 토큰이 유효한지 검증한다 (DB를 거치지 않는다)
    • JWT는 암호화가 되어있지 않기 때문에 비밀 정보 등의 중요정보를 담아두면 안된다.
    • 장점 → 토큰의 유효성만을 따지기 때문에 DB를 따로 구축, 구매할 필요가 없다 (세션이나 DB 없이 유저를 인증한다. 서비스가 더 커지고 유저 계정 관리를 용이하게 하고 싶다면 세션방식으로 넘어간다)
    • 단점 → 위의 Session의 장점이었던 강제 로그아웃, 로그인중인 유저 확인 등을 하지 못한다. (해당 토큰이 만료되기 전까진 유효하므로)

한줄 요약(?)

쿠키 (Cookie) → 정보를 옮기는 매개체

토큰 (Token) → 서버가 기억하는 텍스트. 신분증처럼 서버에게 보여준다

JWT → 정보를 갖고있는 토큰. DB없이 검증한다.

유저 인증을 위해서 JWT & Session을 이용한다.

Updated: