01. Java
02. git
03. Database
04. Jsp [Server]
05. HTML,CSS
07. JS
06. 미니프로젝트-2W
08. SpringFramework , SrpingBoot
19. 중간프로젝트 (1M)
10. Linux 명령어
11. AWS
12. Docker
13. Kubernetes
14. React JS
15. JWT (v)
16. App - Android
17. 최종프로젝트 (1M) (v)
- 클라이언트가 아이디/비밀번호를 서버로 전송
- 로그인에 성공하면, 서버는 세션 저장소에 사용자 정보 저장
- 고유한 sessionId를 생성하고 사용자 정보와 함께 매핑
서버에서 클라이언트로 sessionId 전송
클라이언트는 브라우저의 쿠키 저장소에 sessionId 저장
클라이언트의 이후 요청에 sessionId 자동 포함
- 브라우저는 같은 도메인으로 요청시 쿠키에 포함된 sessionID 자동 저송
- 세션 저장소에서 sessionId에 해당하는 사용자 정보 확인
로그인요청
DB에서 로그인 정보 확인 후 JWT발급
서버에서 클라이언트로 JWT 전송
클라이언트는 JWT 저장
sessionStorage
는 브라우저 탭이 닫히면 사라짐localStorage
는 브라우저를 꺼도 남아있음
이후 서버 요청시 필요한데이터 + JWT로 요청
서버는 JWT 검증
- 비밀키 또는 공개키로 유효성 확인
- 위조 여부, 만료 여부 체크
RSA + SHA256
(JWT에서 사용)- 비대칭키 방식
A
는 자신의 개인키로 서명,B
는 A의 공개키로 서명 검증- 공개키로 검증이 가능하므로, 보낸 사람의 신원 확인 및 위조 방지가 가능
HMAC + SHA256
(JWT에서 사용)- 대칭키 방식
- A와 B가 같은 비밀키를 공유
A
는 비밀키로 JWT에 서명하고,B
는 같은 키로 검증- 서명이 같으면 위조되지 않았음을 확인 가능
Base64Url(header ). Base64Url( payload ). Base64Url( HMACSHA256(header + "." + payload, secret) )
{ "alg": "HS256", // 서명알고리즘 "typ": "JWT" // 토큰 타입입 }
토큰에담을 실제 정보(Claim)가 들어감
Base64로 인코딩되며, 암호화되어 있지는 않기 때문에 민감한 정보는 넣지 않음
등록된 클레임
- Iss : 토큰 발급자 (issuer)
- Sub: 토큰 제목 (subject)
- Aud: 토큰 대상자 (audience)
- Exp: 토큰 만료시간 (expiration) – 밀리초형식으로 만들어짐
- Iat : 토큰이 발급된 시간 (issueAt)
- 누구나 사용 가능하지만 충돌 방지를 위해 URI 네임스페이스 권장
- 발급자와 수신자 간의 약속된 데이터
{ "sub": "user123", // 등록된 클레임 "role": "admin", // 비공개 클레임 "exp": 1717430400 // 등록된 클레임 }
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), 서버가 발행한 비밀키 )
HS256
=> 하나의 비밀키로 서명 및 검증RS256
=> 개인키로 서명, 공개키로 검증