forked from jjuyeon/Tech-Interview-Study
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
0938fc0
commit 7e8c728
Showing
1 changed file
with
85 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
## JWT | ||
|
||
### Json Web Token | ||
|
||
- 선택적 서명 및 선택적 암호화를 사용하여 데이터를 만들기 위한 인터넷 표준 | ||
- Payload는 Claim과 assert를 처리하는 JSON을 보관하고 있다 | ||
- 토큰은 공개/비공개 키를 사용하여 서명된다 | ||
|
||
### 구조 | ||
|
||
- Header | ||
|
||
```JSON | ||
{ | ||
"alg" : "HS256", | ||
"typ" : "JWT" | ||
} | ||
``` | ||
|
||
- 서명 생성을 위해 어느 알고리즘을 사용할지를 식별 | ||
- 주로 HS256이나 RS256 알고리즘을 사용한다 | ||
- Payload | ||
|
||
```JSON | ||
{ | ||
"sub": "1234567890", | ||
"name": "KIM KYUNG WON", | ||
"admin": true, | ||
"iat": 1516239022 | ||
} | ||
``` | ||
|
||
- 일련의 클레임들을 포함, 표준 필드인 7개의 등록 필드와 사용자 지정 클레임이 들어간다. | ||
- 등록 클레임 | ||
- iss : 토큰 발급자 | ||
- sub : 토큰 제목 | ||
- aud : 토큰 대상자 | ||
- exp : 토큰의 만료 시간 | ||
- nbf : Not before, 토큰의 활성 날짜 | ||
- iat : 토큰이 발급된 시간 | ||
- jti : jwt의 고유식별자 | ||
- 공개 클레임 | ||
- JWT 를 사용하는 사람들에 의해 정의된 클레임 | ||
- 참고 : https://www.iana.org/assignments/jwt/jwt.xhtml | ||
- 공개 클레임은 서로 충돌이 방지된 이름을 가지고 있어야 하므로 URI 형태로 짓는다. | ||
- 비공개 클레임 | ||
|
||
- 서버와 클라이언트간에 협의하에 사용되는 클레임 | ||
|
||
- Signature | ||
|
||
```JSON | ||
HMACSHA256( | ||
base64UrlEncode(header) + "." + | ||
base64UrlEncode(payload), | ||
your-secret-key | ||
) secret base64 encoded | ||
``` | ||
|
||
- 서명은 위에서 만든 Header와 Payload의 값을 각 BASE64로 인코딩하고, 그 값을 비밀키를 이용해 헤더에서 정의한 알고리즘으로 해싱하고, 이 값을 다시 BASE64로 인코딩하여 생성한다. | ||
|
||
- Header와 Payload는 Base64로 인코딩 되었을 뿐 암호화는 Signature에만 적용되어있다. | ||
- 즉 개발자는 HTTPS와 같은 시스템 수준의 암호화를 통해서 외부 노출 차단을 막고, 데이터의 신뢰성 평가를 암호화 토큰을 통해서 보장한다. | ||
|
||
### 장단점 | ||
|
||
- 장점 | ||
- 별도의 인증 저장소가 필요없음 | ||
- 토큰의 신뢰성을 확인하는데 네트워크 연결이 따로 필요하지 않음 (독립적임) | ||
- REST 서비스고 제공 가능 | ||
- 수평 스케일이 용이 | ||
- URL 파라미터와 헤더로 사용이 가능 | ||
- 내장된 만료 | ||
- 트래픽에 대한 부담이 낮음 | ||
- 디버깅 및 관리가 용이 | ||
- 단점 | ||
- 필드가 많아지면 토큰이 커질 수 있음 | ||
- 모든 요청에 보내질 수 있으므로 신경을 써줘야함 | ||
- 토큰이 탈취되더라도 막을 수 없음 | ||
- JWT 헤더만으로 중요한 유효성을 확인하지 말 것 | ||
|
||
### 주 사용처 | ||
|
||
- 회원 인증 | ||
- 정보 교류 : JWT에 서명이 담겨있기에 중간에 보낸 이가 바뀌진 않았는지 정보가 바뀌진 않았는지 검증이 가능 |