[WEB] 쿠키(Cookie), 세션(Session), 토큰(Token), JWT 의미와 차이점

2023. 1. 24. 16:07IT

쿠키, 세션, 토큰, JWT 의미와 차이점

 

인터넷을 사용하거나 개발 관련 일을 하다보면 

쿠키, 세션, 토큰, JWT라는 단어에 대해 많이 듣게된다.

 

 

이모티콘

이것들이 대체 무엇이고 어디에 사용하기에

사람들이 계속 말하고 사용하는지 한번 알아보자!!!

 

먼저, 간단하게 쿠키, 세션, 토큰, JWT에 대해 알아보고

아래에서 자세히 알아보자!!!

 

1. 쿠키 : 무언가를 옮기는 매개체

2. 세션 : 사용자의 모든 정보를 가진 시스템
3. 토큰 : 서버가 기억하는 이상하게 생긴 텍스트
4. JWT : 사용자 정보를 갖고 있는 토큰

 

 

지금 당장은 위에서 말하는 것들이 무슨뜻인지 정확하게

이해가는 힘들다.

 

나는 평소 유튜브를 통해 공부하는 것을 좋아하기 때문에

즐겨보는 '노마드 코더'님의 유튜브를 보며 공부했다!!!

 

영상 아래에 공부한 내용들을 적어놨으니 영상과 함께 보면 도움이 될것이다!

'노마드 코더 Nomad Coders'님의 유튜브

 

1. 쿠키(Cookie)

 

쿠키는 서버가 나의 브라우저(크롬)에

나의 관한 정보를 기억하기 위한 작은 공간이다.

 

우리가 사이트에 방문하면 브라우저는 서버에 요청을 보내고

서버는 응답으로 내가 찾던 페이지에 대한

정보와 브라우저에 저장하고 싶은 정보를 담을 쿠키를 포함시켜 전송한다.

 

이제 사용자가 웹 사이트를 이용하면서

편의성을 위해 설정한 내용들을
브라우저는 쿠키에 담아 서버에 보낸다.

 

만약 웹 사이트의 언어설정을 바꾼다면

서버는 브라우저에 쿠키를 주고

브라우저는 언어설정에 관한 정보를 쿠키에 담아 서버에 응답한다.

 

이 쿠키는 내 브라우저에 저장되어 있어

다음에 다시 방문하게 된다면 브라우저는

정보가 저장된 쿠키를 서버에 보내고 서버는 저장된 정보를 바탕으로

사용자에게 알맞는 페이지를 제공한다.


또한, 쿠키는 도메인에 따라 제한되는데

만약 유튜브가 준 쿠키가 있다면

그 쿠기는 유트브에서만 사용되며 서버가 설정한 유효기간 동안 사용가능하다.

 

2. 세션(Session)

 

'노마드 코더 Nomad Coders'님의 유튜브

세션은 인증을 위한 쿠키 기반 시스템이다.

 

세션에 대해 이해하기 위해서는

우선 HTTP 프로토콜에 대한 이해가 필요하다.

 

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

Stateless 특징을 가져

서버로 가는 모든 요청이 이전 요청과 독립접으로 다뤄진다.

 

따라서, 내가 어떠한 웹 사이트에 로그인을 하여도

요청마다 서버는 나에 대한 정보를 바로 잊어버리기 때문에

요청할 때마다 내가 누군지 알려줘야하는데

그 방법중 하나가 세션이다.

 

내가 로그인을 하고 싶다면 ID와 PW를 서버에 보내고

ID와 PW가 맞다면 서버는 세션 DB에 해당 유저를 생성한다.


해당 세션에는 별도의 ID가 있고

이 ID는 쿠키를 통해 브라우저로 돌아가고 저장된다.


사용자가 웹 사이트에 다른 페이지로 이동하면

브라우저는 세션 ID를 갖고있는 쿠키를 서버에 보낸다.


서버는 쿠키의 요청이 있음을 확인하고 세션 DB를 확인한다.

(해당 유저임을 확인하는 프로세스는 다른 페이지로 이동할때마다 반복)

 

