인증과 인가

김주언·2022년 6월 15일
0

TODO LIST

목록 보기
8/18
post-thumbnail
  • Basic 인증
  • 토큰 기반 인증
  • JWT 사용 인증
  • 스프링 시큐리티
  • Bearer 인증

  • 인증 (Authentication)
    사용자의 신원을 확인
  • 인가 및 권한 부여 (Authorization)
    신원이 확인된 사용자에게 리소스에 액세스할 수 있는 권한을 부여

인증과 인가의 구현은 아키텍처 디자인과 밀접한 연관을 가진다.


REST API 인증 기법

Basic 인증


상태가 없는 웹 어플리케이션에서 인증을 가장 간단하게 구현하려면 HTTP 요청에 아이디와 패스워드를 함께 전송하는 것

베이직 인증은 최초 로그인 후 HTTP 요청 헤더의 Authorization 부분에 아이디와 패스워드를 이어붙인 후 Base64로 인코딩한 문자열을 함께 전송한다

Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
  • 아이디와 패스워드 노출
  • 사용자 로그아웃 불가능
  • 사용자 계정정보 저장장소의 과부하 확률 ↑
    → DB를 좋은거 쓰면 안되나?
    • 💵 ❌
    • 그리고 서비스가 커지고 마이크로 서비스로 나눠지면 인증서버에 요청할 일이 많아진다.

암튼 쓰기 힘들다 이말이야

토큰 기반 인증

토큰 : 사용자를 구별할 수 있는 문자열

토큰은 최초 로그인 시 서버가 생성하여 클라이언트에게 반환한다.
클라이언트는 이후 요청에 아이디와 패스워드 대신 토큰을 전달하여 인증된 사용자임을 나타낸다.

  • 아이디와 패스워드 노출 x
  • 토큰 생성이 자유롭다
    - 사용자 인가 정보 또는 유효 시간 조정 가능

하지만 이것도 스케일 문제가 해결되지 않는다 🥲
그러면!! 어쩌라고!!

JWT (JSON Web Token)

서버에서 전자서명된 토큰을 사용하면 인증에 따른 스케일 문제를 해결할 수 있다. 그게 바로 JSON 웹 토큰~

이렇게 보인다

eyJraWQiOiJ1dURLVTMxZWRvTi0wd0xMUnl1TW1vbmtBdi1OaFEwejZhWmxjdTN5NU8wIiwiYWxnIjoiUlMyNTYifQ.eyJ2ZXIiOjEsImp0aSI6IkFULnVfT094R3pXd1RjRFlseGZwcDVYXzNxdVIwdlJuc25YbXdMZld0TDFjdG8iLCJpc3MiOiJodHRwczovL2Rldi04MTk2MzMub2t0YXByZXZpZXcuY29tL29hdXRoMi9kZWZhdWx0IiwiYXVkIjoiYXBpOi8vZGVmYXVsdCIsImlhdCI6MTU0NjcyNjIyOCwiZXhwIjoxNTQ2NzI5ODI4LCJjaWQiOiIwb2Fpb3g4Ym1zQktWWGt1MzBoNyIsInNjcCI6WyJjdXN0b21TY29wZSJdLCJzdWIiOiIwb2Fpb3g4Ym1zQktWWGt1MzBoNyJ9.fhZRWThFxhiS6Pgrup6hM08oSqDPd1JrZSDIH_blD5S20c2hQQ3D3RZyhNKMnYclyus_mo-H-mS-Ak3YzM8S0JwZ8m3Vid4smW953peBMnmBNotAE--yE0toc2dIUG3BWQR34hah253bKmp17Yh6bWGwH60oQxnuM_NVUpa-NJMBc6-Mu5ra0lKfr60ne9-jKVFcavd9ZnVTLiug_sXFlhxgaQm4V_hhcvcLSwCXTiIcQsJkI0rP7WuVvjYVyK_sPeW3A44_T5qhyDR_E_mk1rHORlkMYGPg34mcwob5iA7alNZOnzN_7ApcbylDbK5KS1umBqqevtghEyjOEWQQmQ

JWT는 JSON 형태로 된 토큰이고 {header}.{payload}.{signature} 로 구성되어있다

Base64URL-encoded된 JSON 객체

{
  "typ": "JWT",
  "alg": "HS256"
}
  • typ : 토큰 타입
  • alg : 토큰 서명 발행에 사용된 알고리즘 종류

payload

Base64URL-encoded된 JSON 객체

{
 "ver": 1,
 "jti": "AT.u_OOxGzWwTcDYlxfpp5X_3quR0vRnsnXmwLfWtL1cto",
 "iss": "https://dev-819633.oktapreview.com/oauth2/default",
 "aud": "api://default",
 "iat": 1546726228,
 "exp": 1546729974,
 "cid": "0oaiox8bmsBKVXku30h7",
 "scp": [
  "customScope"
 ],
 "sub": "0oaiox8bmsBKVXku30h7"
}
  • sub : (subject) 토큰의 소유자이며 유일한 식별자여야한다.
  • iss : 토큰 발행 주체
  • iat : 토큰 발행 날짜와 시간
  • exp : 토큰 만료 시간

signature

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret
)
  • iss(issuer)가 발행한 서명으로 유효성 검사 시 사용
profile
학생 점심을 좀 차리시길 바랍니다

0개의 댓글