Unit7 회고

YEN J·2022년 11월 14일
0

code states

목록 보기
33/43

[Backend]인증/보안

🔆 Cookie/Session

Cookie서버가 클라이언트에게 전달하는 작은 데이터로 쿠키를 이용해 서버가 클라이언트에 영속성 있는 데이터를 저장하고 원한다면 클라이언트의 쿠키를 이용하여 데이터를 가져올 수 있다. 즉, 쿠키를 이용한다는 것은 서버가 클라이언트에게 쿠키를 전송하는 것 뿐만 아니라 클라이언트가 서버로 쿠키를 다시 전송하는 것도 포함된다.

  • 서버 → 클라이언트로 쿠키 전송 시
    : 헤더에 Set-Cookie라는 프로퍼티를 사용해 쿠키를 담아 전송
  • 클라이언트 → 서버로 쿠키 전송 시
    : 헤더에 Cookie라는 프로퍼티를 사용해 쿠키를 담아 전송
  • 쿠키 옵션
    : 서버가 데이터 저장 후 데이터를 다시 가져올 수 있는 특정 조건
    1. Domain: 서버에 접속할 수 있는 이름
      • 쿠키의 Domain 옵션과 서버의 도메인이 일치하는 경우 쿠키 전송
    2. Path: 서버가 라우팅 시 사용하는 경로
      • 쿠키의 Pate 옵션과 서버의 세부경로가 일치하는 경우 쿠키 전송
      • 설정된 경로를 포함하는 하위 경로 요청 시에도 쿠키 전송 가능
    3. MaxAge or Expires
      • 쿠키의 유효기간 설정 옵션
      • MaxAge: 쿠키가 유효한 시간을 초 단위로 설정
      • Expires: 쿠키의 유효 시점(날짜)까지 지정 가능
      • Session Cookie와 Persistent Cookie
        • Session Cookie: MaxAge 또는 Expires 옵션이 없는 쿠키로 브라우저 실행 시 임시로 사용 가능하며 브라우저 종료 시 해당 쿠키 삭제
        • Persistent Cookie: 브라우저의 종료와 관계 없이 MaxAge 또는 Expires에 설정된 유효시간동안 사용할 수 있는 쿠키
    4. Secure
      • 사용하는 프로토콜에 따른 쿠키 전송 여부를 결정하는 옵션
      • Secure 옵션이 true일 경우 HTTPS를 이용하는 경우에만 쿠키 전송 가능
    5. HttpOnly
      • 자바스크립트에서 브라우저 쿠키로의 접근 여부 결정
      • true로 설정된 경우 자바스크립트를 통해 쿠키에 접근 불가
      • false가 default이므로 이 경우 XSS 공격에 취약
    6. SameSite
      • CORS 요청 시 옵션과 메서드에 따라 쿠키 전송 여부 결정
      • 사용 가능한 옵션
        • Lax: CORS 요청 시 GET 메서드에 대해서만 쿠키 전송 가능
        • Strict: same-site인 경우에만 쿠키 전송 가능
        • None: 모든 메서드 요청에 대해 쿠키 전송 가능(단, 쿠키 옵션 중 Secure 옵션 필요)
  • Axios
    : 브라우저, Node.js, Promise API를 활용하는 HTTP 비동기 통신 라이브러리
    • Axios vs Fetch API

      AxiosFetch API
      써드파티 라이브러리로 별도의 설치 필요빌트인 API라 별도의 설치 필요x
      자동으로 JSON 데이터 형식으로 변환.json()메서드 사용해야 함
    • Axios 사용법

      • 설치: npm install axios
      • GET 요청: axios.get("url", [,config])
        : 첫번째 인자에는 url 주소, 두 번째 인자에는 옵션을 설정하며 옵션은 선택 사항

Session

