본문 바로가기
Node.js

[Node.js] 노드제이에스 - 토큰을 활용해 인증하기

by Seong-Jun 2024. 2. 14.
728x90
반응형
SMALL

Do it! Node.js 프로그래밍 입문 10일차 입니다.

 

토큰 방식

세션은 서버에 저장되어 있으면서 클라이언트에 있는 세션 ID와 비교해서 사용자를 처리했습니다. 반면에 토큰에는 사용자 정보를 비롯해 위조를 막는 서명에 이르기까지 인증할 때 필요한 모든 정보가 포함되어 있습니다. 특정 서버에 저장하는 것이 아니므로 서버 간에 공유할 수도 있습니다. 토큰을 사용하는 인증 방식은 상태가 없으므로 서버에서 사용자 상태를 저장하지 않습니다. 그 대신 토큰 안에 사용자를 증명하는 내용이 포함됩니다.

 

토큰 방식을 사용하는 이유

쿠키와 세션에서는 서버에 세션을 저장해 놓고 상태가 없는 http 프로토콜을 마치 상태가 있는 것처럼 사용합니다. 하지만 이 방법은 세션이 저장공간을 차지 한다는 단점이 있습니다. 이에 비해 토큰 방식은 저장 공간이 따로 필요하지 않습니다. 서버에 저장하지 않는다는 뜻입니다. 토큰 자체에 여러 정보를 담아서 클라이언트와 서버가 주고 받기 때문입니다.

 

토큰 방식의 동작 방법

  1. 첫 번째 요청
    • 사용자가 첫 번째 로그인 요청
  2. 사용자 확인
    • 서버는 데이터베이스에 사용자가 있는지 확인
  3. 토큰 발급
    • 사용자가 확인되면 서버에서 토큰을 발급하고, 이것을 응답 객체에 담아 클라이언트에게 보내짐
  4. 토큰 저장
    • 클라이언트의 쿠키에 토큰을 저장
  5. 요청
    • 클라이언트에서 로그인이 필요할 때 요청 헤더에 토큰을 담아 서버에 요청
  6. 토큰 검증
    • 서버에서는 JWT를 검증해서 사용자 정보를 확인
  7. 응답
    • 사용자가 확인되면 요청한 처리 결과를 클라이언트에게 넘겨 줌

 

JWT의 구성

노드에서 자주 사용하는 토큰 방식 모듈은 JWT입니다. JWT는 JSON Web Token의 줄임말입니다. 토큰을 암호화하는 알고리즘은 여러 알고리즘이 있지만 HS256을 가장 많이 사용합니다.

 

웹 토큰은 하나의 문자열이면서 마침표를 기준으로 3개의 영역으로 나뉘어 있습니다. 첫 번째 영역은 헤더, 두 번째는 페이로드, 세 번째는 서명 부분입니다.

 

헤더 : 토큰의 알고리즘과 유형이 담겨 있습니다. 헤더에 있는 각각의 필드를 헤더 파라미터라고 합니다.

페이로드 : 사용자 인증 정보가 담겨 있습니다. 페이로드에 있는 각각의 필드를 클레임이라고 합니다.

서명 : 헤더와 페이로드 뒤에 붙이는 비밀 키입니다. 이 비밀 키는 외부로 공개하면 안 되므로 .env파일처럼 서버의 안전한 곳에 저장해 두고 사용합니다.

 

JWT 웹 사이트에서 볼 수 있듯이 토큰을 해석하면 JSON 문자열로 쉽게 바꿀 수 있습니다. 그러다 보니 JWT 토큰에 중요한 정보를 담아서는 안됩니다. 로그인을 위한 토큰이라면 사용자 이름과 암호화된 비밀번호 정도만 넣고 사용자와 관련된 다른 정보는 데이터베이스에서 조회하도록 하는 것이 좋습니다.

 

JWT로 사용자 인증 방법

1. 서버에서 토큰 만들기

jwt.sign(페이로드, 비밀키, [옵션, 콜백])

 

페이로드 : 토큰에 담아 둘 내용.

 

2. 클라이언트에서 토큰 전송

서버에서 클라이언트에 응답할 때 토큰을 보냅니다. 이 정보는 쿠키 등에 보관해 두었다가 클라이언트에서 서버로 요청할 때 요청 헤더에 함께 넣습니다.

 

3. 서버에서 토큰 검증

jwt.decode(토큰, 비밀키[, 옵션]) // 토큰을 해석해서 payload 반환
jwt.verify(토큰, 비밀키[, 옵션]) // 서명을 검증한 후 payload 반환

 

 

728x90
반응형
LIST

댓글