인증과 인가

깡깡·2021년 8월 22일
0

토니의 10분 테코톡 인증과 인가 영상을 보고 정리한 글 입니다.

사전 지식

-서버와 클라이언트는 HTTP를 통해 통신한다.
-HTTP의 특성 중 한가지 무상태성(Stateless) : 서버는 클라이언트에서 온 요청과 그 다음 요청에 대해서 연관관계가 없다고 생각하고 처리한다.

인증?

-(식별가능한 정보로) 서비스에 등록된 유저의 신원을 입증하는 과정

1.Request Header 활용하기

  • 브라우저에서 회원의 ID와 PW를 BASE64를 통해 인코딩을 한 후 서버로 로그인 요청을 보낸다.
  • 서버에서 DB 체킹을 하고 그 후 OK sign을 보내줌

문제점!!!

  • 사용자가 매번 로그인을 해야한다.(글을 쓰고, 글을 수정하고 등등...)

2.Browser 활용하기

  • 브라우저의 스토리지의 힘을 빌림
    스토리지의 종류: 로컬 스토리지 ,세션 스토리지, 쿠키
    -쿠키에 ID와 PW를 넣고 사용자가 인증이 필요한 요청을 보낼 때마다 쿠키를 함께 보내줌

문제점!!!

  • 보안상의 문제 해커가 쉽게 정보를 탈취할 수 있음.

3.Session 활용하기

  • 세션은 인증된 사용자의 식별자와 랜덤한 문자열로 SessionID를 만들어서 응답의 헤더와 함께 클라이언트에게 보내줌.
  • 세션의 만료기간을 지정해줄 수 있고 서버에서 세션을 삭제하면 이용할 수 없게되어 안전함.

문제점!!!

  • 로드 밸런서를 사용할 시, 각각의 서버가 세션을 관리하기 때문에 처음 인증한 서버가 아닌 다른 서버에 요청할 시 요청이 거부됨.
    -> 세션 스토리지를 통해 해결함(서버들의 모든 세션을 세션 스토리지에서 관리함)
    하지만 클라이언트의 수가 많아져 요청이 증가할 시 세션 스토리지에 과부하가 걸림.

4.JWT 활용하기

JWT?

  • 시크릿 키를 사용해서 JWT를 만들어내고 인증 과정을 거친다.
  • JWT는 해독이 쉽기 때문에 중요한 정보를 담지 않는다.
  • 로그인 시 시크릿 키를 이용해서 토큰을 만들어냄
    😝 JWT의 장점
    ▶️ 무상태(stateless), 확장성이 있다. 기존 서버에 세션을 저장하는 방식에서 서버 여러대를 사용하여 요청을 분산하였다면 어떤 유저가 로그인했을 때 그 유저는 처음 로그인한 서버에만 요청을 내보내도록 설정해야합니다. 하지만 토큰을 사용하면 토큰 값만 알고 있다면 어떤 서버로 요청이 들어가던 상관이 없습니다. 즉, 세션스토리지가 필요없다!

▶️ 보안성 쿠키를 전달하지 않아도 되므로 쿠키를 사용함으로써 발생하는 취약점이 사라집니다.

▶️ 여러 플랫폼 및 도메인 어플리케이션 규모가 커지면 여러 디바이스를 호환 시키고 더 많은 종류의 서비스를 제공합니다. 토큰을 사용한다면 그 어떤 디바이스에서도 그 어떤 도메인에서도 토큰만 유효하다면 요청이 정상적으로 처리 됩니다.

😫 JWT의 단점
▶️ 길이 claim에 넣는 데이터가 많아질 수록 JWT토큰이 길어집니다. API호출 시 매 호출마다 토큰 데이터를 서버에 전달해야 하는데 길이가 길다는 것은 그만큼 네트워크 대역폭 낭비가 심할 수 있습니다.

▶️ 보안 JWT는 기본적으로 Payload에 대한 정보를 암호화 하지 않습니다. 단순히 BASE64로 인코딩만 하기 때문에 중간에 패킷을 가로채거나 기타 방법으로 토큰을 취득했으면 디코딩을 통해 데이터를 볼 수 있습니다. 그래서 JWE(JSON Web Encryption)를 통해 암호화 하거나 중요데이터를 Payload에 넣지 말아야 합니다.

인가?

  • 인증된 사용자에 대한 자원 접근 권한을 확인하는 것
profile
개발세발자

0개의 댓글