CodeIt

5주차

codingtori 2024. 8. 5. 17:04

유저 기능/시스템

: 유저를 특징 짓고, 권한을 확인하는 모든 기능

 

- 인증(authentication)

  : 서버가 리퀘스트를 보낸 사용자가 누구인지를 파악하는 기능

  로그인 수행 시 서버가 인증서(?)를 줌. 이후의 요청부터는 요청과 함께 이를 같이 전달하여 서버가 누가 요청했는지 알 수 있도록 함.

   - 세션 기반 인증 과 토큰 기반 인증으로 나뉨

 

- 인가(authorization)

  : 리퀘스트가 어떤 권한이 있는지 판단


클라이언트가 서버에게 인증서 받고/전달하는 방법

 

쿠키인증

쿠키 : 서버 리스폰스나, 클라이언트 코드에 따라 브라우저에 저장되는 작은 단일의 문자열 파일들 ; 이름 = 값; 속성 으로 구성

        : 브라우저에 저장됨

          ① 클라이언트 코드

              : body에 인증서 추가해서 클라이언트에 보내줌. javascript 코드로 이를 직접 저장함. 필요할 때 코드로 읽어옴.

               - 저장한 인증서를 Authorization 헤더를 통해서 서버로 보냄 ' Authorization: 인증서 ' → 브라우저가 자동으로 해주지 않음

              Authorization 헤더 인증 장점

              - 리퀘스트에 인증서를 붙일지 안 붙일지 선택 가능

              - 서로 다른 루트 도메인 사이 인증 가능

          ② 서버 리스폰스

              : 리스폰스에 Set-cookie 헤더를 통해 인증서를 클라이언트에 저장하고, request 의 cookie 헤더를 통해 서버로 다시 보냄

              - 같은 루트 도메인 사이에서는 쿠키가 공유될 수 있다

              - 쿠키의 저장과 전송은 브라우저에서 자동으로 해줌

 

쿠키 보안 설정

① Secure

HTTPS (보안이 강화된 HTTP)를 사용할 때만 클라이언트에서 서버로 쿠키가 보내짐

HTTPS 에서는 항상 리퀘스트와 리스폰스가 암호화되기 때문에 정보 유출 줄일 수 있음

Set-Cookie: cookie_name=cookie_value; Secure;

 

②HttpOnly

클라이언트가 자바스크립트 코드로 해당 쿠키에 접근할 수 없음

 

③SameSite

Cross site request forgery (CSRF 또는 XSRF) 공격 예방

: 일반 사이트 A와 악의적 사이트 B가 있을 때, B 웹 페이지에서 브라우저에 저장된 쿠키를 가지고 사이트 A 서버로 리퀘스트를 보내는 공격

 

 

※ 비밀번호 같이 민감한 정보는 쿠키나 로컬 스토리지에 절대 저장하지 않는다


세션 : 서버가 저장하는 사이트 방문자들에 대한 기록

        - 쿠키에 session_id를 보냄

        →  세션이 만료되면 기존의 세션 아이디는 사용못함. 새로 받아야 됨

※ 세션 기반 인증의 장점 : 서버에서 세션 데이터를 따로 관리를 하기 때문에 특정 세션을 손쉽게 무효화 할 수 있음

 

 

토큰 기반인증 : 인증 토큰 사용 

→ 서버만 알고 있는 문자열인 비밀 키를 사용해서 암호화

 

*인증 토큰 : 유저에 대한 정보를 암호화한 문자열

→ 리퀘스트가 올때마다 저장 및 확인하지 않고도 리퀘스트를 보낸 유저 확인 가능 : 토큰 자체 해석해서 사용

 

사용방법:

클라이언트 직접 자바스크립트로 저장하고, 인증이 필요한 것에 접근할 때 저장한 인증서에 접근해서 이를 Authorization헤더에 붙여줘야함 

Authorization: Bearer '문자열'

Authorization 헤더는 인가가 아니라 인증을 위한 헤더

 

토큰: JWT(JSON Web Token) 가 보편적

 

JWT(JSON Web Token)

3가지로 구성됨 : Header , Payload , Signature

1) Header : 토큰 자체에 대한 데이터 저장 _ 암호화에 사용된 알고리즘, 토큰 형식

2) Payload : 토큰이 실질적으로 저장하려는 정보 _ 저장하고 싶은 데이터 종류의 제한이 없고 최대한 짧게 저장

    exp : 만료시간 / iat : 발급 시간 / jti : 토큰 고유값 / 인증하려는 유저

3) Signature : 토큰을 믿을 수 있는지 확인하기 위한 데이터 저장 _ HS256(Header와 Payload를 인코딩한 값, 시크릿 키)

    → 직접 만든 signature와 JWT의 signature이 같은 지 비교

 

