본문 바로가기

좋아하는 것_매직IT/1.spring

34.Spring, 스프링 시큐리티관련 JWT(JSON Web Token) 에 대해서 알아보자.

반응형

블로그목적

스프링시큐리티 관련 JWT(JSON Web Token)에 대해서 공부및 정리후 공유한다.

JWT(JSON Web Token) 이란?

IETF(Internet Engineering Task Force) 에서 제안한 공개 표준(RFC-7519)

RFC-7519

https://tools.ietf.org/html/rfc7519

JSON Web Token (JWT) is a compact, URL-safe means of representing

claims to be transferred between two parties. The claims in a JWT

are encoded as a JSON object that is used as the payload of a JSON

Web Signature (JWS) structure or as the plaintext of a JSON Web

Encryption (JWE) structure, enabling the claims to be digitally

signed or integrity protected with a Message Authentication Code

(MAC) and/or encrypted.

OAuth2 토큰을 위한 표준 구조를 제공함.

OAuth2 는 토큰 기반 프레임워크

but, 명세에는 토큰을 정의하는 방법이 제공되지 않음.

즉, 해당 OAuth2 토큰 표준이 부족한 것을 해결하기 위해 JWT라는 새로운 표준이 등장함.

Spring Cloud Security는 기본으로 JWT를 지원함.

JWT 사용처

회원인증, 정보교류 기타 등등.

그럼, JWT 는 어떻게 구성되어있나 알아볼까요?

위와 같이 마침표(.)을 구분자로 3개의 문자열로 구성됨.

헤더(header)

2가지 정보로 구성됨

typ

토큰 타입을 지정 : JWT

alg

해싱 알고리즘을 지정

해싱 알고리즘으로는 보통 HMAC SHA256 혹은 RSA 가 사용됨.

이 알고리즘은, 토큰을 검증 할 때 사용되는 signature 부분에서 사용함.

헤더(header) 예시

설명

토큰 타입은 JWT

해싱 알고리즘

HMAC SHA256

내용(payload)

payload 부분에는 토큰에 담을 정보가 존재함.

여기에 담는 정보의 한 ‘조각’ 을 클레임(claim) 이라 부름

구성은 name / value 의 한 쌍

그리고, 토큰에는 여러개의 클레임 들을 넣을 수 있음.

클래임의 종류

아래와 같이 크게 3 종류

등록된(registered) 클레임

서비스에서 필요한 정보들이 아닌, 토큰에 대한 정보들을 담기위하여 이름이 이미 정해진 클레임을 말함.

iss

토큰 발급자 (issuer)

sub

토큰 제목 (subject)

aud

토큰 대상자 (audience)

exp

토큰의 만료시간 (expiraton)

시간은 NumericDate 형식(예: 1480849147370)

언제나 현재 시간보다 이후로 설정되어있어야합니다.

nbf

Not Before 를 의미함.

토큰의 활성 날짜와 비슷한 개념

NumericDate 형식으로 날짜를 지정

이 날짜가 지나기 전까지는 토큰이 처리되지 않음.

iat

토큰이 발급된 시간 (issued at)

이 값을 사용하여 토큰의 age 가 얼마나 되었는지 판단 할 수 있음.

jti

JWT의 고유 식별자

주로 중복적인 처리를 방지하기 위하여 사용됨.

일회용 토큰에 사용하면 유용함.

공개(public) 클레임

충돌이 방지된 (collision-resistant) 이름을 가지고 있어야 함.

충돌을 방지하기 위해서는, 클레임 이름을 URI 형식으로 지음.

비공개(private) 클레임

등록된 클레임도아니고, 공개된 클레임도 아님.

클라이언트와 서버간 협의하에 사용되는 클레임

공개 클레임과는 달리 이름이 중복되어 충돌이 될 수 있으니 사용할때에 유의해야함.

내용(payload) 예시

설명

등록된 클레임

2개

공개 클레임

1개

비공개 클레임

2개

서명(signature)

JSON Web Token 의 마지막 부분

이 서명은 헤더의 인코딩값과 정보의 인코딩값을 합친 후 주어진 비밀키로 해쉬를 하여 생성함.

서명 부분을 만드는 슈도코드(pseudocode)의 구조

 

위와 같이 만든 헤더/내용/서명을 각각 base64 인코딩하여, 아래 형식으로만들면 JWT 가 됨.

