본문 바로가기

Node.js 도전기

Node.js_쿠키, 세션, 토큰 (feat.인증, 로그인)

[알아보고자 하는 것]
1. 쿠키 
2. 세션
3. jwt토큰

 

#0.  들어가며

우리가 쿠키, 세션, 토큰을 알아야하는 이유는 인증(Authenticate) 때문이 큰 이유 중 하나일 것이다.

인증이란 말이 거창하게 들리겠지만 사실은 회원가입이 존재하는 모든 서비스는 이 사용자가 우리의 회원인지 인증하는 절차 즉 로그인이 자연스럽게 필요할텐데 바로 로그인이 인증의 가장 쉬운 예가 아닐까 싶다 !

 

좀 더 나아가 생각해보면 !

우리가 한번 로그인 한 이후 계속해서 로그인이 지속되기 때문에 회원만 가능한 서비스를 이용하고 있다. 

(서비스를 이용하거나 서비스의 다른 페이지로 접속할 때마다 로그인을 하라고 하면 얼마나.. 짜증날까..?) 

 

로그인을 위해 필요한 것들이 무엇인지 정리해보자 !

 

#1.  쿠키란  !? 

쿠키는 브라우저에서 정보를 저장할 수 있는 도구이다. 

 

클라이언트(유저)가 브라우저를 통해 서버에 요청을 보내면, 서버는 응답 시 쿠키에 정보들을 담아 클라이언트에게 보낼 수 있다.

쿠키에 담긴 정보들은 브라우저에 저장된다 ! 

브라우저에 쿠키에 데이터가 저장된 모습 !

해당 클라이언트는 동일한 도메인에서 다시 서버에 요청 시 쿠키를 요청과 함께 보내게 된다. 

(쿠키는 도메인에 따라 제한되어 있다.

즉 네이버에서 사용하는 쿠키는 네이버 도메인과 서브 도메인에서만 사용이 가능하고 카카오에서는 사용이 불가하다는 말씀 ! )

 

물론 저장된 정보는 서버가 지정한 유효기간 동안 저장되어 있으며

여기에는 유저를 식별할 수 있는 정보 뿐 아니라 다른 정보들도 저장할 수 있는데

해당 페이지의 언어 혹은 테마를 클라이언트가 저장하면 저장된 정보를 토대로 서버가 응답해줄 수 있다.

 

즉 쿠키는 특정한 데이터 라기보다는 서버가 전달해준 데이터를 저장해서 전달하는 도구일 뿐 이라고 이해할 수 있겠다.

(혈액에서 산소(데이터)를 전달하는 적혈구(쿠키)처럼..ㅋ) 

 

#2. 세션 (Session)

우리가 인터넷을 통해 통신하는 규약인 http 프로토콜은 stateless 즉 정보를 기억하지 않는다. 

우리가 서버에 요청한는 것들끼리의 연결고리가 없다 즉 매번 같은 요청을 보내도 항상 새로운 요청처럼 받아드린다는 의미이다. 

 

즉 요청한 사람이 저 여기 회원이에요 라고 요청한 다음에 응답을 받아도 다른 서비스를 이용하려면 다시 요청해야 한다는 의미이다.

