반응형
JWT
JWT란 유저를 인증하고 식별하기 위한 토큰 기반 인증이다.
JWT의 특징으로는 토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함된다는 것이다.
JWT 사용 순서
- 클라이언트 사용자가 아이디, 패스워드를 통해 웹 서비스 인증.
- 서버에서 singed된 JWT를 생성하여 클라이언트에 응답
- 클라이언트가 서버에 데이터를 추가적으로 요구할 때 JWT를 HTTP Header에 첨부
- 서버에서 JWT 검증
결론적으로 우리는 애플에서 전달해준 JWT를 검증하는 과정을 거쳐야 한다.
JWT 구조
JWT 구조로는 Header, Payload, Signature 구조로 되어 있다.
Header에는 JWT에서 사용할 타입과 해시 알고리즘의 종류가 담겨 있다.
- 헤더에는 두 가지 정보가 담겨있다.
- typ: 토큰의 타입을 지정합니다. 바로 JWT를 말하는 것입니다.
- alg: Signature 해싱 알고리즘을 지정합니다. 해싱 알고리즘으로는 보통 HMAC-SHA256 혹은 RSA 가 사용되며, 이 알고리즘은 토큰을 검증 할 때 사용되는 signature 부분에서 사용됩니다.
Payload는 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨 있다.
- 클레임의 종류는 세 가지이다.
- 등록된 클레임, 공개 클레임, 비공개 클레임
- 등록된 클레임
iss | 토큰 발급자 (issuer) |
sub | 토큰 제목 (subject) |
aud | JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용됩니다. 일회용 토큰에 사용하면 유용합니다. |
exp | 토큰의 만료시간 (expiraton), 시간은 NumericDate 형식으로 되어있어야 하며 (예: 1480849147370) 언제나 현재 시간보다 이후로 설정되어있어야합니다. |
nbf | Not Before 를 의미하며, 토큰의 활성 날짜와 비슷한 개념입니다. 여기에도 NumericDate 형식으로 날짜를 지정하며, 이 날짜가 지나기 전까지는 토큰이 처리되지 않습니다. |
iat | 토큰이 발급된 시간 (issued at), 이 값을 사용하여 토큰의 age 가 얼마나 되었는지 판단 할 수 있습니다. |
jti | JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용됩니다. 일회용 토큰에 사용하면 유용합니다. |
- 공개 클레임(Public Claim)
- 공개 클레임들은 충돌이 방지된 (collision-resistant) 이름을 가지고 있어야 합니다. 충돌을 방지하기 위해서는, 클레임 이름을 URI 형식으로 짓습니다.
https://.com/jwt_claims/is_admin | true |
- 비공개 (Private Claim)
- 등록된 클레임도아니고, 공개된 클레임들도 아닙니다. 양 측간에 (보통 클라이언트 <->서버) 협의하에 사용되는 클레임 이름들입니다. 공개 클레임과는 달리 이름이 중복되어 충돌이 될 수 있으니 사용할때에 유의해야합니다.
- 등록된 클레임도아니고, 공개된 클레임들도 아닙니다. 양 측간에 (보통 클라이언트 <->서버) 협의하에 사용되는 클레임 이름들입니다. 공개 클레임과는 달리 이름이 중복되어 충돌이 될 수 있으니 사용할때에 유의해야합니다.
username | velopert |
Signature에는 Header, Payload를 Base64URL-sfae Encode를 한 이후 Header에 명시된 해시함수를 적용하고, 개인키(Private Key)로 서명한 전자 서명이 담겨있다.
- • 서명(Signature)은 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드입니다. 서명은 위에서 만든 헤더(Header)와 페이로드(Payload)의 값을 각각 BASE64로 인코딩하고, 인코딩한 값을 비밀 키를 이용해 헤더(Header)에서 정의한 알고리즘으로 해싱을 하고, 이 값을 다시 BASE64로 인코딩하여 생성합니다.
전자 서명에는 비대칭 암호화 알고리즘을 사용하므로, 암호화를 위한 키와 복화를 위한 키가 다르다.
암호화(전자 서명)에는 개인키를, 복호화(검증)에는 공개키를 사용한다.
references
JWT
반응형
'애플리케이션 개발 > ios' 카테고리의 다른 글
[ios] Base64 decode (0) | 2022.12.27 |
---|---|
[Mac] Git 설치 및 연동 (0) | 2022.05.06 |
[Mac] M1 자바 버전 11로 변경 (0) | 2022.04.29 |
Could not build Objective-C module 'Firebase' (0) | 2022.01.22 |
M1에서 터미널 사용 (0) | 2022.01.22 |