📌 1. Authentication vs Authorization

  1. Authentication = 인증
    • 웹사이트에서 로그인 하는 것
  2. Authorization = 권한 부여
    • 한 번 로그인 한 이후에 로그인 상태가 유지되게 하는 것
  • 권한 부여를 통해 로그인 상태의 사용자만 사용할 수 있는 기능을 사용할 수 있게 함
  • 요청마다 로그인할 수 없으니 로그인을 유지시키는 기술 필요
  • 이때 사용되는 것이 세션 혹은 JWT

❓ 2. JWT란?

  • JSON Web Token
  • JSON 포맷을 이용해 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token
  • Token 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달
  • 회원 인증이나 정보 전달에 사용

✔ 3. JWT 구조

  • Header, Payload, Signature 3부분으로 이루어짐
  • JSON 형태인 각 부분은 Base64Url로 인코딩되어 표현
  • 각각의 부분을 이어주기 위해 .구분자를 사용

1. Header

-typ과 alg 두 가지 정보로 구성

  • alg: Signature를 해싱하기 위한 알고리즘
{
	"alg" : "HS256"
	, "typ" : JWT
}

2. Payload(페이로드)

  • 토큰에서 사용할 정보의 조각인 claim이 담김
  • claim은 Json 형태로 다수의 정보를 넣을 수 있음
  • 클레임의 종류
  • 토큰의 목적에 따라 클레임이 달라짐
  • registered claim에는 토큰 만료시간, 토큰 발급 날짜 등을 작성할 수 있음

3. Signature (서명)

  • 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드
  • 헤더와 페이로드의 값을 BASE64Url로 인코딩

✔ 4. 동작 방식

  • 사이트에 로그인 해 성공적으로 Authentication이 이루어짐
  • 서버는 확인서(JWT)를 제공
  • 클라이언트는 뭔가를 요청할 때 JWT를 서버에게 같이 보여주며 권한을 확인 받음
  • 서버는 JWT만 확인해 Authorization하기 때문에 세션 DB에 저장할 필요가 없음

✔ 5. 저장 위치

  • 브라우저 저장소에 저장하는 방법과 쿠키에 저장하는 방법이 있음
  • 로컬 스토리지와 세션 스토리지와 같은 브라우저 저장소에 JWT를 저장
  • 스크립트 공격(XSS)에 취약해짐
  • 쿠키에 저장할 때 http-only를 사용하면 HTTPS로만 쿠키가 전달되어 보안 강화 가능
    - http-only로 쿠키에 추가하는 방법
  • CSRF문제는 CSURF와 같은 라이브러리를 사용해 해결

✔ 6. access token & refresh token

  • JWT는 토큰 자체에 정보를 담고 있어 보안이 매우 취약
  • 토큰을 탈취 당하면 권한과 정보를 모두 빼앗김
  • 토큰에 유효기간을 주어 보안을 강화시킨 것

1. access token

  • 유효기간을 짧게
  • 일반적으로 30분
  • access token을 통해서만 자원에 접근 가능
  • 유효기간이 매우 짧아서 탈취 당해도 이미 쓸 수 없는 상태

2. refresh token

  • 유효기간을 길게
  • 일반적으로 2주
  • 상대적으로 유효기간이 길어서 탈취당할 수도 있지만 오직 access token을 재발급하는 용도로 사용하기 때문에 이 자체만으로는 쓸모가 없음

3. jwt 인증 과정

  • 1~4
    - 사용자가 로그인을 하면 서버로부터 access token, refresh token 2개의 토큰을 받음

    • 이때 서버는 refresh token을 안전한 저장소에 저장
  • 5~7
    - 서버로부터 받은 access token의 유효 기간이 지나지 않은 경우 사용자가 어떤 요청을 보낼 때 access token을 함께 보내고 서버는 유효한 지 확인 후 응답을 보냄

  • 8~13
    - 서버로부터 받은 access token의 유효 기간이 지난 경우 사용자는 refresh token과 함께 요청을 보냄

    • 저장소에 저장되어 있던 refresh token과 비교한 후에 유효하다면 새로운 access token과 응답을 함께 보냄

4. jwt 인증 과정 흐름도


참고

profile
Data가 좋은 Web 개발자

0개의 댓글

Powered by GraphCDN, the GraphQL CDN