일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- [파이썬 실습] 심화 문제
- 프론트개발
- 자바스크립트 날씨 웹 만들기
- 엘리스 AI 트랙 5기
- JavaScript
- RN 프로젝트
- 날씨 웹 만들기
- 리트코드
- 코딩부트캠프
- 개발공부
- 프로그래머스
- reactnativecli
- 프론트개발공부
- [파이썬 실습] 기초 문제
- 엘리스 ai 트랙
- [파이썬 실습] 중급 문제
- 자바스크립트 reduce()
- 자바스크립트 split()
- 개발일기
- [AI 5기] 연습 문제집
- 엘리스
- 코드스테이츠
- 자바스크립트 sort()
- HTML
- 자바스크립트 날씨
- 부트캠프
- 간단한 날씨 웹 만들기
- 자바스크립트
- 삼항연산자
- leetcode
- Today
- Total
개발조각
JWT(JSON Web Token) 본문
JWT란 무엇인가
JWT(JSON Web Token)는 유저 간에 정보를 JSON 개체로 안전하게 전송하기 위한 간결하고 독립적인 방법을 정의하는 개방형 표준( RFC 7519 )입니다.
즉 JWT는 표준이며 모든 JWT는 토큰이지만 모든 토큰이 JWT는 아닙니다.
JWT는 상대적으로 크기가 작기 때문에 URL, POST 매개변수 또는 HTTP 헤더 내부를 통해 전송할 수 있으며 빠르게 전송됩니다.
Json Wet Token 약자로 모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰을 의미합니다.
언제 JWT를 사용할까?
JWT는 다양한 방법으로 사용할 수 있습니다.
인증
JWT를 사용하는 가장 흔한 시나이오이며, 사용자가 자격 증명을 사용하여 성공적으로 로그인하면 사용자의 정보를 기반으로 한 ID토큰이 발급합니다.
- ID토큰은 항상 JWT입니다.
승인
사용자가 성공적으로 로그인하면 애플리케이션은 해당 사용자를 대신하여 경로, 서비스 또는 리소스(예: API)에 액세스 하도록 요청할 수 있습니다.
정보교환
JWT는 서명이 가능하기 때문에 당사자 간에 안전하게 정보를 전송 교환하기에 좋습니다.
보낸 사람이 누구인지 확신할 수 있기 때문입니다.
JWT의 구조를 통해 콘텐츠가 변조되지 않았는지 확인할 수 있습니다.
JWT 구조
JWT는 세 부분이 연결된 Base64Url 인코딩 문자열로 구성되며, 점(.)으로 구분됩니다.
- Header
- Payload
- Signature
URL에서 파라미터로 사용할 수 있도록 URL_Safe한 Base64Url 인코딩을 사용합니다.
Base64
이진(8bit) 데이터를 문자 코드에 영향을 받지 않은 공통 ASCII 영역의 문자들로 바꾸는 인코딩 방식
여기서 64는 64진법을 의미 → 64개의 문자들을 반복적으로 사용하겠다는 의미
Base64 Url Safe
웹으로 전송하기 위해서 사용하는 문자가 Base64 형태의 문자
Base64를 쓰다보니 문제가 발생(62: +, 63: /이기 때문에) → 이 문자들을 전송하게 되면 전상적으로 전송되지 않는 문제 발생
이러한 오류를 막기 위해 등장한 것이 safe (62: - minus, 63: _ underline)
따라서 JWT는 아래와 같이 보입니다.
xxxxx.yyyyy.zzzzz
// Header.Payload.Signature
header
토큰의 유형인 JWT와 HMAC SHA256 또는 RSA와 같은 서명 알고리즘의 두 부분으로 구성되어 있습니다.
{
"alg": "HS256",
"typ": "JWT"
}
Payload
클레임(claim)이 담겨있습니다.
클레임(claim)이란 사용자 및 추가 데이터에 대한 정보 조각
클레임이 담겨있다는 말은 토큰에 담을 정보(서버에서 첨부한 사용자 권한 정보와 데이터)가 담겨있다.라고 생각하시면 됩니다.
클레임은 name/value의 한쌍으로 이뤄져있습니다.
클레임(claim)의 종류
- Registered claims(등록된 클레임) :
- 필수는 아니지만 유용한 클레임 세트를 제공하기 위해 권장되는 미리 정의된 클레임 세트
- iss(발급자), expiration(만료 기간), sub(주제), audience(대상)등이 있다.
- Public claims(공개 클레임)
- JWT를 사용하는 사람들이 마음대로 정의할 수 있습니다.
- Private claims(비공개 클레임)
- 사용에 동의한 당사자 간에 정보를 공유하기 위해 생성된 사용자 정의 클레임입니다.
{
"sub": "1234567890", // 등록 클레임
"name": "John Doe", // 비공개 클레임
"admin": true
}
Signature
서명은 메시지가 도중에 변경되지 않았음을 확인하는 데 사용되며,
개인 키로 서명된 토큰의 경우 JWT의 발신자가 누구인지도 확인할 수 있습니다.
서명을 만들기 위해 Base64로 인코딩 된 헤더와 페이로드를 암호와 함께 가져와서 헤더에 지정된 알고리즘으로 서명합니다.
HMAC SHA256 알고리즘을 사용하려는 경우 서명은 다음과 같은 방식으로 생성됩니다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
JWT(JSON Web Token)은 어떻게 작동하나?
인증 시 사용자가 자격 증명을 성공적으로 로그인하면 JSON 웹 토큰이 반환됩니다.
토큰은 자격 증명이므로 보안 문제를 방지하기 위해 주의해야 됩니다.
- 일반적으로 토큰은 필요 이상으로 오래 보관해서는 안됩니다.
- 중요한 정보가 들어있는 데이터는 브라우저 저장소(Web Storage, Cookie)에 저장해서는 안됩니다.
- 사용자가 보호된 경로 또는 리소스에 액세스 하기를 원할 때마다 사용자 에이전트는 JWT를 전송해야 합니다.
- HTTP 헤더를 통해 JWT 토큰을 전송할 경우 너무 커지지 않도록 해야 합니다.
APO 또는 리소스에 액세스하기 위해 JWT를 얻고 사용하는 방법
- 응용 프로그램 또는 클라이언트가 서버에 권한 부여를 요청합니다.
- 권한이 부여되면 권한 부여 서버는 응용프로그램에 대한 액세스 토큰은 반환합니다.
- 응용 프로그램은 액세스 토큰을 사용하여 보호된 리소스(예: API)에 액세스 합니다.
참고자료
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
https://tech.toktokhan.dev/2021/04/30/JWT/
JWT란 무엇인가
JWT 안녕하세요 똑똑한 개발자에서 백엔드 개발을 하고 있는 김영환 입니다. JMT졸맛탱이 아니라 JWT😝 웹 개발을 진행하다보면 빠질수 없는 인증 / 인가 .. JWT에 대해서 소개해보도록 하겠습니다.
tech.toktokhan.dev
https://koonsland.tistory.com/57
Base64 와 Base64 Url Safe 의 차이점
컴퓨터 분야에서 프로그래밍, 특히 웹 프로그래밍을 할때에는 Base64라는 것을 주로 많이 사용하게 됩니다. 문자들을 Base64(베이스64) 형태로 변환해서 전송하고 받은 쪽은 다시 변환해서 사용하는
koonsland.tistory.com
https://auth0.com/docs/secure/tokens/json-web-tokens
Auth0
Get started using Auth0. Implement authentication for any kind of application in minutes.
auth0.com
'CS' 카테고리의 다른 글
RESTful API (0) | 2023.03.19 |
---|