Session👌🏼
Session이란 서버와 클라이언트 간 연결이 활성화된 상태를 말한다. 세션은 서버에 저장되며 데이터를 서버에서 관리한다. Session 이용 시 서버는 쿠키에 암호화된 Id만 부여한다.

  • Cookie&Session

    설명접속 상태 저장 경로장점단점
    Cookie쿠키는 그저
    http의 stateless를
    보완해주는 도구
    클라이언트서버의 부담을 덜어줌쿠키 그 자체는
    인증이 아님
    Session접속 상태를 서버가 가짐
    (Staetful)
    접속 상태와 권한 부여를 위해
    세션 아이디를 쿠키로 전송
    서버신뢰할 수 있는 유저인지
    서버에서 추가로 확인 가능
    하나의 서버에서만
    접속상태를 가지므로
    분산에 불리
    • Session의 한계
      • xss 공격에 취약한 cookie의 단점을 그대로 가짐
      • 서버에 부담을 줌
  • 세션 기반 인증(Session-based Authentication)

    <로그인 상황>
    서버: 사용자가 인증에 성공한 상태를 알고 있어야 함
    클라이언트: 인증 성공 증명 수단을 가지고 있어야 함

    1. 서버는 저장소에 세션을 저장
      • 세션: 사용자가 인증에 성공한 상태
    2. 세션과 함께 세션 아이디 생성
    3. 세션 아이디를 클라이언트에게 전달
    4. 로그인을 유지하기 위한 수단으로 쿠키를 사용, 쿠키에 서버에서 발급한 세션 아이디 저장
    5. 쿠키를 통해 세션 아이디가 서버에 전달
    6. 저장소에 해당 세션이 존재할 경우 서버는 해당 요청에 접근 가능하다고 판단

    <로그아웃 상황>
    서버: 세션 정보를 삭제해야 함(서버 → 세션이 저장)
    클라이언트: 쿠키를 갱신해야 함(클라이언트 → 세션 아이디가 담긴 쿠키가 저장)

    • 서버는 클라이언트의 쿠키를 임의로 삭제 불가
    • 단, set-cookie로 클라이언트에게 쿠키 전송 시 세견 아이디의 키 값을 무효한 값으로 갱신 가능
  • Express-session

    • 세션을 대신 관리해주는 Node.js 모듈
    • 세션을 위한 미들웨어로 express 서버에서 쉽게 세션을 위한 공간을 다룰 수 있도록 만들어 줌

🔆 Token

Hashing🔐

Hashing이란 암호화 방식 중 하나로 복호화가 불가능한 방식이다. Hashing은 해시 함수를 사용하여 암호화를 진행한다.

  • 해시 함수의 특징
    • 항상 같은 길이의 문자열 반환
    • 서로 다른 문자열을 입력 시 다른 결과값 출력
    • 동일한 문자열 입력 시 같은 결과값 출력

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

  • 레인보우 테이블: 해시 함수를 거치기 이전의 값을 알아낼 수 있도록 기록한 표로 보안상 위협이 될 가능성이 존재
  • 솔트: 해싱 이전 값에 임의의 값을 더해 혹시 모를 데이터 유출 상황을 대비하여 해싱 이전 값을 알아내기 어렵게 만드는 방법

해싱의 목적🤓
해싱은 민감한 데이터를 다루어야 하는 상황에서 데이터 유출 위험성은 낮추고 데이터의 유효성을 검증하기 위해 사용되는 방식으로 단방향 암호화 방식이다. 예를 들어, 사용자가 비밀번호를 입력하여 사이트에 접속할 경우 서버에서는 해싱한 값끼리 비교하여 일치 여부만 판단하기 때문에 비밀번호 유출 위험성을 줄일 수 있다.

Token

토큰 기반 인증(Token-based Authentication)
: 클라이언트에서 인증 정보를 보관하는 방법으로 고안

  • 토큰은 유저 정보를 암호화한 상태로 담을 수 있고, 암호화했기 때문에 클라이언트에 담을 수 있음

