(Token) JWT 란?

맘비·2023년 1월 3일
0

CS / Web

목록 보기
8/10

Token 기반 인증


쿠키나 세션을 이용한 인증보다 더 보안성이 강하고 효율적인 인증 방법

장점

  • 헤더와 페이로드를 가지고 서명 필드를 생성하므로 데이터 변조 후 재전송을 막을 수 있음.
  • stateless 서버를 만들 수 있음.
  • 모바일 어플리케이션에서도 잘 동작함.
  • 인증 정보를 다른 웹서비스에 전송할 수 있음. (OAuth)

단점

  • 여전히 디코딩이 가능하므로 데이터 유출이 발생할 수 있음.
  • 토큰을 탈취당할 경우 대처하기 어려움. 유효 기간을 기다리거나 token refresh를 해야 함.
  • JWT의 경우, 토큰의 길이가 길기 때문에 요청이 많아질수록 서버 자원의 낭비가 많아짐.

인증 타입

  • Basic : (RFC 7617) 사용자 아이디와 암호를 Base64로 인코딩한 값을 토큰으로 사용
  • Bearer : (RFC 6750) JWT 혹은 OAuth에 대한 토큰을 사용
  • Digest : (RFC 7616) 서버에서 난수 데이터 문자열을 클라이언트에 보내고, 클라이언트는 사용자 정보와 nonce를 포함하는 해시값을 사용하여 응답
  • HOBA : (RFC 7486) 전자 서명 기반 인증
  • Mutual : (draft-ietf-httpauth-mutual) 암호를 이용한 클라이언트-서버 상호 인증
  • AWS4-HMAC-SHA256 : AWS 전자 서명 기반 인증

참조: https://velog.io/@cada/토근-기반-인증에서-bearer는-무엇일까

JWT(JSON Web Token)


정의

Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token

JWT는 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달한다. 주로 회원 인증이나 정보 전달에 사용되는 JWT는 아래의 로직을 따라서 처리된다.

애플리케이션이 실행될 때, JWT를 static 변수와 로컬 스토리지에 저장하게 된다. HTTP 통신을 할 때마다 JWT를 HTTP 헤더에 담아서 보내야 하는데, 이를 로컬 스토리지에서 계속 불러오면 오버헤드가 발생하기 때문에 static 변수에 저장하는 것이다. 클라이언트에서 JWT를 포함해 요청을 보내면 서버는 허가된 JWT인지를 검사한다. 또한 로그아웃을 할 경우 로컬 스토리지에 저장된 JWT 데이터를 제거한다. 실제 서비스의 경우에는 로그아웃 시, 사용했던 토큰을 blacklist라는 DB 테이블에 넣어 해당 토큰의 접근을 막는 작업을 해주어야 한다.

구조

각 부분은 Base64로 인코딩되어 표현되며, ‘.’을 구분자로 사용해 구분한다.

  • Header
    • typ: 토큰 타입을 지정 ex) JWT
    • alg: 알고리즘 방식 지정. signature 및 토큰 검증에 사용 ex) HS256(SHA256) 또는 RSA
  • Payload Claim(클레임, 토큰에서 사용할 정보들)이 담겨있다. claim은 총 3가지로 나뉜다.
    • Resitered Claim: 토큰 정보를 표현하기 위해 이미 정해진 종류의 데이터
    • Public Claim: 사용자 정의 클레임. 공개용 정보를 위해 사용. 충돌 방지를 위해 URI 포맷을 이용함.
  • Signature 서명(Signature)은 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다. 서명(Signature)은 위에서 만든 Header와 Payload의 값을 각각 BASE64Url로 인코딩하고, 인코딩한 값을 비밀 키를 이용해 Header에서 정의한 알고리즘으로 해싱을 하고, 이 값을 다시 BASE64Url로 인코딩하여 생성한다.

예시

참조: [Server] JWT(Json Web Token)란? - MangKyu's Diary (tistory.com)

profile
기록만이 살 길 ... 말하는 감자애오

0개의 댓글