Hashing / Token

걸음걸음·2023년 3월 9일
0

인증&보안

목록 보기
2/3

해싱(Hashing)

암호화 방식 중 하나
다른 암호화 방식들과 달리 암호화만 가능
해시함수(Hash) 사용해 암호화 진행

  • 항상 같은 길이의 문자열 반환
  • 서로 다른 문자열에 동일한 해시 함수 사용 -> 반드시 다른 결과값
  • 동일한 문자열에 동일한 해시 함수 -> 항상 같은 결과값

레인보우 테이블과 솔트(salt)

해싱은 항상 같은 결과값이 나오기 때문에 해싱 이전의 값을 알아낼 수 있는 레인보우 테이블이 존재 -> 솔트 사용. 해시 이전의 값에 임의의 값을 추가하여 이전의 값을 알아내기 어렵도록 하는 방식

목적

동일한 값의 데이터를 사용하고 있는지 여부 확인
(데이터 그 자체를 사용하는 것이 목적이 아님)

토큰

인증과 권한 정보를 담고 있는 암호화된 문자열
사용자의 인증 정보를 서버가 아닌 클라이언트 측에 저장
기존 세션 기반 인증이 가지고 있던 한계(서버의 부담이 큼) 극복, 서버의 부하나 메모리 부족 문제를 줄일 수 있음

흐름

토큰 방식의 흐름
클라이언트
POST /login
인증 정보(아이디와 패스워드)
사용 로그인 요청

서버
데이터베이스에 저장된 사용자 인증 정보 확인
유효하다면 해당 유저에 대한 토큰 생성
클라이언트에 토큰 전달
(Auhorization 헤더 사용&쿠키 전달)

클라이언트
클라이언트에 토큰 저장
(저장 위치 : LocalStorage, Session Stroage, Cookie 등)
GET /someinfo
요청과 함께 토큰 전달(Authorization 헤더&쿠키 사용)

서버
유효한 토큰인지 검증
유효하다면 클라이언트의 요청에 대한 응답 데이터 전송

장점

  • 무상태성
    서버가 유저의 인증 상태를 관리하지 않음(서버는 비밀키를 통해 토큰의 유효성만 검증)
  • 확장성
    다수의 서버가 공통된 세션 데이터를 가질 필요가 없음
    서버 확장 용의
  • 어디서나 토큰 생성 가능
    토큰의 생성과 검증이 하나의 서버에서 이루어지지 않아도 됨(토큰 생성 담당 서버 구축 가능)
    여러 서비스 간의 공통된 인증 서버 구현 가능
  • 권한 부여에 용이
    토큰은 인증 상태, 접근 권한 등 다양한 정보를 담을 수 있어 사용자 권한 부여에 용이
    어드민 권한 부여 및 정보 접근 범위 설정 가능

JWT

JSON Web Token
토큰 기반 인증 구현시 대표적으로 사용하는 기술
JSON 객체에 정보를 담고 이를 토큰으로 암호화하여 전송

구성

aaaa.bbbb.cccc 처럼 . 으로 나누어진 세 부분 존재

  • aaaa.bbbb.cccc
    aaaa : Header
    bbbb : Payload
    cccc : Signature

토큰 자체를 설명하는 데이터 포함
토큰의 종유, 시그너치를 만들 때 사용한 알고리즘을 JSON 형태로 작성

{
  "alg":"HS256",
  "typ":"JWT"
}
  • base64는 비밀번호처럼 노출되면 안 되는 민감한 정보는 담으면 안됨(디코딩 되기 쉬움)

Payload

전달하려는 내용을 담고 있는 부분
어떤 정보에 접근 가능한지에 대한 권한, 유저의 이름 등 개인정보, 토큰의 발급 시간 및 만료 시간 등의 정보가 담겨 있음

{
  "sub": "someInformation",
  "name": "phillip",
  "iat": 151623391
}

Signature

토큰의 무결성을 확인할 수 있는 부분
서버의 비밀키와 Header에서 지정한 알고리즘을 사용하여 해싱

한계

토큰 자체가 탈취되었을 경우 토큰 인증 방식의 한계가 드러남

  • 무상태성
    인증 상태 관리 주체가 서버가 아니어서 토큰이 탈취되어도 강제로 만료시킬 수 없음

  • 유효 기간
    유효 기간을 짧게 설정하면 사용자 경험이 낮아지고, 유효 기간을 길게 설정하면 탈취될 경우 치명적일 수 있음

  • 토큰의 크기
    토큰에 많은 데이터가 담길 경우 암호화 과정이 길어지고 크기가 커져서 네트워크 비용 문제가 발생할 수 있음

액세스 토큰과 리프레시 토큰

Access Token

서버에 접근하기 위한 토큰
보안을 위해 보통 24시간 정도의 짧은 유효기간이 설정되어 있음

Refresh Token

액세스 토큰이 만료되었을 때 새로운 액세스 토큰을 발급받기 위해 사용되는 토큰
(애겟스 토큰보다 긴 유효기간을 가짐)

보안과 사용자 경허 사이의 적절한 균형이 중요함

profile
꾸준히 나아가는 개발자입니다.

0개의 댓글