JWT란 무엇인가? 그리고 어떻게 사용하는가? (3) - 보안

Eon Kim·2021년 10월 9일
4

JWT

목록 보기
3/4
post-thumbnail
post-custom-banner

안녕하세요, 주니어 개발자 Eon입니다.

이번 포스트에서는 JWT를 활용한 환경에서의 보안에 대해 다루겠습니다.

보안은 신중에 신중을 기해야 하는 부분입니다.
너무 과하면 서비스에 부담을 주기도 하고, 너무 약하면 쉽게 뚫릴 수가 있습니다.

⬇ JWT가 어떤 식으로 사용되는지는 저번 포스트에서 다뤘습니다. ⬇
JWT란 무엇인가? 그리고 어떻게 사용하는가? - 사용처(2)

JWT는 헤더.내용.서명 으로 구성돼 있습니다.
이 중에 서명을 제외한 부분은 누구나 들여다 볼 수 있습니다.
그리고 JWT 말고도 다른 보안이 함락됐을 때, 토큰마저 탈취되면 로그인 없이도 http request uri만 안다면 서버에 직접 요청도 가능합니다.
이러한 공격이나 위협의 빈도나 가능성을 줄이기 위해서는 다른 보안 기술도 함께 사용하는 것이 좋습니다.
간단하지만 Basic Auth를 함께 사용하거나 X-Real-IP를 검증하는 등 여러 관문을 두는 방식으로도 할 수 있습니다.
하지만 보안에 완벽함은 없습니다.
그것이 해킹같은 사건이 여전히 발생하고 있는 이유입니다.

JWT를 전달하는 방식은 여러 방식이 있을 수 있으나, 우리는 Cookie를 활용하는 방식을 채택해서 보도록 하겠습니다.

Cookie에 JWT를 포함한다.
Cookie옵션을 세팅을 하지 않고 사용하면 굉장히 위험합니다.
Cookie는 기본적으로 브라우저에 저장되고 자동으로 제거되지 않습니다.

  • 그렇다면 내가 서비스에 접근하기 위해 JWT 토큰을 쿠키로 발급을 받은 상태로 다른 애플리케이션이나 사이트의 쿠키 탈취 공격을 받으면 바로 해킹을 당할 수 있는가?
    • 그렇습니다.
      하지만 이를 방지하기 위한 방법은 있습니다.

바로, expiry를 설정하는 방법, 다른 도메인에서 접근 불가하게 만드는 방법과 자바스크립트로 쿠키 값에 접근하는 것을 막는 방법이 있습니다.

JWT expiry : JWT 만료 설정

토큰에 expiry를 설정해서 토큰의 유효 기간을 지정하는 방법입니다.
이는 이전 포스트에서 다룬 내용입니다.
토큰의 유효 기간을 지정하여 발급을 함으로써 만료된 이후에는 브라우저 쿠키에서 제거됩니다.
또한 서버에 인증을 요청했을 때, 인증 불가 응답을 받게 됩니다.

CORS (Cross-Origin Resource Sharing) : 교차 출처 리소스 공유

첫 번째로 도메인을 제한하는 방법입니다.
우리 서비스의 도메인을 domainofeon.com이라고 가정합니다.
그리고 우리는 domainofeon.com에서만 CORS 허용을 하려고 합니다.

우리는 아래와 같이 http request / response header에서 허용할 도메인을 설정할 수 있습니다.
Access-Control-Allow-Origin: *
이는 모든 도메인에서 허용하겠다는 의미로, 다른 도메인에서도 우리 서비스의 쿠키를 활용할 수 있음을 의미합니다.

우리는 우리의 서비스 도메인만을 허용할 것입니다.
Header("Access-Control-Allow-Origin", "domainofeon.com")
위와 같이 서버의 http request / response header를 설정할 수 있습니다.

이제 다른 도메인에서 우리 서비스의 쿠키를 볼 수 없습니다.

HTTP Only

두 번째 방법은 Cross-site 스크립팅 공격을 방지하는 것입니다.
HttpOnly쿠키는 JavaScript의 Document.cookie API에 접근할 수 없습니다.

If JWT stolen : JWT 탈취 시

쿠키에 접근을 제한할 수 있지만 사용자의 실수나 부주의, 또는 어떠한 다른 공격으로 인해 JWT가 탈취될 수 있습니다.

JWT는 인증이며, 내가 '그' 사용자라는 증명이기도 합니다.
JWT가 탈취되면 나의 회원 정보는 모두 유출이 되거나 변경될 수 있습니다.
따라서 JWT가 유출되지 않게 주의해야 합니다.

이번 포스트는 전문적이지 않습니다.
보안 전문가는 아니기 때문에 내용에 미흡한 점이 있을 수 있고, 더 좋은 방법이 있을 수 있습니다.
그럼에도 보안을 다룬 이유는, JWT를 사용함에 있어서 이러한 설정조차 하지 않고 사용한다면 사용하지 않는 것보다 못한 결과와 사고를 초래할 수 있기 때문입니다.

다음에 다룰 내용은 JWT를 활용한 인증 서버 구현입니다. 👍
JWT를 다루는 마지막 포스트가 될 예정입니다.
구현 예정 언어는 golang이며, iris 프레임워크를 사용할 예정입니다.
프레임워크는 변경될 소지가 있습니다.

profile
주니어 개발자
post-custom-banner

0개의 댓글