TIL - JWT 토큰

jake·2021년 12월 21일
0

TIL

목록 보기
20/54
post-thumbnail

오늘은 로그인할 때 맨날 받던 JWT가 도대체 뭔가에 대해서 파악해보았다.
우선 JWT를 알기전에 인증 인가에 대한 간략한 사전지식 사이트다.
알고보면 도움이 될거같아 첨부.
http://www.opennaru.com/opennaru-blog/jwt-json-web-token-with-microservice/

JWT(JSON Web Token) 토큰이란?

  • JWT 토큰은 JSON객체형식의 자체적인 정보를 담고 토큰이다.
    자체적인 정보는 토큰정보(Header), 전달할정보(Payload), 검증정보(signature)를 가지있다.

  • 로그인부분에서 사용되며 JWT Process로는

사용자 로그인 -> 서버는 screct key를 통해 Accesstoken을 발급 ->
클라이언트에 JWT를 전달 (다시말해 localStorage에 토큰을 저장) ->
유저는 서비스 요청을 보낼 때 Header에 JWT토큰을 전달 -> 서버는 Header의 토큰 서명을 체크하고 유저정보를 확인 -> 유저의 서비스 요청에 대한 응답 전달

JWT 구성요소

JWT는 세 파트로 나누어지며

  • 순서대로 헤더 (Header), 페이로드 (Payload), 서명 (Sinature)로 구된다. Json 형태인 각 부분은 Base64로 인코딩 되어 표현된다. 각 부분을 이어주기 위해 .구분자를 반환한다.
  • Base64는 암호화된 문자열이 아니고, 같은 문자열에 대해 항상 같은 문자열을 반환한다.

Header는 토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있다.

  • typ: 토큰의 타입을 지정합니다. ex)JWT
  • alg: 해싱 알고리즘을 지정합니다. 해싱 알고리즘으로는 보통 HMAC SHA256 혹은 RSA 가 사용되며, 이 알고리즘은, 토큰을 검증 할 때 사용되는 signature 부분에서 사용됩니다.

Payload는 토큰에 담을 정보로 구성되어있다.

정보는 JSON형태이며, 이 정보를 클레임(claim)이라고 부른다.
토큰에는 여러개의 클레임을 넣을 수 있다. 3종류의 클레임을 알아보자.

클레임의 정보는 등록된 (registered) 클레임, 공개 (public) 클레임, 비공개 (private) 클레임으로 세 종류가 있습니다.

정리가 잘 되어있는 아래 이미지를 확인하자.

위에 정보를 보고 아래 이미지를 확인해보면

iss,exp같은 경우는 등록된(registered) 클레임 부분이고
url형식은 공개된(public) 클레임 ( 중복 방지를 위한 url형식의 이름사용 )
userId, username은 비공개(private) 클레임 (이부분이 우리가 토큰에서 전달받는 유저정보)

Signature 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다.

헤더(Header)와 페이로드(Payload)의 값을 각각 BASE64로 인코딩하고, 인코딩한 값을 비밀 키를 이용해 헤더(Header)에서 정의한 알고리즘으로 해싱을 하고, 이 값을 다시 BASE64로 인코딩하여 생성한다.

JWT 토큰의 장점

  • 서버는 유저의 세션을 유지할 필요가 없고, 유저가 보낸 토큰만 확인하면 된다. 즉, 서버의 자원을 아낄수 있다.
  • JWT 토큰의 정보는 서명되어있어 정보가 조작됐는지 검증할 수 있다.

JWT 토큰의 단점

  • Payload에 3종류의 클레임 즉 정보들을 저장하기 때문에 정보가 많아질 수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수가 있다.
  • base64로 인코딩 되어있기 때문에 탈취하여 디코딩 할경우 경우데이터를 볼 수가 있다. (방지하기위해 payload에 중요한 데이터를 넣지말거나, JWE로 암호화하거나) (JWE관련사이트)
  • Stateless하다. 즉, 상태를 저장하지 않아서 토큰을 임의로 삭제하는 것이 불가능하므로 토큰 만료 시간을 꼭 넣어주어야 합니다.
  • 토큰을 클라이언트 쪽에서 저장해야한다(localstorage)

참고사이트 :
http://www.opennaru.com/opennaru-blog/jwt-json-web-token/
https://gorokke.tistory.com/181

profile
열린 마음의 개발자가 되려합니다

0개의 댓글