Hah-nna / Tech_Interview

0 stars 0 forks source link

[network]토큰기반 인증 #26

Open young-02 opened 11 months ago

young-02 commented 11 months ago

인증과 인가

시스템의 자원을 적절하고 유효한 사용자에게 전달하고 공개하는 방법

인증(Authentication)

로그인, 클라이언트가 자기자신아라고 주장하고 있는 사용자가 맞는지를 검증하는 과정이다. 클라이언트가 패스워드를 입력해 제출하면 서버는 유저가 맞는지 확인한다.

인가(Authorization)

인증 작업 이후에 행해지는 작업, 인증된 사용자에 대한 자원에 대한 접근 확인 절차 유저1이 쓴글에 유저2 가 수정 삭제 하지 못하는데이는 인가가 되어 있지 않기 때문이다.


HTTP는 비상태성이라는 특성을 가지고 있어 서버는 클라이언트의 상태를 저장하지 않으며 인증과정을 거쳤는지 알 방법이 없다.

이러한 HTTP 환경에서 서버는 세션 또는 토큰을 사용하여 사용자를 인가한다.


세션기반 인증

사용자의 인증정보가 서버의 세션 저장소에 저장되는 방식

  1. 로그인 -> 인증정보 서버의 세션 저장소 저장
  2. Session ID 발급 -> 브라우저 쿠키 형태 저장 -> 실제 인증 정보는 서버에 저장
  3. 요청마다 HTTP Cookie 헤더에 Session ID를 함께 서버로 전송
  4. Session ID 해당 하는 세션 정보가 세션 저장소에 존재한다면 해당 사용자를 인증된 사용자로 판단 하여 인가를 수행 해 준다.

장점

이러한 단점들로인해 토큰 방식이 생겨남

토큰 기반 인증 방식

인증 정보를 클라리언트가 직접 들고 있는 방식.

  1. 유저가 로그인 요청 -> id, pw 정보유효 -> 서버에서 Secret Key를 사용하여 유저에게 토큰 발급
  2. 클라이언트 토큰 저장 -> 서버에 요청을 할 때마다 해당 토큰을 함께 서버에 전달
  3. 서버는 토큰 검증 -> 요청 응답

토큰 구조

인코딩 암호화된 3가지 데이터를 이어 붙인것

  1. header : 토큰을 어떻게 검증하는가에 대한 내용
  2. playload: 토큰에 담긴 사용자 정보 등의 데이터가 저장 되어있다.
    • 누가 누구에게 발급?
    • 유효기간
    • 사용자에게 이 토튼을 통해 공개하기 원하는 내용 (사용자의 닉네임, 서비스 상의 레벨, 관리자 여부) => 사용자가 받아서 갖고 있는 토큰 자체에 이러한 정보들이 있으므로 서버가 요청마다 데이터베이스에서 찾아야 할 것들이 줄어듬
  3. signature: 부호화 시킨 header와 playload를 가지고 발급해준 서버가 지정한 scret key로 암호화 시켜 토큰 변조하기 어렵게 한다.

장점

쿠키에 JWT 저장 시 취약점

해결책