사용자에 대한 중요한 정보를 쿠키에 담아 매번

요청과 응답이 반복된다면 보안상에 큰 문제가 발생할 것이다.

 
하지만, 사용자에 대한 중요 정보는 모두 서버에 있고

해당 브라우저에 있는 쿠키에는 세션 ID만 존재하여 보안성을 유지한다.

 

이러한 기능을 웹 사이트 뿐만아니라
IOS, Android 모바일 앱을 만들 수 있지만

쿠키는 사용할 수 없다.

 

쿠키는 브라우저에만 존재하기 때문이다.

(쿠키 컨테이너 사용 -> 복잡)

 

이러한 경우에 토큰을 사용한다!!!

 

 

3. 토큰(Token)

 

토큰은 그냥 이상하게 생긴 문자열이다.

그렇다면, 사람들은 단순한 문자열인 토큰을 사용하는 이유가 무엇일까?

 

바로 세션의 단점을 해결하기 위해 사용한다.

 

세션은 현재 로그인한 사용자들의 모든 세션 ID를 DB에 저장하는데

요청이 들어올때마다 쿠키를 받아서 세션 ID를 보고 DB에서

일치하는 사용자를 찾고난 후
해당 요청에 대한 작업을 진행하므로 사용자가 많아질수록 더 많은 DB가 필요하게 된다.

 

그래서 토큰형식의 JWT가 등장한다.

 

 

4. JWT(JSON Web Token)

 

JWT는 인증을 위한 토큰 기반 시스템이다.

 

JWT로 사용자 인증을 처리하면 서버는 세션 DB를 가질 필요 없이

유저 인증에 많은 일을 하지 않아도 된다.

내가 로그인을 하고 싶다면 ID와 PW를 서버에 보내고

ID와 PW가 맞다면 서버는 해당 사용자에 대한 정보를 저장하지 않는다.


서버는 그저 ID를 가져다 사인 알고리즘을 통해 '사인'을 하면

사인된 정보를 문자열 형태로 사용자에게 보낸다.
(이 토큰은 보통의 세션ID보다 훨씬 길다)

 

이제 사용자가 다른 페이지로 이동할려면

사인된 정보(토큰)을 서버로 보낸다


서버는 토큰을 받으면 해당 사인이 유효한지 확인하고

토큰이 유효하다면 서버는 유저로 인증한다.


JWT는 암호화되어 있지 않다. 

암호화 되었다면 아무도 읽을 수 없고 이해할 수 없지만 JWT는 누구나 열어서 확인할 수 있다.
따라서 중요한 정보를 담아서는 안된다

 

 

5. 세션 VS JWT

세션은 단지 세션 ID만 사용자에게 보내주고

세션에 대한 모든 정보는 DB에 저장한다.

 

JWT는 유저인증을 위해 필요한 정보를 토큰에 저장하고

서버는 토큰이 유효한지 검증만 하면 된다.

 

세션은 로그인 된 사용자의 모든 정보를 저장하여 새로운 기능을 추가할수있다.

예를 들어, 특정 유저를 로그아웃시키고 싶다면 해당 유저의 세션을 삭제하거나

넷플릭스처럼 로그인 인원 수를 제한할 수도 있다.


이러한 것들이 가능한 이유는 사용자에 대한 모든 정보가 있는 세션 DB가 있기 때문이다.
이러한 DB에 존재는 장점이자 단점이다.


JWT는 생성된 토큰을 추적하지 않는다.

서버가 아는 것은 토큰이 유효한지 아닌지에 대한 여부일 뿐이다.
따라서, 따로 DB를 사용할 필요가 없지만 새로운 기능들은 사용할 수 없다.

해당 토큰이 만료되기 전까지는 유효하기 때문이다.
하지만 빠르고 가볍다.

한국에서는 코로나때 사용한 QR코드 인증이 있다.

따라서 초반에는 가볍고 빠른 JWT가

서비스가 커지고 관리가 필요하다면 세션이 더 많은 장점을 가져갈 것이다.