이 게시글은 강의를 듣고 정리한 내용이 주를 이루고 있습니다.
수강 강의 : (인프런) 스프링부트 시큐리티 & JWT 강의
🏠 https://github.com/devwuu/spring-security-exam
1. JWT ?
- 공식 문서 : https://jwt.io
- Json Web Token의 약자
- 암호화된 메세지를 주고 받을 수도 있지만 서명에 중점을 두었다.
- Header, Payload, Signature로 이루어져있고 각각을 순서대로 .을 이용해 연결하여 표현한다
2. JWT를 이용한 인증

- client 에서 로그인 시도
- Server는 User 인증 완료시 JWT 토큰 생성
(1) Header : 암호화 알고리즘 (e.g. HS256)
(2) Payload : 내용 ( e.g. { userId: "" } )
(3) Signature : BASE64(Header) + BASE64(Payload) + [ BASE64(비밀키) | 비밀키 | ... ]를 Header에 적인 암호화 알고리즘으로 암호화 한 내용.
암호화 방식에 따라서 무엇을 암호화 할 것인지에 대해 조금씩 차이가 있으며 디버거에서 각 암호화 알고리즘을 눌러 확인해볼 수 있음.
(4) header, payload, signature 각각을 BASE64로 인코딩한 뒤 .을 이용하여 순서대로 연결해서 JWT 토큰을 완성함
- Server에서 JWT 토큰을 응답함
- Client에서 응답 받은 JWT 토큰을 저장함 ( e.g. localStorage)
- 이후 발생하는 Request는 JWT 토큰을 헤더에 넣어 요청함
- Server는 request 헤더에 있는 JWT 토큰의 Header, Payload와 자신의 비밀키를 Header에 적인 암호화 알고리즘을 이용하여 암호화한다. 이 값이 JWT 토큰의 signature와 일치하면 정상적으로 reponse한다.
3. JWT의 암호화 알고리즘
3-1. HS256
- HMAC + SHA256
- 대칭키 방식 + 해시
- HMAC은 비밀키를 포함하여 암호화한다
- 대칭키 방식이기 때문에 토큰을 발급해주는 주체와 인증(소비)하는 주체가 동일할 때 사용하면 된다.
(키를 공유하면 안됨)
3-2. RS256
- RSA + SHA256
- 비대칭키 방식 + 해시
- 비대칭키 방식이기 때문에 개인키로 암호화하여 서명하고 공개키로 복호화하여 인증한다
- 토큰 발급 주체와 인증(소비)하는 주체가 다를 경우에 사용하면 된다.
이 외에도 여러가지 방식이 있지만 강의에서는 HS256을 사용한다.
정리가 잘 된 글이네요. 도움이 됐습니다.