📌 1. Authentication vs Authorization
- Authentication = 인증
- Authorization = 권한 부여
- 한 번 로그인 한 이후에 로그인 상태가 유지되게 하는 것
- 권한 부여를 통해 로그인 상태의 사용자만 사용할 수 있는 기능을 사용할 수 있게 함
- 요청마다 로그인할 수 없으니 로그인을 유지시키는 기술 필요
- 이때 사용되는 것이 세션 혹은 JWT
❓ 2. JWT란?
- JSON Web Token
- JSON 포맷을 이용해 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token
- Token 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달
- 회원 인증이나 정보 전달에 사용
✔ 3. JWT 구조
- Header, Payload, Signature 3부분으로 이루어짐
- JSON 형태인 각 부분은 Base64Url로 인코딩되어 표현
- 각각의 부분을 이어주기 위해 .구분자를 사용

-typ과 alg 두 가지 정보로 구성
- alg: Signature를 해싱하기 위한 알고리즘
{
"alg" : "HS256"
, "typ" : JWT
}
2. Payload(페이로드)
- 토큰에서 사용할 정보의 조각인 claim이 담김
- claim은 Json 형태로 다수의 정보를 넣을 수 있음
- 클레임의 종류
- 토큰의 목적에 따라 클레임이 달라짐
- registered claim에는 토큰 만료시간, 토큰 발급 날짜 등을 작성할 수 있음
3. Signature (서명)
- 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드
- 헤더와 페이로드의 값을 BASE64Url로 인코딩
✔ 4. 동작 방식
- 사이트에 로그인 해 성공적으로 Authentication이 이루어짐
- 서버는 확인서(JWT)를 제공
- 클라이언트는 뭔가를 요청할 때 JWT를 서버에게 같이 보여주며 권한을 확인 받음
- 서버는 JWT만 확인해 Authorization하기 때문에 세션 DB에 저장할 필요가 없음
✔ 5. 저장 위치
- 브라우저 저장소에 저장하는 방법과 쿠키에 저장하는 방법이 있음
- 로컬 스토리지와 세션 스토리지와 같은 브라우저 저장소에 JWT를 저장
- 스크립트 공격(XSS)에 취약해짐
- 쿠키에 저장할 때
http-only
를 사용하면 HTTPS로만 쿠키가 전달되어 보안 강화 가능
- http-only로 쿠키에 추가하는 방법
- CSRF문제는 CSURF와 같은 라이브러리를 사용해 해결
✔ 6. access token & refresh token
- JWT는 토큰 자체에 정보를 담고 있어 보안이 매우 취약
- 토큰을 탈취 당하면 권한과 정보를 모두 빼앗김
- 토큰에 유효기간을 주어 보안을 강화시킨 것
1. access token
- 유효기간을 짧게
- 일반적으로 30분
- access token을 통해서만 자원에 접근 가능
- 유효기간이 매우 짧아서 탈취 당해도 이미 쓸 수 없는 상태
2. refresh token
- 유효기간을 길게
- 일반적으로 2주
- 상대적으로 유효기간이 길어서 탈취당할 수도 있지만 오직 access token을 재발급하는 용도로 사용하기 때문에 이 자체만으로는 쓸모가 없음
3. jwt 인증 과정

-
1~4
- 사용자가 로그인을 하면 서버로부터 access token, refresh token 2개의 토큰을 받음
- 이때 서버는 refresh token을 안전한 저장소에 저장
-
5~7
- 서버로부터 받은 access token의 유효 기간이 지나지 않은 경우 사용자가 어떤 요청을 보낼 때 access token을 함께 보내고 서버는 유효한 지 확인 후 응답을 보냄
-
8~13
- 서버로부터 받은 access token의 유효 기간이 지난 경우 사용자는 refresh token과 함께 요청을 보냄
- 저장소에 저장되어 있던 refresh token과 비교한 후에 유효하다면 새로운 access token과 응답을 함께 보냄
4. jwt 인증 과정 흐름도

참고