본문 바로가기
코딩/React

인증/인가(쿠키, 세션, 토큰, JWT)

by junhub 2023. 5. 1.

# 인증&인가

 

(1) 인증(Authentication) vs. 인가(Authorization)

  • 인증(Authentication)이란 서비스를 이용하려는 유저가 등록된 회원인지 확인하는 절차이다.
  • 인가(Authorization)이란 특정 리소스에 접근할 수 있는 권한이 있는지 확인하는 절차이다.
  • Quiz: 유저가 마이페이지에서 서버에 API 요청으로 개인정보를 받아오는 요청을 할 때, 서버는 클라이언트에게 인증을 해줄까? 아니면 인가를 해줄까? (A. 인가)

 

 

(2) http 프로토콜 통신의 특징 2가지

 

1. 무상태 (Stateless) : 서버는 클라이언트의 상태를 기억하지 않는다. 따라서 각 요청마다 서버에서 요구하는 모든 상태 정보를 담아서 요청해야 한다. 

출처: https://hanamon.kr/네트워크-http-http란-특징-무상태-비연결성/

  • 상태값은 매 요청마다 클라이언트가 가지고 오기 때문에, 서버는 클라이언트의 상태를 별도로 기억할 필요없이 주문받은 대로 응답해준다.
  • 무상태라는 특성 덕분에 동일한 서버를 여러개로 확장시킬 수 있다. (Scale-Out)

 

 

2. 비연결성 (Connectionless) : 서버와 클라이언트는 연결되어 있지 않다. 서버 입장에서는 매번 새로운 요청이다.

출처: https://hanamon.kr/네트워크-http-http란-특징-무상태-비연결성/

  • 비연결성으로 인해 최소한의 서버 자원으로 서버를 유지할 수 있게 해준다.
  • 그러나, 각 사용자별 요청이 잦은 서비스의 경우 이러한 비연결성은 오히려 비효율적일 수 있다. 

 

 

 

# 쿠키, 세션, 토큰

 

(1) 쿠키 (cookie) 란?

 

  • 무상태와 비연결성이라는 http 통신의 특징에도 불구하고 마치 서버가 클라이언트의 인증 상태를 기억하는 것처럼 구현할 수 있는 수단으로 사용할 수 있다.
  • 쿠키란 브라우저에 저장되는 텍스트 파일이며, key-value 형태로 저장된다.
  • 쿠키는 별도로 삭제처리하거나 유효기간이 만료되지 않는 이상 서버와 통신할 때 자동으로 주고 받게 된다.
  • 서버에 특정 API 요청을 했을 때 서버가 응답 시 header 안에 set-cookie 속성으로 쿠키 정보를 담아주면 응답을 받은 브라우저는 쿠키를 브라우저에 자동으로 저장한다. (저장된 쿠키정보는 개발자도구 → 애플리케이션 → 저장용량 → 쿠키 에서 확인 가능)
  • 서버에 http 요청 할 때 마다 브라우저에 저장되어 있는 쿠키는 자동으로 서버에 보내진다. (단, 동일한 Origin 또는 CORS를 허용하는 Origin에만 쿠키를 보낸다. ex- 유튜브 서버에서 받은 쿠키는 유튜브 이용 시에만 주고 받을 수 있다.)

 

 - Origin 이란?

출처(origin) 이란 protocol + host + port 를 의미한다. 

 

 

- CORS 란?

  • Cross Origin Resource Sharing(CORS)는 다른 출처에 리소스 요청하는 것을 허용하는 정책이다.
  • 브라우저는 보안상의 이유로 기본적으로 Same Origin Policy(SOP)를 원칙으로 하고 있지만, 서버와 클라이언트 각각 CORS 설정을 통해 상호합의된 웹사이트는 예외적으로 서로 다른 출처(Cross-Origin)임에도 API 요청이 가능하다.
  • 쿠키는 클라이언트에서 직접 추가/수정/삭제 할 수 있다.

 

 

(2) 세션 (session) 이란?

  • 세션이란 사용자와 서버 간의 연결이 활성화된 상태를 의미하는 개념이다. (또는 인증이 유지되고 있는 상태)
  • 로그인 성공 → 서버에서 세션 생성 및 저장(key-value 형식) → key(sessionId)를 브라우저에 응답(by 쿠키)

 

 

