1. 토큰(Token)이란?

토큰(Token)은 사용자를 인증하기 위한 디지털 출입증이라고 볼 수 있다.
기존 방식에서는 사용자가 요청할 때마다 아이디와 비밀번호를 확인해야 했다면, 토큰 방식에서는 로그인 후 발급받은 토큰을 이용해 사용자를 인증한다.

즉, 사용자는 한 번 로그인한 뒤 서버로부터 토큰을 발급받고, 이후 API를 요청할 때마다 이 토큰을 함께 보내 인증을 받는다.


2. 토큰(Token) 종류

    • JWT (Json Web Token)
      정의: 사용자 식별 정보(Claim)를 담은 토큰
      구조: Header.Payload.Signature
      * Header: 토큰 생성 방식 설명
      * Payload: 사용자 정보 (id, 권한, 만료시간 등)
      * Signature: 위변조 방지용 서명

      다만 JWT는 암호화된 토큰이 아니다.
      Base64 방식으로 인코딩되어 있기 때문에 누구나 내용을 확인할 수 있다.
      * Base64 방식: 데이터를 사람이 읽기 쉬운 문자 형태로 변환하는 인코딩 방식이다 (암호화 아님)
      따라서 JWT 안에는 비밀번호, 주민번호, 개인정보 같은 민감정보를 절대 넣으면 안 된다.

      *민감정보 넣으면 안 되는 이유 보충설명*
      //Playload 부분 
      {
        "sub":"user123",
        "role":"admin",
        "exp":1710003600
      }
      ​
      => 이건 암호가 아니라 그냥 "보이는 정보" 즉, 누구나 열어볼 수 있음을 의미한다.
      => 비밀번호, 주민번호 넣으면 안 된다.


    • Access Token
      정의: Access Token은 API 요청 시 실제로 사용하는 인증 토큰

      사용자가 로그인에 성공하면 서버는 Access Token을 발급한다.
      이후 사용자는 API를 요청할 때 다음과 같이 Header에 Access Token을 담아 보낸다.
      Authorization: Bearer {Access Token}
      • 특징
        - 유효기간 짧음 (보통 5~30분) => 토큰 탈취 위험 최소화

    • Refresh Token
      정의: Access Token을 다시 발급받기 위해 사용하는 토큰

      Access Token은 보안을 위해 짧게 유지하는 것이 좋지만, 너무 자주 로그인해야 하면 사용자가 불편하다.
      이 문제를 해결하기 위해 Refresh Token을 함께 사용

      흐름
      로그인
      -> Access + Refresh Token 발급
      
      API 요청
      -> Access Token 사용
      
      Access Token 만료 
      -> Refresh Token으로 Access Token 재발급
      
      Refresh Token 만료
      -> 로그인하여 Access + Refresh Token 신규 발급
      • 특징
        - 유효기간 김
        - 보통 HttpOnly 쿠키에 저장
        *HttpOnly 쿠키: 브라우저에는 저장되지만 JS로는 못 꺼내는 안전한 쿠키
        - 서버(DB/Redis)에 저장하는 경우 많음
        *Redis: Redis는 데이터를 메모리에 저장해 매우 빠르게 읽고 쓸 수 있는 인메모리 데이터 저장소

    • OAuth2
      정의: 외부 서비스에 로그인과 권한을 맡기는 방식
      예시: 구글 로그인, 카카오 로그인, 네이버 로그인

      사용자가 우리 서비스에 직접 아이디와 비밀번호를 입력하는 대신, 구글이나 카카오 같은 외부 서비스에서 인증을 진행
      • 특징
        - 장점은 사용자의 비밀번호를 우리 서비스가 직접 관리하지 않아 -> 보안측면 유리

3. 결론 요약

JWT로 사용자 정보를 담고, Access Token으로 API를 요청하고, Refresh Token으로 인증을 이어가며, OAuth2로 외부 로그인을 처리한다.

 

+ Recent posts