JWT🪙
JWT란 대표적인 토큰기반 인증으로 JSON 포맷으로 사용자에 대한 속성을 저장하는 웹토큰으로 권한 부여에 유용하게 사용된다.

  • JWT의 종류
    1. 액세스 토큰(Access Token)
      • 보호된 정보들에 접근할 수 있는 권한을 부여받는데 사용되는 짧은 유효기간을 가지는 토큰
    2. 리프레시 토큰(Refresh Token)
      • 새로운 액세스 토큰을 발급받을 수 있는 긴 유효기간을 가지는 토큰
  • JWT의 구조
    • Header
      • 토큰의 종류
      • 시그니처를 암호화할 알고리즘
    • Payload
      • 서버에서 활용 가능한 유저 정보
      • 너무 민감한 정보를 담는 것은 지양
    • Signature
      • 서버의 비밀키와 헤더에서 지정한 알고리즘을 사용하여 해싱

토큰기반 인증의 장점

1. Statelessness & Scalability (무상태성 & 확장성)

  • 서버가 클라이언트의 정보를 저장할 필요 없음
  • 클라이언트는 요청 시 헤더에 토큰을 포함하여 전송
    • 같은 토큰으로 여러 서버에서 인증 가능

2. 안정성

  • 암호화한 토큰 사용
  • 암호화한 키 노출할 필요 없음

3. 어디서나 생성 가능

  • 토큰을 확인하는 서버가 토큰을 생성할 필요 없이 어디서나 토큰 생성 가능

4. 권한 부여에 용이

  • 토큰의 Payload 안에 접근 가능한 정보를 지정 가능

🔆 OAuth

OAuth🤝
OAuth란 인증을 중개해주는 매커니즘을 말하는데 보안된 리소스에 액세스하기 위해 클라이언트에게 권한을 제공하는 프로세스를 단순화하는 프로토콜을 의미한다.

OAuth의 필요성

  • OAuth를 통해 해당 서비스가 외부서비스의 특정 자원에 접근할 수 있는 권한 획득
  • 보안상의 이점
    • 사용자의 민감한 정보가 직접 노출될 가능성 낮음
    • 사용자에게 인증 권한에 대한 허가를 구하기 때문에 안전하게 사용 가능

OAuth 사용 시 관련 용어

  • Resource Owner: 사용자이자 정보 제공자
  • Client: 보호된 리소스에 액세스하는 애플리케이션
  • Local Server: Client의 요청을 수락하고 응답할 수 있는 서버
  • Resource Server: 사용자의 정보를 저장하고 있는 서버
  • Authorization Server: 인증을 담당하고 있는 서버로 Access Token 발급
  • Authorization Grant: Client가 Access Token을 얻는 방법
    • Authorization Code Grant Type
    • Refresh Token Grant Type
  • Authorization Code: Access Token을 발급받기 위한 Code
  • Access Token: 보호된 리소스에 액세스 할 경우 사용되는 인증 토큰
  • Refresh Token: 발급받은 Access Token이 만료될 시 재발급을 받을 수 있도록 하는 Token

OAuth 인증 흐름

1. Authorization Code Grant Type
: Authorization Code를 통해 Access Token을 받는 방식

2. Refresh Token Grant Type
: Access Token이 만료된 경우 Refresh Token을 활용해 새로운 Access Token으로 교환하는 경우 사용

  • 사용자와의 추가 상호 작용 없이 Refresh Token을 통해 유효한 액세스 토큰 사용 가능

<오늘의 일기>
정말 웬만하면 어렵다고 하지 않기 위해 노력하는 편이지만 이번 유닛은 정말 어려웠다.. 백엔드 개발자가 아니더라도 흐름은 이해하고 있어야 하기에 열심히 공부했지만 이해하기 쉽지 않았다..ㅎ 이해하기 만만치 않은 유닛이었지만 페어분께서 많이 도와주신 덕분에 그래도 조금이나마 이해하며 넘어갈 수 있었던 것 같다. 나도 나중에는 누군가에게 도움이 될 수 있는 개발자로 성장할 수 있길..🙏

0개의 댓글