JSON Web Token 입문 강좌 상세 설명

5945 단어 JSONWebToken
JSON Web Token(줄 임 말 JWT)은 현재 가장 유행 하 는 크로스 인증 솔 루 션 으로 본 고 는 그의 원리 와 용법 을 소개 한다.

질문
인터넷 서 비 스 는 사용자 인증 과 떨 어 질 수 없다.일반적인 절 차 는 아래 와 같다.
1.사용자 가 서버 에 사용자 이름과 비밀 번 호 를 보 냅 니 다.
2.서버 인증 이 통과 되면 현재 대화(session)에 관련 데 이 터 를 저장 합 니 다.예 를 들 어 사용자 역할,로그 인 시간 등 입 니 다.
3.서버 가 사용자 에 게 session 을 되 돌려 줍 니 다.id,사용자 의 쿠키 를 기록 합 니 다.
4.사용자 가 추 후 요청 할 때마다 Cookie 를 통 해 sessionid 전송 서버.
5,서버 받 은 sessionid,초기 에 저 장 된 데 이 터 를 찾 으 면 사용자 의 신분 을 알 수 있 습 니 다.
이런 모델 의 문 제 는 확장 성(scaling)이 좋 지 않다 는 데 있다.단일 컴퓨터 는 물론 문제 가 없습니다.서버 클 러 스 터 나 도 메 인 을 뛰 어 넘 는 서비스 가이드 구조 라면 session 데이터 공 유 를 요구 하고 모든 서버 가 session 을 읽 을 수 있 습 니 다.
예 를 들 어 A 사이트 와 B 사 이 트 는 같은 회사 의 관련 서비스 다.현재 사용자 가 그 중의 한 사이트 에 로그 인하 기만 하면 다른 사 이 트 를 방문 하면 자동 으로 로그 인 할 것 을 요구 하고 있 습 니 다.어떻게 실현 합 니까?
세 션 데이터 가 오래 지속 되 고 데이터베이스 나 다른 지구 층 에 기록 하 는 솔 루 션 입 니 다.각종 서비스 가 요청 을 받 은 후 지구 층 에 데 이 터 를 요청 합 니 다.이런 방안 의 장점 은 구조 가 뚜렷 하고 공 사 량 이 비교적 많다 는 것 이다.또 지구 층 이 끊 기 면 한 점 만 실패 할 수 있다.
다른 방안 은 서버 가 아예 session 데 이 터 를 저장 하지 않 고 모든 데 이 터 를 클 라 이언 트 에 저장 하고 요청 할 때마다 서버 로 보 내 는 것 이다.JWT 는 바로 이런 방안 의 대표 이다.
2.JWT 의 원리
JWT 는 서버 인증 이후 하나의 JSON 대상 을 생 성하 여 사용자 에 게 아래 와 같이 돌려 보 내 는 원리 다.

{
 "  ": "  ",
 "  ": "   ",
 "    ": "2018 7 1 0 0 "
}
앞으로 사용자 가 서버 와 통신 할 때 이 JSON 대상 을 돌려 보 내야 한다.서버 는 완전히 이 대상 에 의 해 사용자 의 신분 을 인정 합 니 다.사용자 가 데 이 터 를 변경 하 는 것 을 방지 하기 위해 서버 는 이 대상 을 생 성 할 때 서명 을 추가 합 니 다(자세 한 내용 은 뒷글 참조).
서버 는 세 션 데 이 터 를 저장 하지 않 습 니 다.즉,서버 가 무 상태 로 변 하여 확장 이 용이 합 니 다.
3.JWT 의 데이터 구조
실제 JWT 는 대략 아래 와 같다.

