TIL) 코딩 애플 JWT

이명진·2023년 1월 11일
0

TIL

목록 보기
7/16

코딩애플 유튜브 JWT 내용을 보고 정리한 글입니다.

JWT의 주된 기능

  • 회원 기능 구현

로그인 기록 을 관리하는 방법 두가지

  • 세션 방법 (session) : 간단한 내용만 발급해준다. (Ex)발급번호), 세션 스토어(엑셀처럼 생김)에서 비교를 하고 통과를 시켜준다.
  • 토큰 방법(token ) : 좀더 상세한 정보를 준다 (이름,이메일,발급일,유효기간 등 ) 입장권만 확인하고 통과시켜준다.

입장권 처럼 발급된 내용을 가지고 회원인지 아닌지를 판단하는 점에서 둘은 같다

JWT (토큰)의 장점은 stateless 하다. 회원이 많아질수록 세션은 확인하는 절차가 오래걸리지만 토큰은 입장권만 확인하기 때문이다.

JWT 생김새


// Header 기본세팅 
{
‘Alg’: ‘HS256’,
‘’typ’’: ‘’jwt’’
}

// payload  입장권에 적을 정보 
{
‘Name’: ‘John’,
‘유효기간’:20230101
}


//결과값  값은 해쉬로 반환되어 진다. 

hash(base64UrlEncode(header)+’.’+base64UrlEncode(payload),시크릿키 ))

jwt 허점들

  1. alg : none 공격
    가끔 어떤 서버들은 alg:’none’값으로 보내면서 공격을 한다. 통과되는 사이트들이 있다.
  • 최신 라이브러리를 쓰면 된다.
  1. JWT는 변환이 쉽다.
    민감한 유저 정보들을 넣어두면 안된다.
  2. 시크릿키 문제
    시크릿키를 간단하게 넣어두면 해커들이 때려맞춰서 뚫을수가 있다.
    입장권을 마음대로 발행가능해진다.
  • 어렵게 쓰던가 생성용키/검증용키 2개를 사용해서 해소한다.
  1. JWT 탈취
    JWT 는 정지 같은게 안된다. 도난 당하면 유효기간 동안 활용이 가능하다.
  • 훔치기 어려운 곳에 보관한다 (HttpOnly cokkie)
  • JWT 블랙 리스트를 이용해서 정지 리스트에 넣어둔다. (이러면 JWT 장점이 없어진다. 세션을 쓰는듯 )
  • JWT 유효기간을 짧게 만든다 (5분)

JWT 를 쓰려면 더 확장해서 보안 코드들을 생성해서 활용해야 한다.

댓글에 나온 문제점들

1

개인적으로 개발일 하면서 느낀점을 정리하자면,
[세션의 문제점]
세션을 보관한다는 점에서 문제가 발생하는데,
로드밸런싱을 하거나하면 API서버의 내부 메모리에 저장할 경우 그 서버 이외의 서버에서 알 수 없어 세션저장을 위한 별도서버를 두고 같은 세션스토리지 서버를 바라보게 해야한다는 점.
이용자수가 많은 서비스인 경우 많은 양의 세션을 저장해야 한다는 점.

[jwt의 문제점]
클라이언트에서 저장할 곳이 마땅하지 않았던 점.
쿠키에 저장하자니 httpOnly, Secure 쿠키 옵션을 걸어줘야하는데 여러 API 서버에서 동일한 토큰을 검증할 수 있다고 해도 서브도메인이 아닌이상 서드파티 쿠키가 되고 사용자에게 쿠키 저장 동의를 구해야 한다는 점.
반대로 헤더의 Authorization에 담아 보내자니 클라이언트측 js에서 저장되고 있어야하고 때문에 보안에 취약해지는 점.

결론적으로 저는 jwt를 씁니다. 일단 세션 저장을 위한 별도 서버를 두는 것 자체가 상당히 손이 많이 가는 일이기도 하고 만료기한을 짧게가져가면 해결 가능한 부분이라 보았습니다. 물론 jwt도 마이크로서비스가 많아지면 결국 인증을 위한 서버가 따로 필요하게 되지만 세션을 저장하는 것보다는 복잡도가 떨어진다고 보았습니다.

2.

  1. access token은 JS private instance 에 보관.
  2. refresh token은 http only, same site strict 로 설정된 cookie 에 보관.
    Jwt 라도 위 2 가지만 되면, xss, csrf 공격에 대해 보안이 가능해집니다. 여기서 cookie secure 를 true 로 설정하면 스니핑 공격까지 막을 수 있습니다. 다만, 구현 난이도가 상당합니다.

마무리

JWT 를 조금 알고 있었는데 세부적으로 중요한것만 딱 알수 있는 시간이었다.
댓글들로 경험자들이 글을 써줘서 더 좋았다.

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글