(3) 쿠키-세션 인증 방식

  • 로그인/회원가입 시 세션 인증

  • 로그인/회원가입 성공 시 서버에서 쿠키에 sessionId를 담아서 보내준다.
  • 세션 유지 상태 : 서버에서 관리하는 세션 저장소에 회원 데이터가 있다.
  • 세션 만료 상태 : 서버에서 관리하는 세션 저장소에 회원 데이터가 없다.
  • 인가(Authorization) 필요한 API 요청/응답

  • 서버는 인가가 필요한 API 요청을 받으면 클라이언트 쿠키에 들어 있는 sessionId를 세션 저장소에 조회하여 있으면 DB에 데이터를 조회하여 응답합니다.

 

 

 

(4) 토큰 (token) 이란?

출처: https://swoopnow.com/token-based-authentication/token-based-authentication-2/

  • 클라이언트에서 보관하는 암호화된 인증 정보를 의미한다.
  • 세션처럼 서버에서 사용자의 인증 정보를 보관할 필요가 없기 때문에 서버 부담을 줄여주는 인증 수단이라 할 수 있다.
  • 웹에서 인증 수단으로 사용되는 토큰은 주로 JWT (Json Web Token) 을 이용한다.

 

# JWT의 특징

  1. header.payload.signature 형식으로 3가지 데이터로 구성되어 있다.
  2. 국제 인터넷 표준 인증 규격 중 하나이다.
  3. 암호화된 토큰을 누구나 복호화하여 payload를 볼 수 있다. → 토큰의 용도는 인증정보(payload)에 대한 보호가 아니라 위조 방지
  4. 정보(payload)를 토큰화할 때 signature에 secret key가 필요하고, secret key는 복호화가 아니라 토큰이 유효한 지를 검증하는 데 사용된다.

 

 

 

# JWT 토큰 인증 방식

 

(1) JWT 토큰 인증 방식

  • 로그인/회원가입 시 토큰 인증

 

  • 인가(Authorization) 필요한 API 요청/응답

 

 

  • Refresh Token 으로 보안 강화

Access Token의 만료기간을 길게 잡고 인증상태를 오래 가져갈 경우 서버 부담은 줄어드나 보안성(탈취 당할 경우)에 허점이 있다.

 

이 경우 서버에서는 Access Token이 만료되었을 때 Refresh Token 이 유효한 상태면 새로운 Access Token을 클라이언트에 발급해주고 인증상태를 유지할 수 있도록 하고, Refresh Token 만료 시 다시 로그인하라는 메시지를 응답한다. 

 

인증 보안이 중요한 서비스의 경우 인증 시 2개의 토큰 (Access Token, Refresh Token)을 발급하고 Access Token의 기간은 30분 정도로 짧게 가져 가고, Refresh Token은 1~2주 정도로 길게 잡는 경우가 많다.

 

리소스 접근 인가를 받기 위해 사용되는 토큰을 Access Token 이라고 부른다. 

 

 

 

 

(2) 세션 인증 vs. 토큰 인증

 

 

# 참고자료

https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies

 

Using HTTP cookies - HTTP | MDN

An HTTP cookie (web cookie, browser cookie) is a small piece of data that a server sends to a user's web browser. The browser may store the cookie and send it back to the same server with later requests. Typically, an HTTP cookie is used to tell if two req

developer.mozilla.org

 

https://jwt.io/

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

 

https://axios-http.com/kr/docs/req_config

 

요청 Config | Axios Docs

요청 Config 다음은 요청을 만드는 데 사용할 수 있는 config 옵션들 입니다. 오직 url만 필수입니다. method를 지정하지 않으면 GET방식이 기본값 입니다. { url: '/user', method: 'get', baseURL: 'https://some-domain.

axios-http.com

 

'코딩 > React' 카테고리의 다른 글

axios request, response  (0) 2023.05.08
throttling & debouncing  (0) 2023.05.01
React Query  (0) 2023.04.29
Custom Hooks  (0) 2023.04.29
Thunk 2  (0) 2023.04.29

댓글