base64(헤더).base64(내용).base64(서명)

 

JWT 의 특징

다양한 언어 지원

C, Java, Python, C++, R, C#, PHP, JavaScript, Ruby, Go, Swift 기타 등등.

대부분의 주류 프로그래밍 언어에서 지원됨.

쉡게 전달 가능함.

JWT 토큰은 Base64로 인코딩되어 URL or HTTP 헤더 or HTTP POST 매개 변수로 쉽게 전달될 수 있음.

암호로 서명됨

JWT 토큰은 토큰을 발행하는 인증 서버에서 서명됨.

다시말해서, 토큰이 조작되지 않음을 보장할 수 있다는 의미.

자체 완비

JWT 토큰은 암호로 서명됨.

즉, 서비스를 수신하는 마이크로서비스는 토큰의 내용물이 유효하다는 것을 보장받을 수 있음.

수신 마이크로서비스가 토큰의 서명 유효성을 검증 및 토큰 내용물(만료시간등등)을 확인할 수 있음.

다시말해서, 토큰 내용물을 검증하기 위해, 인증 서비스를 다시 호출할 필요 없음.

확장성

인증 서비스가 토큰을 생성할 때 토큰이 봉인되기 전, 토큰에 추가 정보를 넣을 수 있음.

그리고,수신서비스는 토큰 payload를 복호화해서 추가 정보를 조회할 수 있음.

참고페이지

https://jwt.io/

해당 페이지에서, 아래와 같이 디버거도 지원함

결론

JWT(JSON Web Token) 은 IETF(Internet Engineering Task Force) 에서 제안한 공개 표준(RFC-7519) 임.

JWT 는 아래와 같이 마침표(.) 를 구분자로 3개의 구성요소로 구성되어 있음.

(헤더).(내용).(서명)

오늘도 JWT 에 대한 지식 한개 획득완료! 감사합니다.


오늘의 명언 한마디

언제 어디서나, 믿을 수 있는 것은 너 하나이다.

네 행복은 네가 쌓은 것이다. 네가 발견하는 것이다.

쇼펜하우어 지음, "쇼펜하우어 인생론" 중에서..


오늘의 영어 한마디

We're really proud of this product.

바로 이것이 우리회사가 가장 자랑하는 상품입니다.

I can see why.

과연 그럴 만하군요.

설명

"be proud of~" 는 "~을 자랑스럽게 생각하다" 라는 뜻을 가짐.

"I can see why." 는 동의를 나타내는 표현.


오늘의 민법 한마디

제2편 물권 / 제 1장 총칙

제188조(동산물권양도의 효력, 간이인도)

1. 동산에 관한 물권의 양도는 그 동산을 인도하여야 효력이 생긴다.

2. 양수인이 이미 그 동산을 점유한 때에는 당사자의 의사표시만으로 그 효력이 생긴다.


오늘의 재무제표 공부 한마디

재무상태표

특정 시점의 자산, 부채, 자본을 나타내는 재무제표.

기본회계등식(자산 = 부채 + 자본)은 언제나 성립해야 한다.


목표

- 나의 강점을 바탕으로 나의 일을 잘해냄으로써 타인과 사회를 아릅답게 만든다.

- 현재 내가 가진 능력으로 누군가에 도움이 될 수 있을까? 에 대해서 항상 생각하기

- 나는 블로그 생태계에서 IT 테크관련 파워블로거및 인플루언서가 반드시 된다!

목표를 이루기 위한 실천방안

- 꾸준한 블로깅/기록법/독서법으로 넘버원이 아닌 온리원이 되보자.

- 천사불여일행(千思不如一行)을 항상생각하며 체화 및 각인시키자.

- "천번 생각하는것보다 한번 행동하는 것이 더 중요하다."

- 기기일약 불능십보(騏驥一躍 不能十步) / 노마십가 공재불사(駑馬十駕 功在不舍)

- 천리마도 한번에 열걸음을 뛸 수 없고, 느리고 둔한말이라도 열흘이면 하룻길을 간다.

- 모든 실수에는 마술이 숨어 있다. 따라서 나는 실수하면 실수할수록, 그런 실수에서 더 많이 배울수록 삶에서 더 많은 마술을 갖는다.

728x90
300x250