Backend 인증 보안

keepgoing·2023년 4월 16일

코드스테이츠

목록 보기
30/31
post-thumbnail

✅ CORS 설정

  • 다른 origin이 요청과 응답을 할 때 필요한 설정
    (ex) localhost:3000과 localhost:4000

✅ Cookie의 배경

HTTP는 stateless(무상태성)인데 어떻게 우리의 정보가 유지 될까요?
-> 쿠키를 사용해서 가능

Cookie란 ❓

  • 웹 사이트 방문 시, 서버 -> 클라이언트에 전달하는 작은 데이터
  • 서버가 웹 브라우저에 정보를 저장하고 불러올 수 있는 수단
  • 해당 도메인에 대해 쿠키가 존재하면,
    웹 브라우저는 도메인에게 http 요청 시 쿠키를 함께 전달
  • 사용자 테마
  • 30일 동안 보지 않기
  • 로그인 상태 유지

✅ Session

  • 서버가 Client에 유일하고 암호화된 ID를 부여
  • 중요 데이터는 서버에서 관리

쿠키와 세션의 차이

쿠키 : http의 stateless를 보완해주는 도구
세션 : 접속 상태를 서버가 가짐(stateful)
-> 접속 상태와 권한 부여를 위해 세션아이디를 쿠키로 전송

  • 접속 상태 저장 경로

    • 쿠키 : 클라이언트
    • 세션 : 서버
  • 장점

    • 쿠키 : 서버에 부담을 덜어줌
    • 세션 : 신뢰할 수 있는 유저인지 서버에서 추가 확인 가능
  • 단점

    • 쿠키 : 쿠키 자체는 인증이 아님
    • 세션 : 하나의 서버에세만 접속 상태를 가지므로 분산에 불리
    • 세션 : 사용자가 많아 지면 서버에 저장을 하기 때문에
      가용 메모리에 영향을 줌
    • 세션 : 쿠키를 이용하기에 쿠키의 한계를 가짐(탈취를 당하면 세션 아이디 유출)

✅ 토큰 인증 방식

세션 기반 인증 방식의 한계를 극복하기 위해 등장

  • 서버가 유저의 상태를 관리(State)
    • 🥲 하나의 서버가 아닌 다수의 서버 사용 시
      서버 간 세션 데이터 공유가 필요
      -> 서버의 부담을 줄이기 위한 인증 방식 등장(토큰)

토큰

사용자 인증 정보(Authentication)와 권한 정보(Authorization)를 포함한 정보를 담은 암호화된 문자열

  • Authorization
    Authorization 헤더는 인증 토큰(JWT든, Bearer 토큰이든)을 서버로 보낼 때 사용하는 헤더입니다. API 요청같은 것을 할 때 토큰이 없으면 거절당하기 때문에 이 때, Authorization을 사용하면 됩니다.


    Authorization: Bearer XXXXXXXXXXXXX
    보통 Basic이나 Bearer같은 토큰의 종류를 먼저 알리고 그 다음에 실제 토큰 문자를 적어 보냅니다.

👍 토큰 기반 인증 방식의 장점

클라이언트가 유저 인증 정보 저장

  • 무상태성
    -> 서버에서 유저의 상태를 관리하지 않음, 서버는 토큰의 유효성만 검증
  • 확장성
    -> 하나의 토큰으로 다수의 서버에 인증 가능
  • 어디서나 토큰 생성 가능
    -> 토큰 생성만을 담당하는 인증용 서버를 만들 수 있음
    -> 여러 앱을 하나의 토큰으로 인증하는 등 다양한 활용 가능
  • 권한 부여에 용이
    -> 사용자의 인증 정보뿐만 아니라 권한 정보도 담아 암호화 가능

JWT란?

데이터 전송에 사용하는 토큰 기반 인증 기술로 JSON 형식으로 저장한 정보(Payload)를 암호화(서명)하여 전송

JWT의 3가지 구성 요소

  • Header : 토큰의 종류, 서명에 사용된 알고리즘
  • Payload : 전송하려는 내용물
  • Signature : base64로 인코딩한 헤더와 페이로드를 서버의 비밀 키와 암호화한 값

🤔 토큰 기반의 한계점

서버가 인증 상태를 관리하지 않는다.
특정 방식에는 어울리지 않을 수도 있다.
ex) 온라인 강의 서비스 ,OTT(계정공유) 등
-> 동시 접속, 디바이스 강제 로그인이 필요한 경우 비적합

  • 무상태성
    -> 제 3자가 토큰을 탈취하는 경우 서버가 해당 토큰을 강제로 만료시킬 수 없음
    -> 따라서 토큰이 만료될 때까지 사용자로 가장해 계속해서 요청을 보낼 수 있음

  • 유효 기간
    -> 발급된 토큰의 값 수정이나 강제 만료가 불가능하기 때문에 토큰의 유효 기간을 짧게 설정함.
    -> 사용자는 토큰 만료 시 재 로그인을 진행해야하므로 사용자 경험이 떨어짐

  • 토큰의 크기
    -> 페이로드에 담는 데이터가 많아질수록 토큰의 크기도 커짐
    -> 네트워크 전송 시 비용이 커질 우려가 있음

토큰 기반 인증의 한계 극복을 위한 방법

  • 액세스 토큰(Access Token)
    -> 사용자가 서버 리소스에 접근할 수 있도록 접근 권한을 제공하는 토큰
    -> 보안을 위해 만료 주기가 짧게 설정되어 있음

  • 리프레시 토큰(Refresh Token)
    -> 토큰의 짧은 만료 주기로 인해 발생되는 사용자 경험 하락을 막기 위해 고안된 토큰
    -> 기존에 발급 받은 액세스 토큰이 만료 되었을 때 새로운 액세스 토큰을 얻기 위해 사용함


위 방식으로
사용자는 재 로그인 없이 사용 가능


✅ 세션과 토큰의 차이


✅ OAuth란?

인증을 중개해주는 메커니즘

✅ OAuth의 주체

Resource Owner

  • OAuth 인증을 통해 소셜 로그인을 하고싶어하는 사용자를 Resource Owner라고 부릅니다.
  • Resource는 사용자의 이름, 전화번호 등의 정보를 뜻합니다. 이러한 정보의 주인이 바로 사용자이기 때문에 Resource Owner라고 합니다.

Resource Server & Authorization Server

  • 사용자가 소셜 로그인을 하기 위해서 사용하는, 이미 사용중인 서비스(Naver, Kakao, Google 등)의 서버 중 사용자의 정보를 저장하고 있는 서버를 특정해서 Resource Server라고 부릅니다.
  • 이미 사용중인 서비스의 서버 중 인증을 담당하는 서버를 특정해서 Authorization Server라고 부릅니다.

Application

  • 사용자가 소셜 로그인을 활용해 이용하고자하는 새로운 서비스는 환경에 따라서 조금씩 다르게 불립니다. 여기서는 Application이라고 부르도록 하겠습니다.
  • 경우에 따라서 Applicaiton을 Client와 Server로 세분화해서 지칭하기도 합니다.

✅ OAuth 인증 방식의 종류

  1. Implicit Grant Type

  2. Authorization Code Grant Type

  3. Refresh Token Grant Type

✅ OAuth 인증 방식의 장점

  • 쉽고 안전하게 새로운 서비스를 이용할 수 있다.
  • 권한 영역을 설정할 수 있다.
profile
매일매일

0개의 댓글