HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
✍🏻
Learnary (learn - diary)
/
개발 초기 springboot security api 요청 가이드 라인

개발 초기 springboot security api 요청 가이드 라인

progress
Done
Tags
Spring
why?기본적으로 제공하는 방법을 활용임의적으로 설정한 인메모리 유저
 

why?

초기 개발에 들어가면 security 로그인 회원가입이 완벽하게 되어있지 않은 상태에서 진행해야 한다.
결국 나중에는 인증 부분이 있을 건데 이 부분을 생각하지 않고 무작정 개발에 들어가면 나중에 대공사가 되게 된다는 것을 많이 느꼇다.
 
모든 부분을 순차적으로 진행하지 않기에 초기 임의 설정이 필요하다고 느꼇고 이부분을 간단하게 다른 팀원들도 사용자가 있는 것처럼 비즈니스를 완성시킬 수 있을 것이다
 
물론 권한,인증제어를 모두 허용하는 설정으로 가도 되지만, 사용자임을 인식하고 현재 요청 보낸 사용자의 정보 기반으로 비즈니스 로직을 수행할 수 있는 부분이 다반사 이기 때문에 모두 허용하는 것은 대공사가 여전하게 된다.
 
 

기본적으로 제공하는 방법을 활용

일반적으로 이런 기본 요청을 만든 후에
notion image
 
요청을 보내면 401이 나올것이다.
curl -v http://localhost:8080/hello ----- response ----- curl -v http://localhost:8080/hello * Trying [::1]:8080... * Connected to localhost (::1) port 8080 > GET /hello HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/8.4.0 > Accept: */* > < HTTP/1.1 401 < Vary: Origin < Vary: Access-Control-Request-Method < Vary: Access-Control-Request-Headers < Set-Cookie: JSESSIONID=2844C9D7205A5D052BEF8D94B9D7BE39; Path=/; HttpOnly < WWW-Authenticate: Basic realm="Realm" < X-Content-Type-Options: nosniff < X-XSS-Protection: 0 < Cache-Control: no-cache, no-store, max-age=0, must-revalidate < Pragma: no-cache < Expires: 0 < X-Frame-Options: DENY < Content-Length: 0 < Date: Sat, 13 Jul 2024 05:42:19 GMT < * Connection #0 to host localhost left intact
 
 
초기 프로젝트에서 security 라이브러리를 넣고 실행하면 실행 로그 중에 이런 문구의 로그가 있다
 
Using generated security password: ae40743d-c403-4f37-962f-a29729bfd8cf
 
이 부분을 이용하여 요청을 하면 된다
curl -v -u user:${springboot log에서 확인하는 password} ${REQUEST_URL}
curl -v -u user:ae40743d-c403-4f37-962f-a29729bfd8cf http://localhost:8080/hello ---- response ---- * Trying [::1]:8080... * Connected to localhost (::1) port 8080 * Server auth using Basic with user 'user' > GET /hello HTTP/1.1 > Host: localhost:8080 > Authorization: Basic dXNlcjphZTQwNzQzZC1jNDAzLTRmMzctOTYyZi1hMjk3MjliZmQ4Y2Y= > User-Agent: curl/8.4.0 > Accept: */* > < HTTP/1.1 200 < Vary: Origin < Vary: Access-Control-Request-Method < Vary: Access-Control-Request-Headers < X-Content-Type-Options: nosniff < X-XSS-Protection: 0 < Cache-Control: no-cache, no-store, max-age=0, must-revalidate < Pragma: no-cache < Expires: 0 < X-Frame-Options: DENY < Content-Type: text/plain;charset=UTF-8 < Content-Length: 11 < Date: Sat, 13 Jul 2024 05:44:35 GMT < * Connection #0 to host localhost left intact hello world%
또 다른 방법이 있는데, 몇가지 변환 과정이 필요하다
  1. base 64로 인코딩
  1. AUTHORIZATION header를 추가하여 해당 value에 실어보내야 한다.
 
 
1) base64 인코딩 방법
echo -n user:${springboot log에서 확인하는 password} | base 64
>> echo -n user:ae40743d-c403-4f37-962f-a29729bfd8cf | base64 변환 결과 : dXNlcjphZTQwNzQzZC1jNDAzLTRmMzctOTYyZi1hMjk3MjliZmQ4Y2Y=
2) 헤더 추가 요청 방법
curl -H “${headername: value}:” ${REQUEST_URL}
 
