JWS 를 소개하겠습니다.


JOSE (JSON Object Signining and Encryption) 의 아래에 있는 Spec 중 하나로 OAuth 의 근간이 된 기술이라고 한다.



아래는 JOSE 에 속한 기술들. 이 외에도 좀 더 있다.


JWT (JSON Web Token) : JWS or JWE

JWS (JSON Web Signature) : 서버에서 인증을 증거로 인증 정보를 서버의 private key 로 서명한 것을 Token 화 한것.

JWE (JSON Web Encryption) : 서버와 클라이언트 간 암호화된 데이터를 Token 화 한것.

JWK (JSON Web Key) : JWE 에서 payload encryption 에 쓰인 키를 token 화 한것. (물론, 키 자체도 암호화되어 있죠.)



JWS 구조는 header, payload, signature 로 나뉘며 header 와 payload 는 JSON Object 로 되어있고 signature 는 이 둘을 서명한 것이다.

각각에 대해 Base64  를 하고 . 으로 구분하면 이것이 바로 JWT 가 된다.


예를 들어보자

header 원본: 

{

  "alg": "HS256",

  "typ": "JWT"

}


payload  원본:

{

  "sub": "1234567890",

  "name": "John Doe",

  "admin": true

}


JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ


Base64(header) = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Base64(payload) = eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

Base64(signature) = TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ



서명에 쓰인 키는 Token 을 생성하는 자 (주로 인증 서버) 의 private key 이다.

이는 내부적으로 생성하여 가지고 있으면 된다.



자, 그럼 JWS 를 이용하여 인증을 하는 매커니즘을 살펴보자.

1. 클라이언트 A 가 로그인

2. 서버에서는 payload 에 넣고 싶은 내용을 담은 후 (로그인한 사람의 정보, 접근 권한 등) 서명하고 Token 발행

3. 클라이언트는 다음 통신에서 항상 Token 을 함께 전달

4. 서버에서는 주요 통신에서 Token 을 확인. 내가 서명한 것이 맞는지 서명에 대한 validation 수행

5. 내가 한 서명이 맞고 인증 정보를 확인한 후 적절히 행동.

How does a JSON Web Token works


payload 는 제약이 없다.

하지만 header 의 경우 pre defined key 가 있기 때문에 이를 제외하고 추가할 내용이 있다면 추가하면 된다.



아래는 참고 사이트

JOSE http://jose.readthedocs.io/en/latest/

JOSE Documents https://datatracker.ietf.org/wg/jose/documents/ 

AuthO https://auth0.com/learn/json-web-tokens/

JWT https://jwt.io/

+ Recent posts