[JWT]토큰(Token) 기반 인증에 대한 소개 - 1

박하늘·2020년 8월 24일
0

Token

목록 보기
1/1
post-thumbnail

🤔 해당 글은 아래의 글을 번역했습니다.

The Anatomy of a JSON Web Token

JSON Web Token의 구조

소개

API 모델은 최근 어플리케이션에서 많이 사용되고 있다.

이것은 어플리케이션이 더이상 그들의 데이터에 의존할 수 없기 때문에 생겨난것이다.
프로젝트가 그들의 잠재력을 가지기 위해서는 타사 어플리케이션을 사용할 수 있어야하고, 다른 어플리케이션과 혼합할 수 있어야하며 개발자가 쉽게 접근할 수 있어야한다.

Facebook이 데이터를 수집하기 위해 API를 어떻게 제공하지 생각해봐라 (당신이 당연히 증명되는 한). Facebook은 타사 어플리케이션 및 기타 서비스의 데이터 엑세스를 허용한다. 이 모든것이 API를 통해 할 수 있다.

이제 우리가 우리만의 API를 어떻게 구축할 것인가에 대해 이야기할 때, 항상 우리의 API를 어떻게 확보할 것인가가 주제가 될 것이다. 우리는 token based authentication(토큰 기반 인증)에 대해 이야기를 나누고, 자체 RESTful Node.js API를 구축했다.

아래에서는 표준(JSON Web Tokens)과 생성 방법에 대해 알아보도록 하겠다.


JSON 웹 토큰이란?

JSON Web Token(JWT)는 JSON을 통해 전달되기 때문에 "jot"로 발음된다. 우리는 초안에 대해 더 자세히 알아볼 수 있지만, 설명은 그렇게 중요하지 않다.


JSON Web Tokens는 서로 다른 프로그래밍 언어에서 작동한다 : .NET, Python, Node.js, Java, PHP, Ruby, Go, JavaScript, Haskell. 그래서 당신은 이것이 여러 곳에서 사용될 수 있다는 것을 알 수 있다.

JWT는 자급자족형이다 : 그들은 필요한 모든 정보를 그 안에 가지고 다닐 것이다. 이것은 JWT가 자신에 대한 정보, 페이로드(일반적으로 유저 정보) 및 서명을 전송할 수 있다는 것을 의미한다.

JWT는 쉽게 전달할 수 있다 : JWT는 자급자족하므로 API 인증 시 HTTP헤더 내부에 완벽하게 사용된다. 너는 URL을 통해서도 전달할 수 있다.


JWT는 어떻게 생겼나?

JWT는 식별하기 쉽다. 그것은 세 줄에 의해 분리되어 있다.

EX)

AAAAAAAA.BBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCC

3개의 부분으로 나누어 각각 무엇이 들어있는지 보자.

JSON Web Token 해체

.로 분류된 부분이 3개 있기 때문에 각 부분은 다르게 생성된다. 다음 3가지 부분이 있다.

  • header - 헤더
  • payload
  • singnature


Header

헤더는 2개의 부품을 운반한다.

  • 유형 선언, 즉 JWT
  • 사용할 해싱 알고리즘(이 경우 HMAC SHA256)

EX)

{
	"typ": "JWT",
	"alg": "HS256"
}

일단 이것이 base64encode가 되면, 우리는 JSON 웹 토큰의 첫 부분을 가지게 된다!

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Payload

Payload(탑재물)는 JWT 청구라고 부르는 JWT의 대부분을 운반할 것이다. 여기에 우리가 전달하고 싶은 정보와 토큰에 대한 다른 정보를 넣을 것이다.

우리가 제공할 수 있는 여러 가지 제안이 있다. 여기에는 등록된 클레임명, 공개 클레임명, 비공개 클레임명 등이 포함된다.

  • 등록된 클레임
  • 공개 클레임
  • 비공개 클레임

Payload의 예시

우리의 payload 예시는 두 개의 등록된 클레임과(iss, exp) 두 개의 공개 클레임(name, admin)이 있다.

{
	"iss" : "scotch.io",
	"exp" : 1300819380,
	"name" : "Chris Sevilleja",
	"admin" : true
}

이것의 인코드는 :

eyJpc3MiOiJzY290Y2guaW8iLCJleHAiOjEzMDA4MTkzODAsIm5hbWUiOiJDaHJpcyBTZXZpbGxlamEiLCJhZG1pbiI6dHJ1ZX0

JSON Web Token의 두 번째 부분이 될 것이다.


Signature

JSON 웹 토큰의 세 번째이자 마지막 부분이 서명이 될 것이다. 이 서명은 다음 구성 요소의 해시로 구성된다 :

  • the header
  • the payload
  • secret

JWT의 세 번째 부분을 얻는 방법 :

var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);

HMACSHA256(encodedString, 'secret');

The secret은 서버가 가지고 있는 서명이다. 우리 서버가 기존 토큰을 검증하고 서명할 수 있는 방식이다.

이것은 우리에게 JWT의 마지막 부분을 준다.

03f329983b86f7d9a9f5fef85305880101d5e302afafa20154d094b229f75773

이제 우리는 완전한 JSON 웹 토큰을 가지고 있다 :

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzY290Y2guaW8iLCJleHAiOjEzMDA4MTkzODAsIm5hbWUiOiJDaHJpcyBTZXZpbGxlamEiLCJhZG1pbiI6dHJ1ZX0.03f329983b86f7d9a9f5fef85305880101d5e302afafa20154d094b229f75773

Auth0은 JWT가 어떻게 만들어지는지 시험해 볼 수 있는 훌륭한 사이트를 만들었다. 콘텐츠를 즉시 변경하면 JWT가 즉시 업데이트 되는 것을 볼 수 있다. Auth0은 훌륭한 도구를 제공하며, 또한 그들은 노드에서 JWT를 생성하고 검증하는 것을 다루기 위해 jsonwebtoken Node 패키지를 유지한다.


결론

JSON Web Token 표준은 여러 언어를 사용할 수 있고 빠르고 쉽게 변할 수 있다.

당신은 URL, POST 파라미터 또는 HTTP 헤더에서 토큰을 사용할 수 있다. JSON Web Token의 다용성은 토큰을 통해 정보를 전달함으로써 API를 빠르고 쉽게 인증할 수 있도록 한다.

JWT를 사용해 노드 API 인증 방법 코드 : 문서

profile
공부중인 학생

0개의 댓글