그것 은 아주 긴 문자열 로 중간 에 점(.)으로 세 부분 으로 나 뉜 다.JWT 내 부 는 줄 을 바 꾸 지 않 았 습 니 다.여 기 는 단지 전시 하기 편리 하도록 몇 줄 로 썼 을 뿐 입 니 다.
JWT 의 세 부분 은 다음 과 같다.
Header(머리)
  • Payload(부하)
  • 서명(서명)
  • 한 줄 로 쓰 면 바로 아래 의 모습 이다.
    
    Header.Payload.Signature

    다음은 이 세 부분 을 차례대로 소개 한다.
    3.1 Header
    Header 부분 은 JSON 대상 으로 JWT 의 메타 데 이 터 를 묘사 하 는데 보통 아래 의 모습 입 니 다.
    
    {
     "alg": "HS256",
     "typ": "JWT"
    }
    위의 코드 에서 alg 속성 은 서명 을 나타 내 는 알고리즘(algorithm)이 고 기본 값 은 HMAC SHA 256(HS 256 로 쓰기)입 니 다.typ 속성 은 이 토 큰(token)의 유형(type)을 나타 내 고 JWT 토 큰 은 JWT 로 통일 적 으로 쓰 입 니 다.
    마지막 으로 위의 JSON 대상 을 Base64URL 알고리즘(자세 한 내용 은 뒷글 참조)을 사용 하여 문자열 로 변환 합 니 다.
    3.2 Payload
    Payload 부분도 실제 전달 해 야 할 데 이 터 를 저장 하 는 JSON 대상 이다.JWT 는 선택 할 수 있 도록 7 개의 공식 필드 를 규정 했다.
  • iss(issuer):발급 자
  • exp(expiration time):만 료 시간
  • sub(sub):주제
  • aud(audience):시청자
  • nbf(Not Before):발효 시간
  • iat(Issued At):발급 시간
  • jti(JWT ID):번호
  • 공식 필드 를 제외 하고 이 부분 에서 개인 필드 를 정의 할 수 있 습 니 다.다음은 하나의 예 입 니 다.
    
    {
     "sub": "1234567890",
     "name": "John Doe",
     "admin": true
    }
    
    JWT 는 기본적으로 암호 화 되 지 않 고 누구나 읽 을 수 있 으 므 로 비밀 정 보 를 이 부분 에 두 지 마 십시오.
    이 JSON 대상 도 Base64URL 알고리즘 을 사용 하여 문자열 로 변환 해 야 합 니 다.
    3.3 Signature
    Signature 부분 은 앞 두 부분 에 대한 서명 으로 데이터 변경 을 방지 합 니 다.
    우선 키(secret)를 지정 해 야 합 니 다.이 키 는 서버 에서 만 알 수 있 으 며 사용자 에 게 누설 할 수 없습니다.그리고 Header 에서 지정 한 서명 알고리즘(기본 값 HMAC SHA 256)을 사용 하여 아래 공식 에 따라 서명 합 니 다.
    
    HMACSHA256(
     base64UrlEncode(header) + "." +
     base64UrlEncode(payload),
     secret)
    
    서명 을 계산 한 후 Header,Payload,Signature 세 부분 을 하나의 문자열 로 맞 추고 각 부분 간'점'(.)으로 구분 하면 사용자 에 게 되 돌아 갈 수 있 습 니 다.
    3.4 Base64URL
    앞에서 언급 했 듯 이 Header 와 Payload 의 직렬 화 알고리즘 은 Base64URL 입 니 다.이 알고리즘 은 Base 64 알고리즘 과 기본적으로 유사 하지만 약간의 차이 가 있다.
    JWT 는 토 큰(token)으로서 URL(예 를 들 어 api.example.com/?token=xxx)을 넣 을 수 있 습 니 다.Base 64 는 세 글자 +、/= 이 있 는데 URL 에 특별한 의미 가 있 기 때문에 교체 해 야 합 니 다. = 은 생략 되 고 +- 으로 교체 되 며 /_ 으로 교체 되 었 습 니 다.이것 이 바로 Base64URL 알고리즘 입 니 다.
    4.JWT 의 사용 방식
    클 라 이언 트 가 서버 로부터 되 돌아 오 는 JWT 를 받 아 쿠키 에 저장 할 수도 있 고 localStorage 에 저장 할 수도 있다.
    이후 클 라 이언 트 는 서버 와 통신 할 때마다 이 JWT 를 가지 고 다 닌 다.쿠키 에 넣 어 자동 으로 보 낼 수 있 지만 도 메 인 을 넘 을 수 없 기 때문에 HTTP 가 요청 한 헤더 정보 Authorization 필드 에 넣 는 것 이 좋 습 니 다.
    
    Authorization: Bearer <token>
    또 다른 방법 은 도 메 인 을 넘 을 때 JWT 는 POST 가 요청 한 데이터 체 에 넣 는 것 이다.
    5.JWT 의 몇 가지 특징
    (1)JWT 는 기본적으로 암호 화 되 지 않 지만 암호 화 할 수 있 습 니 다.원본 Token 을 생 성 한 후 키 로 다시 암호 화 할 수 있 습 니 다.
    (2)JWT 가 암호 화 되 지 않 은 경우 비밀 데 이 터 를 JWT 에 기록 할 수 없다.
    (3)JWT 는 인증 뿐만 아니 라 정보 교환 에 도 사용 할 수 있다.JWT 를 효과적으로 사용 하면 서버 가 데이터 베 이 스 를 조회 하 는 횟수 를 줄 일 수 있다.
    (4)JWT 의 가장 큰 단점 은 서버 가 session 상 태 를 저장 하지 않 기 때문에 사용 과정 에서 특정한 token 을 폐지 하거나 token 의 권한 을 변경 할 수 없다 는 것 이다.JWT 가 서명 발급 되면 서버 에 추가 논리 가 배치 되 지 않 는 한 만 료 전 까지 는 유효 하 다 는 것 이다.
    (5)JWT 자체 에 인증 정보 가 포 함 돼 있어 유출 되면 누구나 해당 토 큰 의 모든 권한 을 받 을 수 있다.도용 을 줄 이기 위해 서 는 JWT 유효기간 을 비교적 짧게 설정 해 야 한다.일부 중요 한 권한 에 대해 사용 할 때 다시 사용자 에 게 인증 을 해 야 합 니 다.
    (6)도용 을 줄 이기 위해 JWT 는 HTTP 프로 토 콜 을 사용 하여 명시 적 으로 전송 하지 말고 HTTPS 프로 토 콜 로 전송 해 야 한다.
    참고 링크
    Introduction to JSON Web Tokens , by Auth0
    Sessionless Authentication using JWTs (with Node + Express + Passport JS) , by Bryan Manuele
    Learn how to use JSON Web Tokens , by dwyl
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기