유저 기능/시스템
: 유저를 특징 짓고, 권한을 확인하는 모든 기능
- 인증(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 패턴
목적 : 각각의 역할과 관심사를 분리함으로써 모델, 뷰, 컨트롤러가 독립적으로 작동하도록 하는 것
' 관심사의 분리 ' : 코드를 다양한 부분으로 나누어, 각 부분이 특정한 역할에 집중하도록 하는 소프트웨어 디자인 원칙
- 모델 : 데이터베이스와 상호작용 및 비즈니스 로직을 관리
- 뷰 : 레이아웃과 화면 처리
- 컨트롤러 : 모델과 뷰로 명령 전달
+) 서비스 : 비즈니스 로직 → 따라서 모델은 데이터베이스의 역할 하나만 담당할 수 있게함
암호화 : 양방향 알고리즘 : 특정 키를 상요하여 원본 데이터를 다시 원상복구 할 수 있는 형태로 변환
해싱 : 단방향 알고리즘 : 해시 함수를 사용하여 원본 데이터를 고정 길이의 고유한 문자열로 변환하며, 원본 데이터로 되돌릴 수 없음
솔트 : 해킹을 방지하기 위해 만들어짐. 사용자의 비밀번호와 솔트를 결합해서 해시값을 계산하여 적용. 해시 값과 함께 데이터베이스에 저장됨
- 사용자의 로그인 시도시 입력된 비밀번호에 대해 저장된 솔트를 사용하여 해시값을 다시 계산
-- 사용자가 일반적인 비밀번호를 사용해도 각각의 해시값이 고유해지는 효과
다이제스트(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 |