이 3가지는 . 을 사이에  두고 이어짐

Header와 Payload는 단순히 인코딩만 되어있고 암호화 되어있지 않다!


기본 인증 (인증서 사용하지 않는 인증방법)

Authorization: Basic email:password

base64로 인코딩함

 

+) 인코딩: 데이터를 여러 곳에서 쉽고 안정적이게 사용하기 위해 통일된 형식으로 바꾸는 것

웹 -- base64url 사용


Access 토큰 : 유저에게 특정 권한을 주기 위한 목적으로 사용

→ access 토큰의 문제를 해소하기 위해 refresh 토큰을 같이 사용

refresh 토큰 : access 토큰이 만료됐을 때, 이메일 비밀번호를 사용하지 않고 access 토큰을 새롭게 발급받는데 사용되는 토큰

 

슬라이딩 세션 (Sliding session) : 사용자가 활동 중일 때 해당 토큰의 만료시간을 연장하는 것

ex) 토큰 재발급 요청 시 refreshToken 과 accessToken 을 함께 재발급 


여러 서비스 사이에서 작동

 

접근 권한 위임 : 한 서비스가 다른 서비스에 있는 보호된 리소스에 대한 접근 권한을 위임하거나 받는 기능

 

OAuth(Open Authorization) : 개방형 접근 권한 위임 표준

OAuth 워크플로우 : 접근 권한을 특정 방식으로 주고 받기 위해서 각 주체들이 해야되는 작업들과 그 순서

- 종류가 여러가지 있다 (Authorization Code 플로우, Implicit 플로우...)

Authorization Code : 유저 본인이 권한 위임을 원한다는 걸 확인시켜주는 데이터

Scope : 인가 서버로부터 넘겨받으려는 권한의 범위

 

권한 인증

OpenID Connect (OIDC) 프로토콜 : OAuth + 인증 : 한 사이트의 아이디로 여러 사이트에서 인증받을 때 사용

ex) 소셜 로그인(카카오 로그인) 등

 

 

+) Passport : Node.js 에서 사용자 인증을 간편하게 구현할 수 있도록 도와주는 미들웨어

                     이는 Passport 자체로 로그인을 하는 것이 아니라, Passport 에서 지원하는 전략과 함께 사용하여 구현함


MVC 패턴

MVC 패턴을 구조화한 그림 (출처: 코드잇)

목적 : 각각의 역할과 관심사를 분리함으로써 모델, 뷰, 컨트롤러가 독립적으로 작동하도록 하는 것

' 관심사의 분리 ' : 코드를 다양한 부분으로 나누어, 각 부분이 특정한 역할에 집중하도록 하는 소프트웨어 디자인 원칙

- 모델 : 데이터베이스와 상호작용 및 비즈니스 로직을 관리

- 뷰 : 레이아웃과 화면 처리

- 컨트롤러 : 모델과 뷰로 명령 전달

 

+) 서비스 : 비즈니스 로직 → 따라서 모델은 데이터베이스의 역할 하나만 담당할 수 있게함


암호화 : 양방향 알고리즘 : 특정 키를 상요하여 원본 데이터를 다시 원상복구 할 수 있는 형태로 변환

해싱 : 단방향 알고리즘 : 해시 함수를 사용하여 원본 데이터를 고정 길이의 고유한 문자열로 변환하며, 원본 데이터로 되돌릴 수 없음

 

솔트 : 해킹을 방지하기 위해 만들어짐. 사용자의 비밀번호와 솔트를 결합해서 해시값을 계산하여 적용. 해시 값과 함께 데이터베이스에 저장됨

- 사용자의 로그인 시도시 입력된 비밀번호에 대해 저장된 솔트를 사용하여 해시값을 다시 계산

-- 사용자가 일반적인 비밀번호를 사용해도 각각의 해시값이 고유해지는 효과

다이제스트(digest) : 해시 알고리즘에서 생성된 해시값

 

키 파생함수 : 다이제스트를 생성할 때 솔팅과 키 스트레칭을 반복하며 솔트와 패스워드 외에도 입력 값을 추가하여 공격자가 쉽게 다이제스트를 유추할 수 없도록 함

- PBKDF2 , bcrypt ( + 솔트횟수 = saltRounds ) , scrypt , Argon2 ...


 

'CodeIt' 카테고리의 다른 글

8주차 - Typescript 시작하기  (0) 2024.09.16
자바스크립트 기본 다지기  (0) 2024.09.16
4주차  (0) 2024.07.26
데이터베이스 사용하기  (1) 2024.07.17
3주차  (0) 2024.07.13