티스토리 뷰

Security

[Security] JWT (JSON Web Token)

DUCKBAE's 2022. 11. 8. 23:07

JWT 에 대한 지식이 너무나도 부족한 나에게 JWT 웹 토큰을 생성하고 검증할 수 있는 일이 주어졌다.
사실 짧은 시간내에 개발을 진행해야 했던 상황이라 JWT에 대해서 공부하기엔 시간이 부족했다. 😥
.
.
.
애플리케이션을 개발할 떄 모든 사용자가 전부 사용하도록 구현하면 어떻게 될까?
예로 구글 본사로 생각해보자. (사실무근)
구글에 모두가 출입할 수 있지는 않을 것이다. 출입증이 있는 사람만 가능하겠다.
또한 특정 오피스 같은 경우에는 특정 인물만 들어갈 수 있을 것이다.
가짜 출입증을 만들어서 들어간다고 했을 때 아마 시스템 상으로 검증을 할 것이다.
만약 출입증이 없이 모두가 들어갈 수 있다고 하면 악의를 품은 사람들이 문제를 일으킬 수도 있을 것이다.
.
따라서 출입증을 가지고 있는 즉, 이미 증명된 사람만이 구글에 들어갈 수 있는 것처럼 우리가 만든 프로그램도 이미 인증이 된 사용자만이 서비스를 사용할 수 있도록 제공해야 한다.
인증할 수 있는 방법은 여러가지 방법이 있지만 오늘은 JWT 에 대해서 알아보기로 한다.


JWT(JSON Web Token) 이란

웹표준(RFC-7519) 으로서 당사자간에 인증정보를 JSON 형태로 안전하게 교환할 수 있도록 만들어진 토큰이다.
JWT는 시크릿 키를 활용한 HMAC 알고리즘 또는 퍼블릭, 프라이빗 키페어를 이루는 RSA, ECDSA를 사용하여 인증할 수 있다.


구성요소

jwt.io

위 사진의 왼쪽 데이터를 보면 dots(.) 이 2개가 있다.

dots(.) 기준으로 3가지의 구성 요소가 있다.

xxxxx.yyyyy.zzzzz

header.payload.signature


Header

  • 토큰 유형(typ)과 서명 알고리즘(alg - HMAC SHA256 또는 RSA) 으로 구성된다. (위 사진의 오른쪽 Header 참고)
  • Base64 로 인코딩 되어 JWT의 첫번째 부분(xxxxx)이 된다.


Payload

  • 추가 데이터에 대한 정보를 담기위한 클레임으로 이루어져 있다.
  • name : value 형식
  • Base64로 인코딩 되어 JWT의 두번째 부분(yyyyy)이 된다.
  • 3 종류의 클레임 타입이 있다.
    Registered Claims
    - 필수는 아니지만 권장되며 이름이 미리 정의된 클레임의 집합이다.
    - 해당 클레임에 들어갈 정보는 여기 를 참고하자!

    Public Claims
    - 사용자가 마음대로 정의할 수 있으나 충돌의 우려가 있으니 여기 에 정의 된 대로 사용하는 게 좋다.
    - 아니면 URI 형식을 사용해야 한다.

    Private Claims
    - 통신을 주고받는 사용자간에 데이터를 공유하기 위한 사용자 지정 클레임의 집합이다.


Signature

  • 메세지가 변경되지 않았는지 확인하는데 사용된다. (서버에서 확인)
  • signature 생성하는 방법은 다음과 같다.
    HMACSHA256(base64UrlEncode(header) + "." + base64Encode(payload), secretKey)
    위 예시에서 HMACSHA256 알고리즘방식을 사용하였는데 자세한 내용은 여기 에서 확인해보자.

동작 방식

jwt.io

사용자가 로그인 하는 과정을 예시로 들어보자.
로그인 되지 않은 사용자는 어떠한 서비스도 사용할 수 없다고 가정한다.

1. 클라이언트가 아이디와 패스워드를 Auth 서버에 인증을 요청한다.
2. 서버측에서 로그인 가능한 사용자라고 판단되면 JWT 를 생성하여 전달한다.
3. 사용자는 해당 JWT 로 해당 사용자가 접근할 수 있는 API에 접근할 수 있다.

참고
https://jwt.io/

'Security' 카테고리의 다른 글

[Security] 대칭 암호와 비대칭 암호  (0) 2022.07.12
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함