본문 바로가기

개발일지/Javascript

[JWT] 클라이언트에서의 관리

JWT (Json Web Token)

What is JWT ?

​ aaaaaa . bbbbbb . cccccc
​ 헤더(header) 내용(payload) 서명(signature)

  • Header
    • typ : 토큰 타입 "JWT"
    • alg : 해싱알고리즘 "HS256" 혹은 "RSA"
  • Payload
    • registered claim
      • iss, sub, exp, jti 등등
    • public claim
    • private claim
    • (claim : 정보를 담는 조각. 단위)
  • Signature
    • hash(encode(Header) + "." +encode(Payload) , secret)

클라이언트에서 jwt를 어떻게 관리할 것 인지 ?

쿠키 or 로컬스토리지

쿠키와 로컬스토리지의 차이는?

  LocalStorage Cookie
장점 CSRF 공격에 안전 XSS 공격으로부터 LS보다 안전
But 완전히 안전 X
단점 XSS 공격에 취약 CSRF 공격에 취약

출처 : https://velog.io/@0307kwon/JWT%EB%8A%94-%EC%96%B4%EB%94%94%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%B4%EC%95%BC%ED%95%A0%EA%B9%8C-localStorage-vs-cookie

What is XSS (Cross Site Scripting) ?

공격자가 의도하는 악의적인 js코드를 피해자 웹 브라우저에서 실행시키는것

What is CSRF (Cross Site Request Forgery) ?

정상적인 request를 가로채 피해자인 척하고 백엔드 서버에 변조된 request를 보내 악의적인 동작을 수행하는 공격 (피해자 정보 수정, 정보 열람)

ex) facebook의 내가 쓰지 않은 광고성 글

공격 과정
  1. 공격자는 피해자가 img를 열람하도록 하거나 link를 클릭하도록 유도
  2. 이 action은 피해자 의도와는 관계없이 HTTP request를 보낸다.
  3. 피해자가 로그인 되어있는 상태라면, 이 request는 정상적으로 서버에 동작 수행

그러면 뭘 써야하나 ?

난 쿠키!

일단 refresh token을 사용하자

  1. refresh tokensecure httpOnly 쿠키로 설정하고
  2. URL 새로 고침 될 때마다 refresh token을 request에 담아 새로운 acess token을 발급받는다.

refresh token을 사용함으로써 CSRF 공격에 대비할 수 있고,
httpOnly쿠키를 사용하여 XSS 공격을 (어느정도)막을 수 있다.

하지만.. refresh tokenaccess token과 다르게 토큰 자체로 검증이 가능한 것이 아니라 DB를 통해야하므로 서버의 과부하 예상..

보안성과 성능/서버안정성의 줄다리기

What is HTTPOnly Cookies ?

HttpOnly 접미사 추가하면 활성화가 되며, 브라우저에서 해당 쿠키로 접근 못한다. (XSS로부터 방어)

// 쿠키 생성시 속성 넣어주면 된다.
Response.Cookies.Add(new HttpCookie("쿠키명")
{
   Value = "쿠키 값",
   HttpOnly = true
});

기본값을 수정하고 싶을 때

// web.config 에서 설정
<httpCookies httpOnlyCookies="true" />

Q. What is Secure Cookies ?

javascrip가 아닌 네트워크를 직접 감청하여 쿠키를 가로챌 수도 있다.
이러한 통신상의 정보유출을 막기 위해, HTTPS 프로토콜을 사용하여 데이터를 암호화하는 방법이 주로 사용됨.

하지만 개발자의 실수로 https가아닌 http로 데이터가 전송되는 경우가 발생할 수 있다.
이러한 사고를 방지하기 위해 secure접미사를 사용한다.

Set-Cookie: 쿠키명=쿠키값; path=/; secure

이렇게하면 HTTPS가 아닌 통신에서는 쿠키를 전송하지 않는다

ASP.NET에서는

// HttpCookie Class
Response.Cookies.Add(new HttpCookie("쿠키명")
{
    Value = "쿠키 값",
    Secure = true
});

기본값을 수정하고 싶을 때

// web.config 에서 설정
<httpCookies requireSSL="true" />

출처:https://nsinc.tistory.com/121