👊 시작하기
앱으로부터 받아온 JWT로 사용자의 아이디를 발췌해서 DB에서 정보를 조회하는 기능,
프론트 header로 받아온 JWT로 관리자의 사번을 발췌해서 데이터 수정 이력을 저장하는 기능을 개발하면서 JWT에 대해 공부하게 됐습니다! 😊
JWT 란?
Json Web Token으로 정보를 안전하게 전송하기 위해 JSON객체로 정의한 표준입니다. 알고리즘을 사용하여 암호화할 수 있고, 위조된 정보인지도 확인할 수 있습니다.
JWT구조
점을 기준으로 세 부분으로 구성됩니다.
xxxxx.yyyyy.zzzzz
Header . Payload. Signature
헤더
서명을 만들 때 어떤 알고리즘을 사용했는지 표시합니다.
{
"alg": "HS256",
"typ": "JWT"
}
페이로드
전달할 정보들을 담고 있습니다.
- iss: JWT 발행자
- exp: 만료시간
- sub: 주제
- 기타 정보
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
서명
메시지가 도중에 변경되지 않았는지 무결성을 검증하는 데 사용됩니다.
JWT 예시
위에서 설명했던 Header.Payload.Signature을 Base64로 암호화한 JWT예시입니다.

JWT디버거를 통해 해독, 검증할 수 있습니다.
JWT 사용 방법

1. 클라이언트가 인증 서버에 승인을 요청합니다.
2. 인증 서버는 권한정보가 담긴 JWT를 반환합니다.
3. 클라이언트는 JWT를 이용하여 필요한 API를 호출합니다.
이때 서버는 서버가 가지고 있는 secret key와 3번을 통해 들어온 JWT의 Payload 정보를 이용해서 Header의 암호화 알고리즘으로 Signature를 생성합니다.
JWT의 Signature와 서버가 직접 만든 Signature 가 일치하는지 검사하여 JWT의 무결성을 판단합니다.
주의점
토큰이 다른 사람들에게 노출되기 때문에 비밀 정보를 입력하면 안 됩니다.
JWT가 필요해진 이유
쿠키
FE에 쿠키 형태로 사용자의 로그인 정보를 브라우저에 저장하면 정보 탈취가 너무 쉬워 위험합니다.
세션
쿠키를 통해 세션 ID를 서버에 전달하면 서버는 DB를 조회해서 로그인한 사용자의 정보를 확인할 수 있습니다.
단점 1. 정보탈취
정보 탈취가 발생한다면 로그인된 정보가 담겨있는 DB데이터를 지우면 됩니다.
하지만, DB 데이터를 지우면 정보 탈취가 발생하지 않은 다른 사용자도 새롭게 로그인을 해야 하는 불편함이 생깁니다.
단점 2. DB Scale Up
사용자가 많아져서 1개의 DB에 세션 정보를 모두 저장할 수 없게 되면 Scale Up을 해서 DB 용량을 늘려야 합니다.
Scale out을 통해 DB를 다중화하면 어떤 사용자의 로그인 정보가 어떤 DB에 저장되어 있는지 모르기 때문에 어떤 DB에 요청해야 할지 모르게 됩니다.
JWT
토큰의 만료시간을 통해 탈취된 Token은 만료시간이 지나면 사용할 수 없습니다.
리프레시 토큰을 통해 만료시간 전 토큰을 갱신할 수 있어 인증된 사용자는 재로그인 없이 계속 서비스를 이용할 수 있습니다.
DB를 조회하지 않고 인증 정보를 확인할 수 있어 속도도 빠르고 DB도 다중화가 가능합니다.
JWT 가 SpringBoot에서 동작하는 과정

Figure 1. Sending WWW-Authenticate Header


🍉 Reference
'Coding > computer science' 카테고리의 다른 글
| JPA | 15장. 프록시 심화 주제, 성능 최적화 (1) | 2024.01.18 |
|---|---|
| JPA에서 Page 기능 사용하기 (4) | 2023.11.23 |
| 자바 ORM 표준 JPA 프로그래밍 | 10. 객체지향 쿼리 언어 (2) | 2023.11.16 |
| 자바 ORM 표준 JPA 프로그래밍 | 09. 값 타입 (+ 값 타입 컬렉션 최적화 방법) (2) | 2023.10.26 |
| 자바 ORM 표준 JPA 프로그래밍 | 08. 프록시와 연관관계 관리 (1) | 2023.10.19 |
