sec06. 인증과 인가

sngmin·2024년 2월 18일

01. 인증과 인가

📌 인증 vs 인가
인증

  • Authentication
  • 사용자가 누구인지 확인
  • ex. 로그인, 회원가입

인가

  • Authorization
  • 권한을 확인
  • ex. 내가 쓴 글만 수정

클라이언트가 서버에 아이디/비밀번호 보내면 서버에서 반응을 함.
한 번 인증을 했다고 하면, 아이디와 비밀번호를 매번 보내야하는지에 대한 의문이 발생하는데
이때 사용하는것이 JWT(이후 강의에서 설명)

서버에서 JWT 만들어서 보내줌(JWT는 Access Token이라고 생각하면 된다!)
이후 client가 Access Token 사용해서 통신하게 됨.

인증 단계

  • 사용자 로그인
  • 서버는 회원가입한 회원인지 확인
  • 서버가 사용자 정보가 담긴 Access Token 생성

인가 단계

  • 사용자(프런트)는 요청 시 Access Token을 포함
  • 서버는 Access Token을 복호화
  • 해당 API를 사용할 수 있는지 확인

02. JWT, Session, Cookie

세 가지 모두 인증, 인가에 사용되는 도구.

  • <key, value> 로 브라우저에 저장
  • 보안이 허술함
  • 브라우저 간 공유 X

다른 컴퓨터로 로그인하거나 다른 브라우저로 로그인한다거나 했을 때 공유되지 않는다는 문제점
➡️ Cookie + Session

Session

  • 클라이언트가 서버에게 아이디/비밀번호 보냄
  • 서버는 서버 컴퓨터 안의 임시 저장장소 Session Storage에게 회원 정보 생성을 요청
  • 서버가 발급받은 Session ID를 클라이언트에게 전달

💡 Cookie + Session
클라이언트는 전달받은 Session ID를 쿠키에 저장하고 다음부터는 쿠키를 서버에게 전달할 수 있게 됨

BUT

  • 정보 탈취 시, storage 초기화 하면 다른 사용자도 재로그인해야함
  • http의 stateless 위배 (🤔)

JWT

  • https://jwt.io/
  • Header, Payload, Signature로 구성
  • key를 통해 발급/유효성 검사 진행
  • 만료기한 설정 가능
  • 비대칭 키 암호화 가능


클라이언트가 아이디/비밀번호 보내면 서버에서 검증 후 유저의 정보가 담긴 JWT를 전달해줌
보안을 위해 같은 정보로 두 개의 토큰 만듦
Access Token은 만료 기한 짧게, Refresh Token은 일주일 정도의 기간으로

03. 간단한 암호화 설명

비밀번호 서버에 보내면 서버에서는 비밀번호를 가공(암호화)해서 저장함.
이럴 때 쓰는 암호화 방식은 크게 두 가지, 양방향 암호화와 단방향 암호화

양방향 암호화

  • 양쪽에서 둘 다 복호화 가능
  • 대칭키 암호화
  • 비대칭키 암호화

    대칭 키암호화에서는 암호화와 복호화 모두에서 같은 키를 사용, 비대칭키 암호화에서는 다른 키 사용.

단방향 암호화

  • 암호화만 가능
  • ex. 비밀번호는 암호화되어서 저장되었고 다시는 되돌릴 수 없음 -> 그렇기 때문에 잃어버리면 재설정 해야하는 것

04. bcrypt를 통한 비밀번호 생성

Bcrypt

  • 강력한 해시 메커니즘(강력한 암호화 가능)
  • 여러 언어에서 사용 가능
$yarn add bcrypt
import bcrypt from 'bcrypt';

dotenv.config(); // 환경 변수를 process.env로 접근할 수 있게 함
const hashedPassword = await bcrypt.hash(password, process.env.PASSWORD_SALT);

const user = await Prisma.user.findUnique({
	where: {
    	email,
    }
});
const isCorrect = await bcrypt.compare(password, user.password);

🚨 Prisma 듣고 다시.. (2/18)

0개의 댓글