Access token
: 짧은 수명 주기, 서버로부터 승인을 받아 인증이 필요한 모든 HTTP Request에 포함됌Refresh token
: 긴 수명 수기, access token
이 만료
되었을 때 새로운 access token
을 발급해주는 토큰장점: 편리함
javascript접근이 편리.
Authorization Bearer ${access token}
처럼 HTTP Header에 넣어서 사용.
단점: XSS 공격에 취약
XSS공격은 공격자가 javascript를 실행할 수 있을 때 발생. 이는 localstorage에 저장된 access token이 탈취 당할 수 있다는 얘기다. XSS공격은 프로젝트에 포함되는 third-party library코드에 의해서 발생할 수 있다. 그렇다고 third-party library를 포함하지 않는 것은 불가능 함.
장점: javascript접근불가, 따라서
localStorage
만큼 XSS공격에 취약하지 않다.
XSS공격시 cookie의 httpOnly
, secure
옵션 사용시 안전
그리고 쿠키는 자동으로 모든 HTTP요청에 포함되어 보내진다.
단점: 일부 케이스에서 토큰을 쿠키에 저장하지 못할 수도 있다.
쿠키는 4kb의 size limit을 가지기때문에 4kb가 넘는 JWT토큰을 사용한다면 쿠키는 적절하지 않을 수 있다.
또한 API서버가 쿠키를 사용할 수 없거나 API의 요청에서 access token을 header에 넣어줘야 한다면 쿠키를 사용할 수 없을것이다.
httpOnly
를 적용한 cookie
는 javascript로 접근이 불가능하지만 이것이 XSS공격에 완전히 안전하다는 얘기는 아니다.
공격자가 당신의 애플리케이션에서 javascript를 실행할 수 있을 때, 자동적으로 당신의 쿠키가 포함되는 HTTP요청을 서버로 보낼 수 있다. 공격자를 쿠키에 있는 토큰을 읽을 수 없지만 읽지 않아도 공격하는데 크게 문제되는 부분은 없다.
cookies
가 취약점이 여전히 존재하지만 localStorage
보다 선호된다. why?
httpOnly
플래그를 사용한다면 쿠키가 조금 더 공격자가 접근하기 어렵다.sameSite
플래그와 anti-CSRF tokens
를 사용한다면 어느정도 예방가능.refresh token을
httpOnly
cookie에 저장: CSRF공격으로부터 안전하고 XSS노출에 대해 조금 더 낫다.
access token : memory save(변수에 저장, const accessToken = TOKEN_VALUE)
refresh token : cookie
Step 1
유저가 인증할 때 access token
, refresh token
반환
refresh token
을 cookie에 셋업
httpOnly
플래그 사용해서 javascript가 쿠키를 읽는것을 방지secure=true
플래그 사용하면 HTTPS
에서만 요청을 보낼 수 있다.sameSite=strict
플래그를 사용해서 CSRF를 방지할 것.Step 2
메모리에 access token
을 저장. 즉 access token을 변수에 담는다는 것.
유저가 탭전환, 페이지 새로고침을 하면 access token은 사라진다. 이때 refresh token이 필요하다.
공격자가 javascript로 데이터를 탈취하기 쉽기 때문에 access token
을 localStorage
나 cookie
에 넣어두지 않는 것이다.
Step 3
access token
이 사라지거나 만료되었을 때, Step 1 에서 cookie에 저장한 refresh token을 /refresh-token
endpoint로 보낸다. 그럼 새로운 access token
을 받아서 새로운 api요청에 사용할 수 있다. 이는 JWT token은 4kb보다 더 클 수 있고 이것을 Authorization Header에 포함시킬수도 있다는 것을 의미한다.