[NETWORK]쿠키&세션&토큰&JWT
쿠키
- 쿠키를 이용해서 서버는 내 브라우저에 데이터를 넣을 수 있다.(나에 관한것을 기억하기 위해서!)
- 내가 브라우저에 쿠키를 저장한 후, 해당 웹사이트를 방문할 때마다 브라우저는 해당 쿠키도 요청과 함께 보내주게 됨!
- 쿠키는 도메인에 따라 제한이 됨(유튜브가 준 쿠키는 유튜브에만 보내지게 된다.)
- 쿠키는 유효기간이 존재한다(서버가 정한 기간에 따라서..)
- 쿠키는 인증 뿐만 아니라, 여러가지 정보를 저장할 수 있다.
세션과 토큰
웹사이트를 이용할때 쓰는 프로토콜 http는 stateless이다.
stateless란 서버로 가는 모든 요청이 이전 요청과 독립적으로 다뤄진다는 뜻이다. 즉 요청끼리 연결이없음. 요청이 끝나면 서버는 내가 누군지 잊어버리게 된다! 따라서 요청 할 때마다 우리가 누군지 알려줘야 함 -> 이것을 하는 방법중 하나가 바로 세션(Session)이다.
만약 ‘Song’이라는 유저명이 있고 로그인을 하고 싶다면 유저명 그리고 비밀번호를 서버에 보내고, 비밀번호가 맞다면 서버는 세션 db에 ‘Song’이라는 유저를 생성함
해당 세션에는 별도의 id가 있다.
해당 세션id는 쿠키를 통해 브라우저로 돌아오고 저장됨!
따라서 같은 웹사이트의 다른 페이지로 이동하면 브라우저는 세션ID를 갖고있는 쿠키를 서버에게 보낸다.
쿠키는 사용자가 따로 요청하지 않아도 브라우저가 Request시에 Request Header를 넣어서 자동으로 서버에 전송함
서버는 세션id가 있는 쿠키를 지닌 요청이 있다는 것만 알 뿐 아직까지 우리가 누구인지 모름!
해당 세션id를 가지고 세션db를 확인하고, 거기서 해당 id는 유저명 ‘Song’이라는 것을 알게되고 그제서야 서버는 우리가 누구인지 알게된다.
해당 요청이 끝나고 다른페이지로 이동하게 되면 이 모든 프로세스가 반복된다.
기억해야할건! 중요한 유저 정보는 모두 서버에 있다는 것!!!
유저가 갖고 있는 것은 세션id일 뿐이다.
쿠키는 그저 세션을 전달하기 위한 매개체 이다.
세션을 이용해서 IOS, Android 앱을 만들 수 있지만 쿠키는 사용할 수 없다. 쿠키는 브라우저에만 있기
때문 ! -> 이를 해결하기 위해서 토큰을 사용한다.
토큰은 그냥 이상하게 생긴 string이다.
해당 토큰은 서버로 보내지게 되고, 서버는 세션 DB에서 해당 토큰과 일치하는 유저를 찾는다.
★세션에 대해서 가장 중요하게 알아야 할 것은 현재 로그인한 유저들의 모든 세션ID를 DB에 저장해야 한다는 것이다. 👉 즉 요청이 있을때마다 DB를 찾고 해야 한다. 👉 유저가 늘어남에 따라 DB 리소스가 더 필요하게 된다.
jwt
- JWT는 토큰 형식이다
- JWT로 유저 인증을 처리하면 세션 DB를 가질 필요가 없고, 서버는 유저 인증한다고 많은 일을 하지 않아도 됨!
유저가 로그인 할 때 유저명, 비번이 맞다면 서버는 db에 뭔가를 생성하지 않음. 대신 서버는 유저의 id를 가져다가 사인 알고리즘을 이용해서 ‘사인’을 한다. 그리고 해당 ‘사인된 정보’를 string 형태로 보낸다.
즉 동일하게 로그인 했는데 session과 달리 db를 건드리는 대신 정보를 사인하고, 전달하는 것이 다임.
이제 서버에 요청을 보내려면 세션id와 비슷하게 해당 ‘사인된 정보’혹은 토큰을 서버에 보내야 함.
서버는 토큰을 받으면 해당 사인이 유효한지 체크하고 유효하다면 서버는 우리를 유저로 인증한다.
jwt에서 서버는 유저를 인증하는데 필요한 정보를 토큰에 저장한다. 그리고선 해당 토큰을 우리에게 줌 페이지를 요청하면 서버는 해당 토큰이 유효한지만 검증하면 됨.
염두할 것 : jwt는 암호화 되지 않음. 누구나 열어서 해당 컨텐츠를 볼 수 있음.
세션 vs jwt 장단점
- 세션 : 서버는 로그인된 유저의 모든 정보를 저장함. 해당 정보를 이용하면 새로운 기능(강제 로그아웃)들을 추가할 수 있음
- jwt : 생성된 토큰을 추적하지 않음. 서버가 아는 것은 토큰이 유효한가 여부일 뿐이다. 강제 로그아웃 과 같은 기능을 할 수 없다.
댓글남기기