오늘 학습한 내용
- Spring : Cookie&Session, JWT
문제상황
강의를 학습하는데 JWT의 내용이 전혀 이해가 가지 않아서 스스로의 정리가 필요해 보였다.
오늘의 목표는 'JWT 감잡기'
시도한 내용
강의자료도 여러번 읽어보고 강의도 반복해서 들어봤는데 감이 잡히지 않았다. 그래서 구글링을해서 나름대로 정리를 해야겠다는 생각을 했다.
정리 내용
JWT(Json Web Token)은 인터넷 표준 인증 방식으로 인증에 필요한 정보들을 Token에 담아서 암호화를 시킨 뒤 사용하는 것이다.
JWT는 서버와 클라이언트 간 정보를 주고 받을 때 HTTP 리퀘스트 헤더에 JSON 토큰을 넣은 후 서버는 별도의 인증 과정없이 헤더에 포함되어 있는 JWT 정보를 통해 인증한다. 공개/개인 키를 쌍으로 사용하여 토큰에 서명할 경우 서명된 토큰은 개인 키를 보유한 서버가 이 서명된 토큰이 정상적인 토큰인지 인증할 수 있다.
- JWT 토큰을 클라이언트가 서버로 요청과 동시에 전달한다.
- 서버가 가지고 있는 개인키를 가지고 Signature를 복호화한 다음 base64UrlEncode(header)가 JWT의 header값과 일치한 지, base64UrlEncode(payload)와 일치한 지 확인하여 일치한다면 인증을 허용한다.

JWT는 각각의 구성요소가 점(.)으로 구분되며 구성요소는 다음과 같다.
- Header
- Payload
- Signature
Header
Header에는 토큰의 타입, 사용된 알고리즘을 저장한다.
Payload
Payload는 보통 Claim이라는 사용자에 대한 내용을 key-value의 형태로 저장한다.
표준 스펙상 key는 다음과 같다.
- iss(Issuer) : 토큰 발급자
- sub(Subject) : 토큰 제목 - 토큰에서 사용자에 대한 식별 값이 됨
- aud(Audience) : 토큰 대상자
- exp(Expiration Time) : 토큰 만료 시간
- nbf(Not Before) : 토큰 활성 날짜
- iat(Issued At) : 토큰 발급 시간
- jti(JWT Id) : JWT 토큰 식별자
위의 key를 모두 포함해야하는 것은 아니며 원하면 추가해도 된다.
여기서 주의할 점은 Payload에는 중요한 정보를 담으면 안된다는 것이다. Payload는 암호화가 걸려있지 않지 때문에 누구나 디코딩을 하면 값을 알 수 있다.
Signature
header를 디코딩한 값, payload를 디코딩한 값을 합치고 이를 서버가 가지고 있는 개인키를 가지고 암호화를 한다.
즉, 클라이언트는 임의로 Signature를 복호화할 수 없다. (matches를 사용)
참고
내일배움캠프 Spring 3주차
'TIL&WIL' 카테고리의 다른 글
| 2023-06-21 TIL (Spring 학습, 알고리즘 문풀) (0) | 2023.06.21 |
|---|---|
| 2023-06-20 TIL (Spring, 알고리즘 문풀) (0) | 2023.06.20 |
| 2023-06-16 TIL (Spring 개인 과제) (0) | 2023.06.16 |
| 2023-06-15 TIL (Spring 개인 과제) (0) | 2023.06.15 |
| 2023-06-14 TIL (Spring 2주차 숙제) (0) | 2023.06.14 |