컴퓨터 사이언스/보안

[Access Token과 Refresh Token] 개발자를 위한 인증 토큰 설명서

Dachaes 2025. 4. 14. 00:15
728x90
반응형
728x90

Access Token과 Refresh Token 

JWT 기반 인증 시스템에서 가장 많이 나오는 개념 중 하나가 바로 Access TokenRefresh Token입니다. 이 두 토큰은 모두 인가(Authorization)와 관련이 있지만 역할과 사용 목적이 분명히 다릅니다.

이 글에서는 Access Token과 Refresh Token의 차이, 각각의 동작 방식, 사용 예제와 함께 보안적으로 어떻게 구성해야 하는지까지 자세히 설명합니다.

 


1.  Access Token이란?

Access Token은 사용자가 인증된 상태임을 증명하는 토큰으로, 실제 API 요청 시 서버에 전달되는 인증 정보입니다.

특징

  • 보통 JWT 형식으로, 사용자 ID, 권한, 만료 시간 등의 정보 포함
  • 유효 시간이 짧아 탈취되더라도 피해 최소화 가능
  • 서버는 토큰의 서명을 검증하여 신뢰 여부 판단

예시

GET /profile HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR...

 


2.  Refresh Token이란?

Refresh TokenAccess Token이 만료되었을 때 새로운 Access Token을 발급받기 위해 사용되는 토큰입니다.

특징

  • 서버는 Refresh Token을 통해 사용자가 여전히 인증된 상태임을 확인하고, 새로운 Access Token을 발급
  • 보통 유효 기간이 길고, 보안을 위해 서버 측 저장 또는 HttpOnly 쿠키 사용
  • 탈취되면 Access Token을 무한 재발급할 수 있으므로, 훨씬 더 위험함

 


3.  기본 개념 요약

항목 Access Token Refresh Token
목적 리소스 접근 권한 부여 Access Token 재발급 용도
만료 시간 짧음 (분 단위) 김 (일/주 단위)
저장 위치 메모리, 쿠키, localStorage 등 보안 고려해 서버 or HttpOnly 쿠키
노출 시 위험도 중간 매우 높음
서버 저장 필요 여부 필요 없음 (Stateless) 필요할 수 있음 (Blacklist 등)

 


4.  인증 흐름 예시 (JWT 기반)

[1] 로그인
→ 서버가 Access Token + Refresh Token 발급

[2] API 요청
→ Access Token을 Authorization 헤더에 담아 전송

[3] Access Token 만료
→ 클라이언트는 Refresh Token으로 재발급 요청

[4] 서버가 Refresh Token 검증 후 새 Access Token 발급

[5] 사용자 로그아웃 or 보안 위협 발생
→ Refresh Token 폐기 (서버 DB에서 삭제)

 


5.  코드 예제 (Express + JWT)

로그인 시 토큰 발급

const accessToken = jwt.sign({ userId: 1 }, 'access-secret', { expiresIn: '15m' });
const refreshToken = jwt.sign({ userId: 1 }, 'refresh-secret', { expiresIn: '7d' });

// Access는 응답 본문에, Refresh는 HttpOnly 쿠키로 전송
res.cookie('refreshToken', refreshToken, { httpOnly: true });
res.json({ accessToken });

큰 재발급 라우터

app.post('/refresh', (req, res) => {
  const refreshToken = req.cookies.refreshToken;

  try {
    const decoded = jwt.verify(refreshToken, 'refresh-secret');
    const newAccessToken = jwt.sign({ userId: decoded.userId }, 'access-secret', { expiresIn: '15m' });
    res.json({ accessToken: newAccessToken });
  } catch (err) {
    res.status(401).send('Invalid refresh token');
  }
});

 


 

6.  보안 고려사항

  • Refresh Token 탈취 = 계정 탈취
    → 반드시 HttpOnly + Secure 쿠키로 저장하고, 필요 시 서버에서 관리합니다.
  • 로그아웃 시 Refresh Token 무효화 필요
    → 서버 DB에 저장하여 관리하거나, 토큰 블랙리스트 구현합니다.
  • Access Token은 최대한 짧게
    → 보통 15분 이하로 설정합니다.
  • HTTPS 필수
    → 모든 토큰은 암호화된 채널(HTTPS)로만 전송해야 합니다.

 


7.  Refresh Token을 꼭 써야 할까?

SPA나 모바일 앱에서는 Access Token만 사용하는 방식도 가능하지만, Access Token이 짧은 시간에 만료되면 로그인을 자주 해야 하는 불편이 생깁니다. 그래서 대부분의 현대 애플리케이션은 다음과 같은 전략을 씁니다

  • 짧은 Access Token + 긴 Refresh Token 조합
  • 사용자 경험과 보안성을 동시에 만족

 


8.  마무리

함께 보면 좋은 자료

블로그 글 :

 

[OAuth] 로그인 없이 로그인하기

OAuth (Open Authorization) 현대 웹서비스에서 흔히 볼 수 있는 Google로 로그인, Kakao로 시작하기 같은 기능은 어떻게 작동할까요? 바로 이럴 때 사용하는 기술이 OAuth(Open Authorization)입니다. 이 글에서는

dachaes-devlogs.tistory.com

 

[JWT] 인증 시스템의 핵심

JWT (JSON Web Token) 웹 애플리케이션에서 로그인 후 사용자 인증 상태를 어떻게 유지할까요? 세션? 쿠키? 이 외에도 현대적인 방식으로 널리 사용되는 것이 바로 JWT(JSON Web Token)입니다.이 글에서는 J

dachaes-devlogs.tistory.com

 


반응형
728x90
반응형