(로그인이 유지되지 않는다.

 

이를 해결하는 방법 중 하나가 바로 세션(Session)이다. 

[세션(Session)을 이용한 인증 프로세스]
1. 로그인 시(서버에게 요청) 아이디와 비밀번호가 일치하면 서버는 Session DB에 로그인한 A유저를 생성한다.
Session DB는 별도의 SessionID 를 가지고 있어 그 SessionID를 쿠키에 담아 유저에게 응답한다. 

2. 로그인 이후 다음 서비스를 위해 서버에 요청 시 클라이언트는 자동으로 쿠키에 받은 SessionID를 서버에 전달한다.

3. 서버는 쿠키에 SessionID를 확인하여 SessionDB를 찾아 유저정보를 확인하여 응답한다. 

4. 다른 페이지로 이동될 때마다 위 단계가 반복된다. 

 

여기서 기억해야할 것은

로그인한 모든 유저의 정보를 세션DB에 저장해야하고 요청이 올때마다 세션ID를 가지고 유저 정보를 DB에서 찾아야 한다.

자연스럽게 이용자가 기하급수적으로 많아지면 그만큼 서버 과부화의 문제가 생길 수 있다. 

 

다만 세션 DB에 유저 정보를 담아놓게 된다면, 

현재 로그인 된 기기가 무엇인지 확인할 수 있으며 넷플릭스와 같이 계정 공유를 제한할 수 있다.

 

하지만 위에 언급한 것 처럼 유저가 많을수록 많은 데이터베이스 리소스가 필요하다.

 

위와 같은 문제를 해결하기 위해 나온 것이 아래 토큰이다 !

 

#3. 토큰(Token) 

토큰은 직관적으로 알수 없는 문자열 이다.

 

토큰 중에서 가장 많이 쓰이는 것이 JWT(JSON WEB TOKEN) 토큰인데, 특정 정보를 인코딩 한 문자열 이다. 

[토큰을 이용한 인증 프로세스]
1. 클라이언트(유저)가 아이디와 비밀번호를 입력하여 서버에게 로그인 요청 

2. 서버는 아이디 비밀번호가 일치하는지 확인하고
유저 정보를 식별할 수 있는 정보(user_id 등)를 JWT 형식으로 인코딩하여 클라이언트에게 전달
(암호화 시에는 특정 사인 알고리즘을 통해서 사인(Secret-Key))

3. 클라이언트는 다른 서비스를 요청할 때 쿠키를 통해 받은 JWT토큰을 서버에게 전달

4. 서버는 JWT토큰의 사인(Secret-Key)가 유효한지 확인하고, 원하는 응답 전달

 

세션과의 차이점은 세션은 세션 DB에 유저 정보가 들어가 있고 세션ID를 가지고 세션 DB를 찾아야 하지만 

토큰은 인증된 사인만 확인하면 되기에 DB를 사용하지 않는다. 

 

단, JWT는 형식만 특정한 문자열로 표현될 뿐 그 안에 담긴 데이터는 누구나 확인할 수 있다. 

따라서 단순하게 유저 정보를 식별할 수 있는 정보만 담아야 하고 민감한 정보는 절대 담아서는 안된다.

[JWT 토큰 형식] 
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

. 으로 구분하여 <헤더(Header)>.<페이로드(Payload)>.<시그니처(Signature)> 으로 구성되어 있다.

1) 헤더 : 해시 알고리즘과 타입 정보 
2) 페이로드 : 저장한 정보
3) 시그니처 :
서명 정보(Secret Key)

jwt.io에서 누구나 해당 payload안 에 있는 정보를 볼 수 있다.

 

JWT 토큰을 이용하면 DB를 따로 구축할 필요가 없다. 

하지만 세션을 이용할 때에 사용했던 로그인 된 기기를 확인하거나 공유 계정을 제한하는 기능은 사용하지 못한다. 

 

이번 포스팅을 진행하며 참고한 블로그와 유튜브가 있는데 한번 확인하면 좋을듯 하여 남긴다. 

 

세션 vs 토큰 vs 쿠키? 기초개념 잡아드림. 10분 순삭!

 

JWT 토큰 인증 이란? (쿠키 vs 세션 vs 토큰)

출처: https://inpa.tistory.com/entry/WEB-📚-JWTjson-web-token-란-💯-정리#token_인증_방식 [Inpa Dev 👨‍💻:티스토리]

 

🌐 JWT 토큰 인증 이란? (쿠키 vs 세션 vs 토큰)

Cookie / Session / Token 인증 방식 종류 보통 서버가 클라이언트 인증을 확인하는 방식은 대표적으로 쿠키, 세션, 토큰 3가지 방식이 있다. JWT를 배우기 앞서 우선 쿠키와 세션의 통신 방식을 복습해

inpa.tistory.com

 

 

다음 포스팅에서는 JWT토큰을 이용해 로그인 기능을 구현해보도록 하겠다.