- Basic 인증
- 토큰 기반 인증
- JWT 사용 인증
- 스프링 시큐리티
- Bearer 인증
인증과 인가의 구현은 아키텍처 디자인과 밀접한 연관을 가진다.
상태가 없는 웹 어플리케이션에서 인증을 가장 간단하게 구현하려면 HTTP 요청에 아이디와 패스워드를 함께 전송하는 것
베이직 인증은 최초 로그인 후 HTTP 요청 헤더의 Authorization 부분에 아이디와 패스워드를 이어붙인 후 Base64로 인코딩한 문자열을 함께 전송한다
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
암튼 쓰기 힘들다 이말이야
토큰 : 사용자를 구별할 수 있는 문자열
토큰은 최초 로그인 시 서버가 생성하여 클라이언트에게 반환한다.
클라이언트는 이후 요청에 아이디와 패스워드 대신 토큰을 전달하여 인증된 사용자임을 나타낸다.
하지만 이것도 스케일 문제가 해결되지 않는다 🥲
그러면!! 어쩌라고!!
서버에서 전자서명된 토큰을 사용하면 인증에 따른 스케일 문제를 해결할 수 있다. 그게 바로 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"
}
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"
}
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)