curl -H "Authorization: Basic dXNlcjphZTQwNzQzZC1jNDAzLTRmMzctOTYyZi1hMjk3MjliZmQ4Y2Y" \ localhost:8080/hello >> 출력결과 : hello world
 
 

임의적으로 설정한 인메모리 유저

 
spring security는 기본적으로 UserDetailsService 에서 회원인지를 판단한다.
그래서 내가 설정한 사용자를 사용자로 인신하기 위해 서는 UserDetailsService 를 핸들링해야한다.
 
security 라이브러리 구현채에는 여러 종류가 있지만, 그중 인메모리 기반으로 내가 만든 사용자를 회원으로 취급할 것이다.
notion image
 
그리고 생각해야할 부분이! 바로 비밀번호 암호화 부분이다
security는 암호화를 반드시 해야하도록 기본적으로 설정되어 있다.
이 부분을 생각해서 사용자 암호화 부분을 제거하도록 임의적으로 설정할 수 있는데 NoOpPasswordEncoder 로 “나는 암호화 사용안하고 진행하겠다” 라고 해야한다.
 
초기 개발시 필요한 부분에서는 암호화로 큰 변경사항이 없기 때문에 굳이 필요하지 않다고 생각해서 암호화를 임의적으로 진행하지 않았다.
 
 
security config 설정
package com.travel.aroundthekorea.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.password.NoOpPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; @Configuration public class SecurityConfig { @Bean UserDetailsService userDetailsService() { // 내가 정의한 사용자를 사용자로 인신하게 만드는 것 var demoUser = User.withUsername("whyWhale") .password("aroundthekorea") .authorities("ROLE_USER") .accountExpired(false) .accountLocked(false) .build(); return new InMemoryUserDetailsManager(demoUser); } @SuppressWarnings("deprecation") // springsecurity 6.0 버전 이후로 de @Bean PasswordEncoder passwordEncoder() { return NoOpPasswordEncoder.getInstance(); } }
check point!
notion image
  • springsecurity 6.0 버전 이후로 NoOpPasswordEncoder 객체는 deprecated 되었다.
  • 일시적으로 팀원들과 초기 개발 협업할때 고정의 user를 암호화 없이 진행하기 위해서는 좋은 수단이라고 생각한다.
 
1) 기본 요청 방법
 
>> curl -v -u whywhale:aroundthekorea http://localhost:8080/hello
 
2) header를 포함하여 요청 방법
위 security 기본 로그인 한 사용자 설정 curl 명령어르 보내려면
 
  • base64 인코딩 방법
echo -n user:${} | base 64
>> echo -n whyWhale:aroundthekorea | base64 d2h5V2hhbGU6YXJvdW5kdGhla29yZWE=
  • 헤더 추가 요청 방법
curl -H “${headername: value}:” ${REQUEST_URL}
 
curl -H "Authorization: Basic d2h5V2hhbGU6YXJvdW5kdGhla29yZWE=" http://localhost:8080/hello >> 출력결과 : hello world
  • curl -v옵션 추가
curl -v -H "Authorization: Basic d2h5V2hhbGU6YXJvdW5kdGhla29yZWE=" http://localhost:8080/hello --- 출력결과 --- * Trying [::1]:8080... * Connected to localhost (::1) port 8080 > GET /hello HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/8.4.0 > Accept: */* > Authorization: Basic d2h5V2hhbGU6YXJvdW5kdGhla29yZWE= > < HTTP/1.1 200 < Vary: Origin < Vary: Access-Control-Request-Method < Vary: Access-Control-Request-Headers < X-Content-Type-Options: nosniff < X-XSS-Protection: 0 < Cache-Control: no-cache, no-store, max-age=0, must-revalidate < Pragma: no-cache < Expires: 0 < X-Frame-Options: DENY < Content-Type: text/plain;charset=UTF-8 < Content-Length: 11 < Date: Sat, 13 Jul 2024 07:42:24 GMT < * Connection #0 to host localhost left intact hello world%
 
 
setting(security): 데모 사용자 등록 및 요청 테스트