Jwt_Security (1) - Jwt 란?

Yu Seong Kim·2024년 1월 4일
0

SpringBoot

목록 보기
6/29
post-thumbnail

JWT 란?

  • JWT(JSON Web Token)은 당사자 간에 정보를 JSON 형태로 안전하게 전송하기 위한 토큰이다.

  • JWT는 URL로 이용할 수 있는 문자열로만 구성돼 있고(HTTP 구성 요소중 어디든 위치 가능), 디지털 서명이 적용돼 있어 신뢰 가능하다.

  • 서버와의 통신에서 권한 인가를 위해 주로 사용한다.


JWT 구조

<JWT는 점( . ) 으로 구분된 아래의 세 부분으로 구성됨>

  • 헤더(Header)
  • 내용(Payload)
  • 서명(Signature)

<jwt 토큰 예시> eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ5a2IiLCJyb2xlcyI6WyJST0xFX0FETUlOIl0sImlhdCI6MTY4OTIzNDQxOCwiZXhwIjoxNjg5MjM4MDE4fQ.06dqlDiLaqHm63iS59fKNg1PnNzBX-MytUCQXcEcHRg

헤더(Header)

JWT 헤더는 검증과 관련된 내용을 담고 있으며, 두가지 정보(alg, typ)를 포함 하고 있다

{
	"alg" : "HS256"
    "typ" : "JWT"
}
  • alg에서는 해싱 알고리즘 지정한다.

  • 보통 SHA256 또는 RSA 사용하며, 토큰을 검증할 때 사용되는 서명 부분에 사용한다.

  • HS256은 HMACSHA256을 사용하겠단 의미이다.

  • typ 속성에서는 토큰 타입 지정한다.

완성된 헤더는 Base64Url 형식으로 인코딩돼 사용된다.

내용(payload)

JWT의 내용에는 토큰에 담는 정보를 포함한다.
여기 포함된 속성들을 클레임이라 부른다.

  • 등록된 클레임(Registered Claims)
  • 공개 클레임(Public Claims)
  • 비공개 클레임(Private Claims)

등록된 클레임은 필수는 아니지만 토큰에 대한 정보 담기 위해 이미 이름이 정해져 있는 클레임 의미한다.

<등록된 클레임의 정의>

  • iss : JWT의 발급자(issuer) 주체를 나타냄. iss 값은 문자열이나 URI를 포함하는 대소문자를 구분하는 문자열
  • sub : JWT의 제목(Subject),토큰에서 사용자에 대한 식별값
  • aud : JWT의 수신인(Audience), JWT는 처리하려는 각 주체는 해당 값으로 자신을 식별해야 하는데 처리할려는 주체가 aud 값으로 자신을 식별하지 않으면 JWT는 거부됨
  • exp : JWT 만료시간(Expiration)
  • nbf : Not Before 의미
  • iat : JWT가 발급된 시간(issued at)
  • jti : JWT의 식별자(JWT ID)

공개 클레임은 키 값을 마음대로 정의할 수 있다.(충돌이 안되는 범위 내)

비 공개 클레임은 통신 간에 상호 합의되고 등록된 클레임과 공개된 클레임이 아닌 클레임 의미한다.

{
	"sub" : "wikibooks payload",
    "exp" : "1602076488",
    "userId" : "wikibooks",
    "username" : "flature"
}

서명

JWT의 서명 부분은 인코딩된 헤더, 내용, 비밀키, 헤더의 알고리즘 속성값을 가져와 생성한다.

서명은 토큰의 값들을 포함해서 암호화하기 때문에 메세지가 도중에 변경되지 않았는지 확인할 때 사용한다.

<서명 생성 방식>

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

JWT 디버거 사용하기

https://jwt.io/#debugger-io

profile
인생을 코딩하는 남자.

0개의 댓글