[WIL] Week I Learned week 01

Calvin Park·2022년 7월 17일
0

JWT 라는 것은 무엇인가?

jwt.is -> JSON Web Token이다. JWT is an open standard(RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted becuz it is digitally signed.
JWT는 속성 정보를 JSON 데이터 구조로 표현한 토큰으로 RFC 7519 표준인것이다. JWT는 서버와 클라이언트 간 정보를 주고 받을 때 리퀘스트 헤더에 JSON 토큰을 넣은 후 서버는 별도의 인증과정 없이 헤더에 포함되어 있는 JWT 정보를 인증한다.


JWT는 세파트로 나누어지며, 각 파트는 점로 구분하여 xxxx.yyyy.zzzz이런식으로 표현된다. 순서대로 Header, Payload, Signautre로 구성된다.
Base64 인코딩의 경우 '+','/'.'=' 포함되지만 JWT는 URI에서 파라미터로 사용할 수 있도록 URL-Safe한 Base63url 인코딩을 사용한다.

Header는 토큰의 타입과 해시 암호화 알고리즘으로 구성되어있다. 첫째는 토큰의 유형(JWT)을 나타내고, 두 번째는 HMAC, SHA256 또는 RSA와 같은 해시 알고리즘을 나타내는 부분이다.
Payload는 토큰에 담은 Claim정보를 포함하고 있다. Payload에 담는 정보의 한 '조각'을 클레임이라고 부르고, 이는 name/ value의 한 쌍으로 이뤄져 있다. 토큰에는 여러개의 claim들으 넣을 수 있다.
Calim의 정보는 등록된 (Registered)클레임, public claim, private claim으로 세 종류가 있다.
마지막으로 signature는 secret key를 포함하여 암호화되어 있다.


JWT PROCESS

기존의 토큰 방식 인증은 다이어그램에 표시된 것처럼 토큰은 이후의 모든 서비스 호출에 사용된다. 서비스를 받기 위해서는 토큰의 유효성을 확인하여 세부정보를 쿼리해야한다. 참조에 의한 호출형태로 모든 서비스는 항상 상호 작용할 때 다시 접속해야한다.

JWT 와 같이 값에 의한 호출이 가능한 토큰이 필요하다. 토큰이 필요한 모든 정보를 포함하고 있어 참조(적어도 인증 및 권한 부여를 위해)가 필요없기 때문에 마이크로 서비스 자체에서 유효성을 검증 한다. 이것이 JSON Web Token의 목적이다.


1. 사용자가 id와 password를 입력하여 로그인을 시도합니다.
2. 서버는 요청을 확인하고 secret key를 통해 Access token을 발급한다.
3. JWT 토큰을 클라이언트에 전달 합니다.
4. 클라이언트에서 API을 요청할때 클라이언트가 Authorization header에 Access token 을 담아서 보냅니다.
5. 서버는 JWT Signature을 체크하고 Payload로부터 사용자 정보를 확인해 데이터를 반환합니다.
6. 클라이언트의 로그인 정보를 서버 메모리에 저장하지 않기 때문에 토큰기반 인증 메커니즘을 제공합니다.
인증이 필요한 경로에 접근할 때 서버 측은 Authorization 헤더에 유효한 JWT 또는 존재하는지 확인한다.
JWT에는 필요한 모든 정보를 토큰에 포함하기 때문에 데이터베이스과 같은 서버와의 커뮤니케이션 오버 헤드를 최소화 할 수 있다.
Cross-Origin Resource Sharing(CORS)는 쿠키를 사용하지 않기 때문에 JWT를 채용 한 인증 메커니즘은 두 도메인에서 API를 제공 하더라도 문제가 발생하지 않는다. 일반적으로 JWT 토큰 기반의 인증 시스템은 위와 같은 프로세스로 이루어집니다. 처음 사용자를 등록할 때 Access token과 Refresh token이 모두 발급되어야 한다.


JWT의 장점과 단점

장점:

JWT의 주요한 이점은 사용자 인증에 필요한 모든 정보는 토큰 자체엥 포함하기 때문에 별도의 인증 저장소가 필요없다는 것이다.
분산 마이크로 서비스 환경에서 중앙 집중식 인증 서버와 데이터베이스에 의존하지 않는 쉬운 인증 및 인가 방법을 제공합니다. 개별 마이크로 서비스에는 토큰 검증과 검증에 필요한 비밀 키를 처리하기위한 미들웨어가 필요합니다. 검증은 서명 및 클레임과 같은 몇가지 매개 변수를 검사하는 것과 토큰이 만료되는 경우로 구성된다.
토큰이 올바르게 서명되었는지 확인하는 것은 CPU 사이클을 필요로 하며 IO 또는 네트워크 엑세스가 필요하지 않으며 최신 웹 서버 하드웨어에서 확장하기가 쉽습니다.
JSON 웹 토큰의 사용을 권장하는 며 가지 이유는 다음과같다.

  • URL 파라미터와 헤더로 사용
  • 수평 스케일이 용이
  • 디버깅 및 관리가 용이
  • 트래픽 대한 부담이 낮음
  • REST 서비스로 제공 가능
  • 내당된 만료
  • 독립적인 JWT

단점

  • 토큰은 클라이언트에 저장되어 데이터베이스에서 사용자 정보를 조작하더라도 토큰에 직접 적용할 수 없습니다.
  • 더많은 필드가 추가되면 토큰이 커질 수 있습니다.
  • 비상태 애플리케이션에서 토큰은 거의 모든 요청에 대해 전송되므로 데이터 트래픽 크기에 영향을 미칠 수 있습니다.

JWT가 유용하게 사용 될 수 있는 상황

  • 회우너 인증: JWT를 사용하는 가장 흔한 시나리오입니다. 사용자가 로그인을 하면, 서버는 사용자의 정보를 기반으로한 토큰을 발급합니다.
    그후, 사용자가 서버에 요청을 할 때 마다 JWT를 포함하여 전달합니다. 서버는 클라이언트에서 요청을 받을때 마다, 해당 토큰이 유효하고 인증됐는지 검증을 하고, 사용자가 요청한 작업에 권한이 있는지 확인하여 작업을 처리합니다.
    서버에서는 사용자에 대한 세션을 유지 할 필요가 없습니다. 즉 사용자가 로그인되어있는지 안되어있는지 신경 쓸 필요가 없고, 사용자가 요청을 했을때 토큰만 확인하면 되므로 세션 관리가 필요 없어서 서버 자원과 비용을 절감할 수 있다.
  • 정보 교류: JWT는 두 개체 사이에서 안정있게 정보를 교환하기에 좋은 방법이다. 그 이유는, 정보가 서명이 되어있기 때문에 정보를 보낸이가 바뀌진 않았는지, 또 정보가 도중에 조작되지는 않았는지 검증할 수 있다.

출처:
http://www.opennaru.com/opennaru-blog/jwt-json-web-token/

profile
Personal Velog Note

0개의 댓글