Skip to content

Commit

Permalink
Network : JWT jjuyeon#78
Browse files Browse the repository at this point in the history
  • Loading branch information
shining8543 committed Dec 7, 2021
1 parent 0938fc0 commit 7e8c728
Showing 1 changed file with 85 additions and 0 deletions.
85 changes: 85 additions & 0 deletions network/kkw/JWT.md
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에 서명이 담겨있기에 중간에 보낸 이가 바뀌진 않았는지 정보가 바뀌진 않았는지 검증이 가능

0 comments on commit 7e8c728

Please sign in to comment.