Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Network] JWT, 구조, 인증과정, 장단점 #61

Open
leezzangmin opened this issue Nov 1, 2022 · 1 comment
Open

[Network] JWT, 구조, 인증과정, 장단점 #61

leezzangmin opened this issue Nov 1, 2022 · 1 comment
Labels
NETWORK 네트워크 질문

Comments

@leezzangmin
Copy link
Collaborator

leezzangmin commented Nov 1, 2022

JWT, 구조, 인증과정, 장단점

@leezzangmin leezzangmin added the NETWORK 네트워크 질문 label Nov 1, 2022
@leezzangmin leezzangmin changed the title [Network] JWT [Network] JWT, 구조, 인증과정, 장단점 Nov 1, 2022
@leezzangmin
Copy link
Collaborator Author

1. JWT ?

JWT는 Json Web Token의 약자로, 쿠키-세션의 개념과 대비되는 무상태 토큰이다.
총 세 부분으로 나뉜다.

  • Header
  • Payload
  • Signature

스크린샷 2022-11-01 오후 3 25 27

- Header는 JWT 웹 토큰의 헤더 정보를 담고있다. 암호화에 사용할 알고리즘과 토큰의 타입을 나타내는 정보가 들어가있다.
  • Payload는 실제 토큰으로 사용하려는 데이터가 담기는 부분. 각 데이터를 Claim이라고 하며 다음과 같이 3가지 종류가 있다.

Reserved claims : 이미 예약된 Claim. 필수는 아니지만 사용하길 권장. key 는 모두 3자리 String이다.
Public claims : 공개 Claim.
Private claims : 사용자 정의 Claim

  • Signature 는 Header와 Payload의 데이터 무결성과 변조 방지를 위한 서명
    Header + Payload 를 합친 후, Secret 키와 함께 Header의 해싱 알고리즘으로 인코딩한다.

JWT 구조

JWT는 [Header Payload Signature] 각각 JSON 형태의 데이터를 base 64 인코딩 후 합친다.
아래와 같은 순서로 . 을 이용해 합친다.
최종적으로 만들어진 토큰은 HTTP 통신 간 이용되며, Authorization 이라는 key의 value로서 사용된다.

JWT 인증 과정

image

JWT 의 단점 & 도입시 고려사항

  1. Self-contained : 토큰 자체에 정보가 있다는 사실은 양날의 검이 될수 있다.
  • 토큰 길이 : 토큰 자체 payload 에 Claim set을 저장하기 때문에 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다.
  • payload 암호화 : payload 자체는 암호화 되지 않고 base64로 인코딩한 데이터다. 중간에 payload를 탈취하면 디코딩을 통해 테이터를 볼 수 있다.
    JWE 를 통해 암호하하거나, payload에 중요 데이터를 넣지 않아야 한다.
  1. Stateless : 무상태성이 때론 불편할 수 있다. 토큰은 한번 만들면 서버에서 제어가 불가능하다. 토큰을 임의로 삭제할 수 있는 방법이 없기 때문에 토큰 만료시간을 꼭 넣어주는게 좋다.
  2. tore Token : 토큰은 클라이언트 side에서 관리해야하기 때문에 토큰을 저장해야한다.

결론

HTTP, REST API 의 공통적인 특징은 Stateless(무상태)를 지향한다는 것이다.
Stateful, 즉 상태를 저장하는 서버는 많은 Side-effect를 발생시킬 수 있다.
또한, 서론에 말했듯이 현재의 IT 인프라 구조는 유연한 확장 가능성이 있어야 하는데 기존의 쿠키-세션 기반의 인증을 사용하면 확장 가능한 인프라를 구성하기 힘들다.
기존의 로그인 / 인증을 모두 Web Token 기반으로 변경할 수는 없지만, 앞으로 만들게 될 서비스 특히 RESTful한 API의 인증에는 JWT를 사용해보는 것이 좋을 것이라 생각한다.

실제 면접질문

  1. JWT에 대해 아는대로 설명하시오
  2. JWT가 변조하기 어려운 이유는?
  3. JWT가 유출되었을 때 회수하기가 쉽지 않은데 어떻게하면 발급된 JWT를 무효화할 수 있을까요?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
NETWORK 네트워크 질문
Projects
None yet
Development

No branches or pull requests

1 participant