개발로 자기계발
article thumbnail
Published 2023. 1. 7. 12:41
JSON Web Token(JWT) Develop/기초지식
728x90

1. JSON Web Token란?

=> 유저를 인증하고 식별하기 위한 토큰 기반 인증

=> 흔하게 회원 인증 / 정보 교류에 쓰인다.

 

JWT는 JSON 객체를 사용하는 쌍방 간의 데이터와 정보를 안전하게 전송하는 독립적인 방법이다.
=> 토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함 된다.

각각의 JWT는 전자서명이 가능하기 때문에 JWT는 신뢰할 수 있다. 이는 서버가 JWT의 변경이 된 사항들을 알 수 있게 한다.
=> 전자서명은 Header, Payload가 변조되었는지 확인하기 위해 사용되는 정보이며 JWT를 신뢰할 수 있는 토큰으로 사용할 수 있는 근거가 된다.

JWT는 기본 인증 및 다이제스트 인증 방식과 다르게 권한 부여 방식이다.
=> 서버에서 세션을 계속해서 유지 할 필요가 없다. 유저가 요청 했을 때만 토큰을 확인한다.

not authentication

authorization(권한부여): 각 요청에 로그인하지 않고도 관계를 유지 -JWT

authentication(인증): 자격증명 확인 (비밀번호)

JWT는 서버와 클라이언트 사이에서 정보를 교환하기 위한 좋은 방법이다.


2. JSON Web Token 구조

 

Header(a) / Payload(b) / Signature(c)

ex) aaaaaaaa.bbbbbbbb.cccccccc

 

Header
JWT에서 사용할 타입과 해시 알고리즘의 종류가 담겨있음.

{
"alg": "HS256",
"typ": "JWT
}

Payload
서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있음.
Base64를 사용하여 인코딩
클레임 참고 - https://velopert.com/2389
· Registered: 사전정의되고 권장되지만 필수는 아님 (iss, sub, exp)
···· iss : issuer 로 보안 주체 식별
···· sub: subject, locally or globally unique
···· exp : expiration time, 토큰 만료 시간
· Public: 충돌이 방지된 이름으로 url 을 주로 사용
· Private: 클라이언트 서버 협의하에 사용되는 클레임 이름들

{
"Sub": "1234567890",
"name": "Zamm Bon",
"given_name": "Zamm",
"family_name": "Bon",
"email": "zammbon@gamil.com",
"admin": true
}


Signature
Header, Payload를 대상으로 Base64 URL-safe Encode를 적용, (secret)해싱 후 이를 대상으로 비밀키로 서명한 것.

HMACSHA256(
        base64 Url Encode(header) + "." +
        base64 Url Encode(payload),
        secret

)

3. JWT 생성

위 구조로 JWT를 생성했을 때의 모습(. 을 기준으로 앞이 Header, 중간이 Payload, 마지막이 Signature

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJTdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IlphbW0gQm9uIiwiZ2l2ZW5fbmFtZSI6IlphbW0iLCJmYW1pbHlfbmFtZSI6IkJvbiIsImVtYWlsIjoiemFtbWJvbkBnYW1pbC5jb20iLCJhZG1pbiI6dHJ1ZX0.kxbXpyiZYEFgGqE7e7YP26AYRdlKwknShyidRuzyCWw

ex) JWT토큰을 검증하고 생성 할 수 있게 해주는 디버거 서비스 - https://jwt.io/

※ client는 매 request 마다 authorization header에 token을 넣어서 보냄 (using bear schema)

※ API는 중요한 데이터를 클라이언트에게 다시 보내지 않음

※ client가 secret key를 찾아내지 않는 이상 JWT는 안전


4. JWT 진행 순서

  1. 클라이언트 사용자가 아이디, 패스워드를 통해 웹서비스 인증한다.
  2. 서버에서 서명된 JWT를 생성하여 클라이언트에 응답으로 돌려준다.
  3. 클라이언트가 서버에 데이터를 추가적으로 요구할 때 JWT를 HTTP Header에 첨부한다.
  4. 서버에서 클라이언트로부터 온 JWT를 검증한다.
JWT는 JSON데이터를 Base64 URL-safe Encode를 통해 인코딩하여 직렬화한 것이 포함되며 토큰 내부에는 위변조 방지를 위해 개인키를 통한 전자서명도 있다.
그래서 사용자가 JWT를 서버로 전송하면 서버는 서명을 검증하는 과정을 거치게 되며 검증이 완료되면 요청한 응답을 돌려준다. 

 

728x90
SMALL

'Develop > 기초지식' 카테고리의 다른 글

자료구조 & 알고리즘 - 1  (0) 2023.04.10
코딩 테스트 특강 간단 정리  (0) 2023.04.10
쿠키와 세션의 정의  (0) 2023.01.31
HTTP / HTTPS 대한 기본 정리  (0) 2022.12.31
인코딩 정의 / 디코딩 정의  (0) 2022.12.30
profile

개발로 자기계발

@김잠봉

틀린부분이나 조언이 있다면 언제든 환영입니다:-)