jwt 사용시 추가 보안

# JWT(Json Web Token) 을 잠깐 알아보면,
# . 구분자로 header.payload.signature 로 구분되고
# payload 에 필요한 정보를 담아 클라<->서버간 주고 받게 된다.
# jwt 토큰 예시
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwaG9uZSI6IjEyMzQ1Njc4OTAiLCJuYW1lIjoieXNvZnRtYW4ifQ.IBNMyC-NPJXL0pk9w7Dmq5HZz5o-3OUquGUBlXyWCvk

# 위 jwt 토큰은 다음과 같이 누구나 복호화 (https://jwt.io/)할 수 있다.
# 복화된 내용을 수정하면 바로 암호화된 jwt 도 생성할 수 있다.
# header: algorithm & token type
{
  "alg": "HS256",
  "typ": "JWT"
}

# payload:data
{
  "phone": "1234567890",
  "name": "ysoftman"
}

# verify signature
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  your-256-bit-secret
) secret base64 encoded

# 보통 위와 같이 JWT 토큰에 사용자 식별정보(id)를 서버에 전송하면
# 서버에서는 해당 id 에 대한 권한을 주는 흐름이다.

# 기본으로 보안되는 것
# 서버는 jwt 를 생성시 미리 정한 sigkey(secret) 을 넣어 서버에서만 사용되는 jwt 를 만들 수 있다. 때문에 클라가 payload 등의 내용을 임의로 변경해서 새로운 jwt 만들어 서버에 전송해도 서버에선 유효하지 않은 jwt 로 무시하게 된다. 즉 서버가 발행하지 않는 변조된 jwt 는 서버에 사용할 수 없다.

# 추가 보안으로 고려해야 하는 것
# 1. 해커가 jwt 토큰을 갈취해서 요청 할 수 있다.
# -> 서버에서 쿠키 생성시
# secure;(쿠키가 전송되지만 https 에서만 쿠키가 설정된다.)
# httponly;(javascript 등의 브라우저가 아닌 곳에서 접근할 수 없다.)
# 옵션을 설정할 필요가 있다.
# 참고 https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies -> Restrict access to cookies

# 2. jwt 토큰 갈취 위험 빈도를 낮추기 위해
# access token(실제 인증을 위한 짧긴 1시간 정도의 만료 기간을 가진 토큰),
# refresh token(access token 이 만료 됐을때 새 access token 발급을 위한 긴 2주 정도의 만료 기간을 가진 토큰) 2개를 이용한다.
# 로그인시 2개의 토큰을 생성하고 서버는 사용자의 refresh token 을
# db 에 저장해 두고 클라에게 응답하면 클라는 refresh token 은 저장해두고
# access token 만 사용하다가 서버로 부터 access token 이 만료됐다고 했을때
# access token + refresh token 을 요청해서
# access token + refresh token 을 갱신받는다.
# 이 방식은 매 요청에 사용되는 access token 이 갈취 당해도 비교적 짧은 시간만 유효함으로 보다 안전하고 한다.

# 3. payload 내용에 사용자id 등의 개인 정보가 노출될 수 있다.
# -> jwt payload 도 aes256 같은 대칭키로 암호화한다.

comments:

댓글 쓰기