쿠키-세션 방식의 단점을 해결하기 위한 방법으로 사용한다.
토큰이란, 로그인 이후 서버가 만들어서 사용자에게 넘겨주는 문자열
이 문자열은 사용자 정보가 암호화 되어있고, 이 토큰을 이용해 인증된 사용자인지 서버가 판단한다.
이 때 사용되는 토큰이 JWT이고 하나의 표준 인증 방식이다!
JWT는 세 파트로 나눠지며 각 파트는 순서대로 header, payload, Signature 으로 구성된다.
토큰의 타입과 해싱 알고리즘의 정보 이렇게 2가지 정보가 담겨 있다.
typ: 토큰의 타입을 지정한다.-> JWT
alg: 해싱 알고리즘을 지정한다. 보통 HMAC-SHA256 혹은 RSA 가 사용되며, 이 알고리즘은 토큰을 검증 할 때 사용되는 signature 부분에서 사용된다.
토큰의 내용물이 인코딩된 부분
즉, 토큰에 담을 사용자의 정보가 들어 있는 부분이다.
여기에 담는 정보의 한 ‘조각’ 을 클레임(Claim) 이라고 부르고, 이는 Json(Key/Value) 형태의 한 쌍으로 이뤄져있다.
토큰에는 여러개의 클레임들을 넣을 수 있다.
공개용으로 사용하기 위한 claim으로 특정 프로젝트나 조직에서 사용하는 claim을 자유롭게 정의해서 사용할 수 있다.
JWT를 사용하는 개발자나 프로젝트에서만 사용되는 claim을 정의해서 사용할 수 있다.
이를 위해 claim 이름 앞에 일반적으로 발행자(issuer)의 도메인 이름을 추가해 claim 충돌을 방지하는 것이 좋다.
단, Payload는 암호화되지 않기때문에 민감한 정보를 포함하면 안된다.
토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다.
헤더(Header)와 내용(Payload)의 값을 각각 BASE64로 인코딩하고, 인코딩한 값을 비밀키를 이용해 헤더에서 정의한 알고리즘으로 해싱을 하고, 이 값을 다시 BASE64로 인코딩하여 생성한다.
secret key로 사용되는 일련의 문자열으로, 이를 통해 JWT의 위변조 여부를 확인한다.
HttpOnly 속성 사용: 쿠키에 저장할 때 HttpOnly 속성을 설정하면 JavaScript로 쿠키에 접근할 수 없다.
Set-Cookie: token=your_jwt_token; HttpOnly
Content Security Policy(CSP): CSP를 설정하여 악의적인 스크립트가 실행되지 않도록 한다.
입력 검증 및 인코딩: 사용자 입력을 철저히 검증하고, HTML 인코딩을 통해 XSS를 방지한다.
Set-Cookie: token=your_jwt_token; SameSite=Strict
Secure 속성 사용: HTTPS를 통해서만 쿠키가 전송되도록 Secure 속성을 설정한다.
Set-Cookie: token=your_jwt_token; Secure
쿠키 만료 시간 설정: 쿠키의 유효 기간을 설정하여 만료 시간을 짧게 유지한다.
Set-Cookie: token=your_jwt_token; Max-Age=3600
짧은 만료 시간: JWT 토큰의 만료 시간을 짧게 설정하고, 리프레시 토큰을 사용하여 새 토큰을 발급받도록 한다.
const token = jwt.sign({ email }, secretKey, { expiresIn: '15m' });
로그인 세션 관리: 서버 측에서 사용자 세션을 관리하고, 의심스러운 활동이 감지되면 세션을 무효화한다.
document.cookie = "token=; Max-Age=0; path=/; domain=yourdomain.com;";