Spring🌱

쿠키 vs 세션 vs JWT 토큰 방식의 개념에 대해 알아보자

전감자(◔◡◔) 2024. 11. 18. 15:07

 

SNS 서비스의 회원가입과 로그인 기능을 구현하는 중  Auth 에 대해서 알게되었다 . 

서버에서 사용자를 어떻게 기억하고 인증할까? 

 

서버가 쿠키에 사용자 정보를 저장해두고 이를 세션으로 유지한다는 식의 대략적인 정보는 이전에 들어본 적이 있었지만

제대로 알아본 적은 없는 것 같기에 이번기회에 확실히 정리해 두고 넘어가보려 한다   

 

쿠키 🍪 vs 토큰 ?

쿠키를 이용해서 서버는 사용자에 관한 것을 기억하기 위해 브라우저에 데이터를 담아둘 수 있다. 

 

 

사이트에 방문하게 되면 브라우저는 서버에 요청을 보내게 되고 서버는 이 요청에 대한 응답으로 클라이언트가 요청한 모든 데이터와 페이지 정보를 담아 주게된다. (흔히 아는 요청 - 응답 방식 ) 그리고 이때 반환하게 되는 응답에 쿠키가 존재할 수 있다. 

 

브라우저에 쿠키를 저장하게 되면 해당 웹 사이트에 방문할 때마다 브라우저는 해당 쿠키도 요청과 함께 보냄 

서버는 쿠키가 기억해둔 설정을 바탕으로 응답을 제공하게 된다. 

 

 

세션과 토큰을 이해하기 전에  

 

웹 사이트를 이용할 때 쓰는 프로토콜 HTTP 는 stateless 이다 . 

상태가 없다는건 무슨 말일까? 

 

Stateless 라 함은 서버로 가는 모든 요청이 이전의 요청들과 독립적으로 다루어진다는 뜻이다. 

즉 요청들끼리는 서로 연관성이 없고 요청이 끝나면 서버는 누가 어떤 요청을 했는지 전혀 모른다. 

그래서 즉 요청 할 때마다 우리가 누구인지 알려줘야 하는데 이 방법에 바로 세션과 토큰이 나눠져 있는 것이다. 

 

 

 

세션이란? 

 

출처 : https://coding-lks.tistory.com/165

 

로그인을 예로 들어 설명해보면 로그인 요청을 할 때 유저는 유저명(id) 과 비밀 번호를 서버에 보내게 된다. 

비밀번호가 맞다면 서버는 세션 DB 에 해당 유저를 생성하고 이 DB에서 해당 유저를 위한 세션 ID 를 

응답할 때 쿠키에 넣어 반환해주고 브라우저에 넘어왔을 때 저장되는 것이다!

 

따라서 동일한 웹사이트의 다른 페이지로 이동하게 되면 브라우저는 요청 할 때마다 세션 ID 가 포함된 

쿠키를 서버에 보낼 것이고 이 세션 ID를 DB를 통해 조회하여 해당 세션 ID 를 가진 유저가 어떤 유저인지 알 수 있게 된다.

 

세션에서 가장 중요하고 기억해야할 것은 모든 정보는 서버에 있고, 유저가 가지고 있는 것은 세션 ID 뿐이라는 것 

그리고 현재 로그인한 유저들의 모든 세션 ID 를 DB에 저장해야 한다는 점이다

 

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

=> 서비스 이용자 수가 많아지게 되면 DB 리소스가 더 많이 필요해져서 서버에 부담이 많이 걸리게 됨 

 

 

그럼 토큰은 대체 뭔데? 

 

 

그렇다면 토큰은 어떨 때 사용하는 것이고 세션이랑은 무슨 차이가 있는 것일까? 

 

앞서 말했다시피 서비스 이용자 수가 많아지게 되면 서버는 요청이 들어올 때마다 세션 DB 를 조회해야하기 때문에 부하가 많이 걸린다는 단점이 존재했다. 

 

이를 해결하기 위해 나온 것이 바로 JWT 토큰 방식이라 할 수 있다. 

 

JWT 로 인증을 처리하게 되면 세션 DB 를 갖출 필요가 없고, 서버는 유저 인증한다고 많은 일을 하지 않아도 된다. 

 

 

로그인 예시를 통해 JWT 와 세션의 차이점을 알아보자 

 


세션에서는 유저가 유저명과 비밀번호를 요청을 통해 넘겨주면 세션 DB 에 세션 ID를 생성했던 것과 달리 

토큰 방식에서는 서버는 DB에 뭔가를 생성하지 않는다. 

대신 서버는 유저가 요청을 통해 담아온 정보들을 특정 알고리즘을 이용하여 사인하고 

이 사된 정보를 string 형태로 응답을 통해 넘겨준다. 

 

그리고 요청 때마다 서버에 이 JWT 토큰을 함께 넘겨주고, 서버는 이 토큰이 유효한지 체크한 뒤 서버는 우리는 유저로 인증한다. 

 

이것이 토큰과 세션의 가장 큰 차이점이다. 

즉 페이지를 요청하면 서버는 복잡한 조회과정 없이 해당 토큰이 유효한지만 검증하면 된다. 

JWT 무조건 좋을까?

 

 

 

JWT 를 사용해야할 때 유의해야 할 점은 바로 JWT 에서 사용자 정보를 사인하여 토큰을 만든다고 했는데 이 sign 이라는 것은 

암호화를 뜻하는게 아니다. 

JWT 토큰은 누구나 꺼내서 볼 수 있다. 

 

따라서 비밀 정보를 JWT 안에 둬서는 절대 안된다는 것이다. 

 

 

세션 vs 토큰의 장단점 비교 🎟️

 

[ 세션 ]

 

장점 

- 로그인 된 유저의 모든 정보를 DB에 저장하기 때문에 해당 정보를 이용해서 새로운 기능들을 쉽게 추가할 수 있다 

- ex)  특정 유저를 쫓아내고 싶을 때 그냥 해당 세션을 삭제해버리기만 하면 됨 

- 연결된 디바이스 중 원하는 기기를 삭제, 계정 공유 숫자를 제한 

 

단점 

- 이용자 수가 늘어 날 수록 DB 리소스에 대한 부담이 커지고 수많은 요청에 마다 DB를  조회하는데에 부하가 걸림 

 

 


 

[ 토큰 ]

장점

- DB 없이도 유저인증이 가능하기에 서버 부담이 덜하다 

- 유저 규모가 작을 땐 토큰 방식이 나음 

 

단점

- 서비스 규모가 커지고 유저 정보를 좀 더 잘 관리하고 싶다면 세션 방식이 나을 수도 있음 

- 생성된 토큰을 추적하지 않고 DB가 필요없기 때문에 강제 로그아웃 등의 기능을 구현할 수는 없음 


 

[ 정리 ]

 

쿠키 = 그냥 요청, 응답 시에 기억하기 위해 옮기는 시스템 매개체 

JWT 토큰 =  사용자 정보를 가지고 있는 이상하게 생긴 긴 문자열 . DB없이 사용자 인증이 가능 

세션 =  매 요청마다 특정 ID 를 쿠키에 담아서 DB 조회후 사용자 인증