개발일지 - 토큰

아침7시개발·2022년 5월 24일
0

개발일지

목록 보기
14/19
post-thumbnail

토큰

회사에서 통합로그인을 개발중이다.
통합로그인을 하기 위해서 많이들 사용하는 jwt 토큰방식을 이용할 것이다.

jwt

jwtJSON Web Token을 말한다.

  • JSON 포맷을 이용한 Web Token
  • Claim based Token
  • 두 개체에서 JSON 객체를 이용해 Self-contained
  • 방식으로 정보를 안전한게 전달
  • 회원 인증, 정보 전달에 주로 사용
  • RFC 7519

claim based token에서 Claim은 사용자에 대한 프로퍼티 / 속성을 말한다.
토큰 자체가 사용자에 대한 정보가 된다.

jwt의 기본구조

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

JWT 웹 토큰의 헤더 정보

  • typ : 토큰의 타입, JWT만 존재
  • alg : 해싱 알고리즘. (HMAC SHA256 or RSA). 헤더를 암호화 하는게 아니다. 토큰 검증시 사용.
{     
  "alg" : "HS256",
  "typ" : "JWT"
}

Payload

실제 토큰으로 사용하려는 데이터가 담기는 부분. 각 데이터를 Claim이라고 하며 다음과 같이 3가지 종류가 있다.

Reserved claims : 이미 예약된 Claim. 필수는 아니지만 사용하길 권장. key 는 모두 3자리 String이다.
  • iss (String) : issuer,
  • 토큰 발행자 정보exp (Number) : expiration time,
  • 만료일sub (String) : subject,
  • 제목aud (String) : audience,
  • More
Public claims : 사용자 정의 Claim.
  • Public 이라는 이름처럼 공개용 정보
  • 충돌 방지를 위해 URI 포맷을 이용해 저장한다.
Private claims : 사용자 정의 Claim
  • Public claims 과 다르게 사용자가 임의로 정한 정보
  • 아래와 같이 일반 정보를 저장한다.
{   
  "name" : "hak",
  "age"  : 26,
}

Signature

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

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

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

Self-contained : 토큰 자체에 정보가 있다는 사실은 양날의 검이 될수 있다.

토큰 길이 : 토큰 자체 payload 에 Claim set을 저장하기 때문에 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다.

payload 암호화 : payload 자체는 암호화 되지 않고 base64로 인코딩한 데이터다. 중간에 payload를 탈취하면 디코딩을 통해 테이터를 볼 수 있다. JWE 를 통해 암호하하거나, payload에 중요 데이터를 넣지 않아야 한다.

Stateless : 무상태성이 때론 불편할 수 있다. 토큰은 한번 만들면 서버에서 제어가 불가능하다. 토큰을 임의로 삭제할 수 있는 방법이 없기 때문에 토큰 만료시간을 꼭 넣어주는게 좋다.

tore Token : 토큰은 클라이언트 side에서 관리해야하기 때문에 토큰을 저장해야한다.

다음에는 spring boot에서 토큰을 이용한 로그인 방식을 알아보자.

출처

이상학의 개발블로그:티스토리
JWT 인증 예제

profile
쉬엄쉬엄하는 개발자

0개의 댓글