Key : Value 형식의 문자열
- 사용자 브라우저에 저장 (브라우저간 공유 불가)
- 용량 제한 있음 (4KB 이하)
- 사이즈가 커질수록 네트워크 성능 부하
- 서버에 반복 요청시 쿠키 값을 그대로 보내기에 조작 및 유출 위험성 높음
응답 헤더(Set-Cookie)
에 담음Cookie
에 저장된 Cookie
를 담아 보냄Cookie
에 담긴 정보를 통해 클라이언트가 누군지 식별쿠키 인증의 보안적 이슈 보완, 사용자 민감정보를 서버에 저장 및 관리
- 해커가 세션 id를 탈취하여 사용자인척 위장 가능---(서버에서 ip특정으로 해결가능)
- 서버에서 세션저장소를 따로 이용하기에 요청이 많으면 서버 부하가 심해짐
사용자를 인증, 식별하기 위한 정보를 암호화시킨 토큰
- 클라이언트에 인증 토큰을 저장하여 서버 부담을 덜어줌
- Header, Payload, Signature로 구성
- Payload 자체는 암호화 하지 않음 --> 사용자 민감 정보 담을 수 없음
- 토큰 탈취시 대처 어려움 --> 만료기한을 두어 어느정도 해결 가능
- 토큰 자체 데이터가 길어서 인증 요청이 많을 수록 네트워크 부하
Header
와 정보를 합친 후, 서버가 지정한 Secret key로 암호화 시켜 토큰을 변조하기 어렵게 만듬웹 상에서 정보를 Json 형식으로 주고 받고자 표준 규약에 따라 암호화한 토큰
- 클레임 토큰 기반
사용자 인증에 필요한 모든 정보를 토큰 자체에 담고 있어서 별도의 인증 저장소가 필요하지 않음- 일반토큰 : 검증 관련 정보를 서버에 저장 --> DB에 항상 접근 필요 (부담 발생)
공격
- Signature Striping : alg 클레임을 Null로 변조하는 공격
--> 일부 JWT 라이브러리들에서 alg가 None인 토큰을 유효한 토큰으로 인식하는 허점 이용
- 사용자가 입력한 값을 DB에 저장, Front에서 출력하는 구조를 가진 웹 게시판에서
<script>
태그 입력시 공격 성립 --> 일반 쿠키, 세션 스토리지에 저장한 토큰 탈취
대처
Access_token
의 유효기간을 짧게 설정하고,Refresh_token
발급
Access_token
에 비해 긴 만료기한, 노출되면 안되므로 DB에 저장- 원리
- 사용자 인증 요청시
Access_token
이 만료되었을 경우, HTTP 요청 헤더의Refresh_token
과 DB에 저장된Refresh_token
을 비교 후, 토큰이 동일하면 새로운Access_token
을 발급 해줌
- HTTPS 통신에서만 쿠키 전송할 수 있게 하기
- HTTP 헤더 플래그
Secure
: HTTPS에서만 쿠키 전송가능HttpOnly
: 오로지 서버로만 전송(js의 document.cookie로 접근 불가)SemiSite
: 쿠키가 교차 도메인 전송 차단 (CSRF에 대해 보안)