본문으로 바로가기

1. 토큰기반 인증의 필요성

 

최근 토큰기반 인증을 지원하고 권장하는 모듈들이 늘어나고 있다. 토큰기반 인증이 활발하게 사용되기 이전에는(물론 지금도 수많은 곳에서 사용중이다) 세션을 사용한 인증을 사용했다. 세션은 최근 부각되고 있는 마이크로 서비스 측면에서 치명적인 단점을 가지고 있다.

 

"스케일 인 / 스케일 아웃 등 확장성이 중요한 마이크로서비스 환경에서 세션 유지에 대한 불편함이 있다."

 

이를 획기적으로 개선할 수 있는 대안이 바로 토큰기반 인증이다.

인증 정보와 기본적인 일부 데이터들을 정해진 시간동안 유효한 토큰으로 만들어 인증에 사용하게 되는데, 이는 서버측 부하를 줄여줄 뿐 아니라 스케일 인 / 스케일 아웃 상황에서 어떤 노드로 커넥션이 옮겨 가더라도 현재의 인증 상태를 유지할 수 있게 된다.

 

다만 토큰은 서버가 클라이언트의 상태를 확인하고 이를 가지고 있어야 하는 stateful 서비스에는 적합하지 않다.

 

2. JWT (Json Web Token)

 

JWT(Json Web Token)은 json string 형태로 되어있는 토큰이다.

JWT이외로 많이 사용되고 있는 Oauth 토큰과의 가장 큰 차이점은 토큰 자체에 정보를 담고있는지에 대한 여부이다. Oauth 토큰의 경우 인증의 유효성 여부만 판단할 수 있기에 만약 서버가 해당 토큰에 담겨있는 인증 사용자의 다른 정보를 확인하기 위해서는 추가적인 서버 작업이 필요하다. 

이와는 다르게 JWT의 경우 JSON형식의 토큰 자체에 필요한 정보들이 담겨있기 때문에 인증 외로 필요한 작업들이 있을 때 서버에서 추가 작업이 필요 없다는 장점이 있다.

 

3. JWT 구성

JWT는 xxx.yyy.zzz 와 같이 . 을 구분자로 3가지 구역으로 나누어져 있다.

 

3.1. Header

JWT의 가장 앞 구역은 header이다. Header에는 typ(토큰의 타입), alg(해시 알고리즘)을 담고있다.

 

3.2. Payload

JWT의 중간 부분을 구성하는 Payload(내용)이다.

토큰이 담고있는 정보가 들어있으며 key/value 쌍으로 이루어진 정보 하나 하나를 claim이라고 부른다.

클레임의 종류는 다음과 같이 세가지로 나누어진다.

 

3.2.1. registered claim

토큰 자체에 대한 정보들을 담고있는 클레임들이다. 미리 정해진 이름들을 사용해야 하지만 필수적으로 필요한 클레임은 없다.

  • iss : 토큰 발급자

  • sub : 토큰의 제목

  • aud : 토큰의 대상

  • exp : 토큰 만료일시

  • nbf : Not Before의 약자이며 지정된 날자가 도달하기 전까지는 토큰이 처리되지 않는다.

  • iat : 토큰이 발행된(issued) 시간을 의미한다.

3.2.2. public claim

public claim은 collision-resistant해야 하며 주로 URL 형식으로 만들어진다.

ex) {"https://leafcats.com/has_role" : true}

 

3.2.3. private claim

서비스에 필요한 정보들이 저장된다. 해당 사용자의 role, 이름 등 서비스에 사용될 정보들이 저장되어 있다.

 

 

3.3. Signature

JWT 마지막 영역은 서명 정보로 이루어져 있다. 서명은 Header의 인코딩된 값과 Payload의 인코딩값을 합친 다음 private key로 해싱 하여 생성된다. 서버는 이를 통해 해당 토큰의 위변조 여부를 판단할 수 있다.

즉, 해커가 header와 payload에 있는 정보를 변조했다 하더라도 서버에서 이를 다시 해싱했을 때 signature 영역과 다르다면 유효한 토큰이 아니라고 판단할 수 있는 것이다.

 

 

 

JWT 토큰 발급 및 사용 Java 예제 : www.leafcats.com/310

 Other Contents 

댓글을 달아 주세요

  1. 불의남자 2021.08.13 16:05

    제2의 비트코인 꼭보세요!! (이제 올라갈듯 ㅋ)

    2008년에 비트코인을 매일 50코인을 무료로 채굴할 수 있었습니다. 대부분의 사람들은 가치가 없다고 느꼈습니다. 지금 비트코인(Bitcoin)은 1코인당 6000만원 상당의 가치가 있습니다.

    2011년에 라이트코인이 선보였고, 매일 100코인을 무료로 채굴할 수 있었습니다. 대부분의 사람들은 이것이 여전히 가치가 없다고 생각했습니다. 라이트코인(Lite coin)은 현재 1코인에 30만원입니다.

    이더리움이 2015년에 나왔습니다. 매일 30코인을 무료로 채굴할 수 있었습니다. 대부분의 사람들은 여전히 그것을 믿지 않았습니다. 이제 이더이움(Ethereum)은 1코인당 300만원 상당의 가치가 있습니다.

    현재 전 세계적으로 돌풍을 일으키고 있는 상장을 준비중인 최고의 가치를 내재하고 있는 코인을 알려드립니다.

    **파이코인**

    파이코인은 2019년에 태어났고 몇 번의 반감기를 거쳐 지금 하루에 6코인정도를 무료로 채굴할 수 있습니다.

    다음 반감기 오기전 혹은 무료채굴 종료 전에 서두르셔야 합니다.

    비트코인의 단점을 보완하여 스마트폰으로 채굴 할수 있는 파이코인.

    스마트폰의 성능에 전혀 지장이 없으며, 하루 1번의 스위칭으로 24시간(1세션)동안 무료 채굴 합니다.

    이 황금같은 기회를 놓치지 마세요..!!

    파이(PI)는 스탠퍼드 박사들이 개발한 새로운 디지털 화폐이며 전 세계적으로 2100만 명 이상의 사용자가 존재합니다.
    파이를 받으시려면 앱스토어에 파이네트워크(pi network) 검색 설치 후 가입 시 저의 사용자 이름 firenews 누르시면 가입됩니다.

    http://minepi.com/firenews

    파이코인 이외에 2번째로 관심있는 코인인 비(bee)코인은 현재 1200만명이 넘고 올해 상장합니다.
    앱스토어에서 bee network 치고 다운로드받아 추천인 firenews1004 입니다.

    영국에서 나온 올해 9월 상장예정인 유망한 이글코인은 앱스토어에서 이글코인 치시고 다운받으셔서 추천인 firenews 입니다.

    싱가폴에서 나온 올해 상장예정인 전망 높은 ANT코인은 앱스토어에서 ANT NETWORK 치시고 다운 받아 추천인 firenews1004 입니다.

    카카오그룹에서 나온 유망한 코인인 카우카우코인은 핫빗코리아에 상장했으며 아직 채굴 가능합니다.
    카우카우코인 다운 받으셔서 추천인 ZBKJNQ 입니다.